๊นจ์•Œ ๊ฐœ๋… ๐Ÿ“‘/๊ธฐํƒ€

์ปดํŒŒ์ผ ๊ด€๋ จ ์šฉ์–ด ์ •๋ฆฌ

interfacer_han 2026. 1. 6. 14:46

#1 ์ปดํŒŒ์ผ ์ด์•ผ๊ธฐ

#1-1 ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ธ๊ฐ„์˜ ์‚ฌ๊ณ ์™€ ์˜๋„๋ฅผ ๊ธฐ๊ณ„(CPU)๊ฐ€ ์ดํ•ดํ•˜๊ณ  ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ฒˆ์—ญํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

 

#1-2 ์†Œ์Šค ์ฝ”๋“œ (Source Code)

์ธ๊ฐ„์˜ ์‚ฌ๊ณ ์™€ ์˜๋„๋ฅผ ๊ธฐ๊ณ„๊ฐ€ ์˜คํ•ด ์—†์ด ์ดํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก, '์ปดํŒŒ์ผ'์„ ์—ผ๋‘์— ๋‘” ์—ฌ๋Ÿฌ ์•ฝ์†(๊ณ„์•ฝ)์— ๋งž์ถฐ ์“ด ๊ธ€.

 

#1-3 ์ปดํŒŒ์ผ (Compile)

๋จผ์ € ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์ง€์ผœ์•ผ ํ•  ์•ฝ์†์„ ๊ฒ€์‚ฌํ•œ ๋‹ค์Œ ์†Œ์Šค ์ฝ”๋“œ์— ๋‹ด๊ธด ๊ธ€์“ด์ด์˜ ์˜๋„๋ฅผ ๋ณด์กดํ•˜๋ฉด์„œ (์ƒ๋Œ€์ ) ๊ณ ๊ธ‰ ์–ธ์–ด๋ฅผ, (์ƒ๋Œ€์ ) ์ €๊ธ‰ ์–ธ์–ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ.

 

์˜ˆ์‹œ

์˜ˆ1: example.c → example.s
์˜ˆ2: example.s → example.o
์˜ˆ3: example.c → example.o
์˜ˆ4: example.java → example.class

 

CPU์™€์˜ ๊ด€๊ณ„

์ปดํŒŒ์ผ์€ ๊ถ๊ทน(์ตœ์ข…)์ ์œผ๋กœ CPU๊ฐ€ ์‹คํ–‰ํ•  ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋Š” ๋ชฉ์ ์˜ ํ–‰์œ„๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋งํ•ด, CPU๊ฐ€ ์ด ์„ธ์ƒ์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ปดํŒŒ์ผ ๋˜ํ•œ ์กด์žฌ ์˜๋ฏธ๋ฅผ ์žƒ๋Š”๋‹ค.

 

#1-4 ๋งํ‚น (Linking)

์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋“ค์„ ์„œ๋กœ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐํ• ์ง€ ํ™•์ •ํ•œ ๋‹ค์Œ, ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ ์ง€์ (entry point)์„ ์ •์˜ํ•˜๋Š” ๋“ฑ์˜ ์—ฌ๋Ÿฌ ์ถ”๊ฐ€ ์ž‘์—…์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์™„์„ฑํ•˜๋Š” ๊ฒƒ. ์‹ค๋ฌด์—์„œ๋Š” ๋งํ‚น์ด ์ปดํŒŒ์ผ์— ํฌํ•จ๋œ ๊ฐœ๋…์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋งํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

 

์˜ˆ์‹œ

// main.c ํŒŒ์ผ

int add(int, int);   // ์„ ์–ธ๋งŒ ์žˆ์Œ

int main() {
    int result = add(1, 2);
    return result;
}

---
// add.c ํŒŒ์ผ

int add(int a, int b) {
    return a + b;
}

main.c์™€ add.c๋ฅผ ๊ฐ๊ฐ ์ปดํŒŒ์ผํ•ด์„œ, ๊ฐ๊ฐ main.o์™€ add.o๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. main.o์™€ add.o๋ฅผ ์žฌ๋ฃŒ๋กœ ๋งํ‚น์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋žจ(๊ฐ€๋ น example.exe)์ด ํŠ€์–ด๋‚˜์˜จ๋‹ค.

 

์˜ˆ์‹œ์ฒ˜๋Ÿผ ๋งํ‚น์˜ ์žฌ๋ฃŒ๊ฐ€ 2๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ผ 1๊ฐœ์ธ ๊ฒฝ์šฐ๋Š” ์–ด๋–จ๊นŒ? ๋งํ‚น์ด ํ•„์š” ์—†์„๊นŒ? ์•„๋‹ˆ๋‹ค. ๋งํ‚น์€ ์ฐธ์กฐ ๊ด€๋ จ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๊ณ , ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ ์ง€์  ์ •์˜์™€ ๊ฐ™์€ ์—ฌ๋Ÿฌ ์„ธ๋ถ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

#2 ๋ฐ”์ด๋„ˆ๋ฆฌ ์ด์•ผ๊ธฐ

#2-1 ์ด์ง„ ๋ฐ์ดํ„ฐ์™€ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ

binary: (ํ˜•์šฉ์‚ฌ) 2์ง„๋ฒ•์˜ 

๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” 2์ง„๋ฒ•์ด๋ผ๋Š” ์˜๋ฏธ๋‹ค. ์ฆ‰, 0๊ณผ 1๋งŒ ์“ด๋‹ค๋Š” ๋ง์ด๋‹ค.

 

์ด์ง„ ๋ฐ์ดํ„ฐ
= binary data
= binary (๋ฐ”์ด๋„ˆ๋ฆฌ)

์ด์ง„ ๋ฐ์ดํ„ฐ๋Š” '0๊ณผ 1๋กœ ํ‘œํ˜„๋œ ์ •๋ณด'๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด cใ†java ๋“ฑ์˜ ์†Œ์Šค ์ฝ”๋“œ ํŒŒ์ผ, class ํŒŒ์ผ์ฒ˜๋Ÿผ ์ปดํŒŒ์ผ์€ ํ–ˆ์ง€๋งŒ ์•„์ง ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋Š” ์•„๋‹Œ ์ฝ”๋“œ, JPGใ†MP3 ๋“ฑ ๊ฐ์ข… ํŒŒ์ผ, ๋™๊ตด ๋ฒฝ์— ์ƒˆ๊ฒจ์ง„ "01011010..." ๋“ฑ์ด ์žˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ๋Š” ํ…์ŠคํŠธ ํ˜•ํƒœ์ด๋ฏ€๋กœ ์ด์ง„ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ด๋–ค ๋ฌธ์ž๋„ ๋””์Šคํฌ์™€ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋  ๋•Œ ๊ฒฐ๊ตญ 0๊ณผ 1๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ง„ ๋ฐ์ดํ„ฐ๋‹ค. ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ '๋ฐ”์ด๋„ˆ๋ฆฌ'๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•œ๋‹ค.

 

๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ
= binary code, binary language
= ๊ธฐ๊ณ„์–ด

์–ด๋–ค CPU๊ฐ€ '์ง์ ‘ ์‹คํ–‰ํ•  ๋ช…๋ น'์œผ๋กœ ๋ฐ›์•„๋“ค์ด๋Š” ์ด์ง„ ๋ฐ์ดํ„ฐ(CPU์— ๊ทธ๋Œ€๋กœ ๋•Œ๋ ค๋ฐ•์•˜์„ ๋•Œ CPU๊ฐ€ ์ •์ƒ ์ž‘๋™ํ•ด์•ผํ•˜๋Š” ์ฝ”๋“œ)๋ฅผ ์˜๋ฏธํ•œ๋‹ค. '๊ธฐ๊ณ„์–ด'๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด x86 ๊ธฐ๊ณ„์–ด, x86-64 ๊ธฐ๊ณ„์–ด, 8086 ๊ธฐ๊ณ„์–ด ๋“ฑ์ด ์žˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋Š” #1-3์—์„œ ๋งํ•œ '์ €๊ธ‰ ์–ธ์–ด'์˜ '๊ทน๋‹จ'์ด๋‹ค.

 

#2-2 ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ์˜ ํ‘œ๊ธฐ ํ˜•์‹

์ด์ง„์ˆ˜(bit string) ํ‘œํ˜„ ๋ฐฉ์‹

0100110010...

0๊ณผ 1์„ ๋น„ํŠธ ๋‹จ์œ„(bit-level)๋กœ ๋‚˜์—ดํ•œ ๋ฐฉ์‹์ด๋‹ค.

 

16์ง„์ˆ˜(hexadecimal) ๋คํ”„ ํ‘œํ˜„ ๋ฐฉ์‹

b8 78 56 34 12...

์ด์ง„์ˆ˜(bit string) ํ‘œํ˜„์„ 8๋น„ํŠธ๋งˆ๋‹ค ๋Š์–ด์„œ, 16์ง„์ˆ˜ 2์ž๋ฆฌ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๊นŒ์ง€ ๋””๋ฒ„๊น…ํ•ด์•ผ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์˜ ๊ฐ€๋…์„ฑ ์ฆ๋Œ€๋ฅผ ์œ„ํ•œ ํ˜•์‹์ด๋‹ค. 8๋น„ํŠธ๋งˆ๋‹ค ๋Š๋Š” ๊ฒŒ ์™œ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ์— ๋„์›€์ด ๋ ๊นŒ? CPU๊ฐ€ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๋Š” ๋‹จ์œ„์ธ word๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ byte(= 8bit)์˜ ๋ฐฐ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. word๊ฐ€ byte์˜ ๋ฐฐ์ˆ˜๋กœ ์„ค๊ณ„๋œ ์ด์œ ๋Š” #3-1์— ๋‚˜์˜จ๋‹ค.

 

#2-3 ISA (Instruction Set Architecture, ๋ช…๋ น์–ด ์ง‘ํ•ฉ)

๋ฐฉ๊ธˆ, CPU๊ฐ€ ๋ช…๋ น์œผ๋กœ ๋ฐ›์•„๋“ค์ด๋Š” ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋ผ๊ณ  ํ–ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ช…๋ น์œผ๋กœ ๋ฐ›์•„๋“ค์ธ๋‹ค๋Š” ๋ง์€, ์ผ๊ด€์„ฑ์ด ์กด์žฌํ•œ๋‹ค๋Š” ๋ง์ด๊ธฐ๋„ ํ•˜๋‹ค. ๋‹น์—ฐํ•˜๊ฒ ์ง€๋งŒ, CPU์— ์–ด๋–ค ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ A๋ฅผ ์–ด์ œ ๋„ฃ์—ˆ์„ ๋•Œ์™€ ์˜ค๋Š˜ ๋„ฃ์—ˆ์„ ๋•Œ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•  ํ…Œ๋‹ˆ ๋ง์ด๋‹ค.

 

๊ทธ ์ผ๊ด€์„ฑ ์žˆ๋Š”, (CPU๊ฐ€ ๋”ฐ๋ผ์•ผ ํ• ) ๋ช…๋ น ์ฒด๊ณ„๋ฅผ ISA๋ผ๊ณ  ํ•œ๋‹ค. ISA๋Š” ์—ฌ๋Ÿฌ ์ข…๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉฐ CPU๋งˆ๋‹ค ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ISA๊ฐ€ ๋‹ค๋ฅด๋‹ค. ๊ฐ€๋ น ๋ง์…ˆ ์—ฐ์‚ฐ์„ ํ•˜๋Š” ๋ช…๋ น์–ด, CPU๊ฐ€ ๋ณด์œ ํ•œ ์–ด๋–ค ๋ ˆ์ง€์Šคํ„ฐ์— ์–ด๋–ค ๊ฐ’์„ ์ €์žฅํ•˜๋ผ๋Š” ๋ช…๋ น์–ด ๋“ฑ์€ ๊ฐ™์€ ISA๋ผ๋ฉด ๋ฐ˜๋“œ์‹œ ๋˜‘๊ฐ™๊ณ , ๋‹ค๋ฅธ ISA๋ผ๋ฉด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

 

#2-4 ABI (Application Binary Interface, ํ”„๋กœ๊ทธ๋žจ ์ด์ง„ ์ธํ„ฐํŽ˜์ด์Šค)

๋ณต์ˆ˜์˜ ์ฝ”๋“œ๋“ค์„ ๊ฐ๊ฐ ์ปดํŒŒ์ผํ•  ๋•Œ, ๊ฐ ์ปดํŒŒ์ผ ์‚ฐ์ถœ๋ฌผ์ด CPU์—์„œ ์„œ๋กœ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ํ˜ธํ™˜๋˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ทœ์•ฝ์ด๋‹ค. ์ด๊ฒŒ ๋ฌด์Šจ ๋ง์ผ๊นŒ? CPU ์ž…์žฅ์—์„œ ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค. CPU๋Š” "์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•œ ๋‹ค์Œ ๊ทธ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์–ด๋–ค ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅํ•ด์•ผ(must) ํ•˜๋Š”๊ฐ€?" ๋”ฐ์œ„์˜ ๊ทœ์น™์ด ์—†๋‹ค. ํŠน์ • ๋ ˆ์ง€์Šคํ„ฐ์— ์–ด๋–ค ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ช…๋ น์–ด(⊂ ISA)๋Š” ์žˆ๊ฒ ์ง€๋งŒ, ๊ทธ๊ฑด ๋‹น์œ„(must)์™€๋Š” ์•„๋ฌด๋Ÿฐ ์—ฐ๊ด€์ด ์—†๋‹ค. ์ฆ‰ CPU๋ผ๋Š” '๊ณต์šฉ ๊ณต๊ฐ„'์—์„œ ์ง€์ผœ์•ผ ํ•  ๊ทœ์น™์„ ์ ์–ด ๋†“์€ ๊ฒŒ ABI๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ A์™€ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ B์˜ ABI๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๋ฉด ๋‘˜ ๋‹ค CPU๋ฅผ ์ œ๋ฉ‹๋Œ€๋กœ(?) ์‚ฌ์šฉํ•  ํ…Œ๊ณ , ๋‹น์—ฐํžˆ A์™€ B๋Š” ์ƒํ˜ธ์ž‘์šฉ(ํ˜ธํ™˜)์ด ๋ถˆ๊ฐ€๋Šฅํ•  ๊ฒƒ์ด๋‹ค.

 

ISA์— ์ข…์†๋œ ABI

์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ค ABI์—์„œ๋Š” ์ฝ”๋“œ ์†์— ํ‘œํ˜„๋œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ RDI ๋ ˆ์ง€์Šคํ„ฐ, ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ RSI ๋ ˆ์ง€์Šคํ„ฐ์— ๋„ฃ๊ณ , ๋‚˜๋จธ์ง€ ์ธ์ž๋“ค์€ CPU ๋ฐ– ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์˜ ์Šคํƒ ์˜์—ญ์— ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ์น˜, ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์€ RAX ๋ ˆ์ง€์Šคํ„ฐ์— ๋ฐ›๋Š”๋‹ค๋Š” ๋‚ด๋ถ€ ๊ทœ์น™์„ ์ง€๋‹Œ๋‹ค. 

 

์—ฌ๊ธฐ์„œ ์–ด๋–ค ABI๋“  ํŠน์ • ISA์— ์ข…์†๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ISA ๋ณ„๋กœ ๋ ˆ์ง€์Šคํ„ฐ ์ด๋ฆ„๊ณผ ๊ฐœ์ˆ˜, ๋ ˆ์ง€์Šคํ„ฐ ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ €์žฅํ•˜๋Š” ๋ช…๋ น, ๊ณ„์‚ฐ ๋ช…๋ น ๋“ฑ์ด ์ „๋ถ€ ๋‹ค๋ฅผ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ABI๊ฐ€ ๋ณด์œ ํ•˜๋Š” ์—ฌ๋Ÿฌ ์„ธ๋ถ€ ๊ทœ์น™์€ ํŠน์ • ISA์˜ ๊ตฌ์กฐ์™€ ๋ช…๋ น์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •์˜๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

ABI์— ์ข…์†๋œ ์ปดํŒŒ์ผ

๊ทธ๋ ‡๋‹ค๋ฉด '์ปดํŒŒ์ผ' ๋˜ํ•œ 'ABI'์— ์ข…์†์ ์ด๋ผ๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋œ๋‹ค. ์ปดํŒŒ์ผ์€ ๊ถ๊ทน(์ตœ์ข…)์ ์œผ๋กœ CPU๊ฐ€ ์‹คํ–‰ํ•  ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋Š” ๋ชฉ์ ์˜ ํ–‰์œ„์ด๋ฏ€๋กœ, ๊ทธ ์ตœ์ข… ์‚ฐ์ถœ๋ฌผ(๊ธฐ๊ณ„์–ด)์ด CPU์—์„œ ์ž˜ ๋Œ์•„๊ฐ€์•ผ๋งŒ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ (ํ•ด๋‹น CPU์˜ ISA๋ฅผ ์ง€์›ํ•˜๋Š”) ABI์— ๋งž์ถฐ ์ปดํŒŒ์ผ๋˜์–ด์•ผ ๊ธฐ๊ณ„์–ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‹คํ–‰๋  ๊ฒƒ์ด๋‹ค.

 

์‹ค์ œ๋กœ๋„ ๊ทธ๋ ‡๋‹ค. ์•„๋ž˜๋Š” example.c๋ฅผ example.s๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ํ„ฐ๋ฏธ๋„ ๋ช…๋ น์–ด๋‹ค.

gcc -S example.c -o example.s -m32

์ด ๋ช…๋ น์–ด๋Š”, ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜๋Š” ํ”Œ๋žซํผ(Window, Linux, ...)์˜ ABI๋ฅผ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ๊ฐ„๋‹ค. ํ•˜์ง€๋งŒ, 

gcc -S example.c -o example.s -m32 -mfastcall

์ฒ˜๋Ÿผ ABI ์˜ต์…˜์„ ๋ช…์‹œํ•˜๋ฉด ํ•ด๋‹น ABI์— ๋งž์ถฐ ์ปดํŒŒ์ผ๋œ๋‹ค. ๋‹น์—ฐํ•˜๊ฒ ์ง€๋งŒ, ์ฒซ ๋ฒˆ์งธ ํ„ฐ๋ฏธ๋„ ๋ช…๋ น์–ด๋กœ ์ƒ์„ฑ๋œ example.s์™€ ๋‘ ๋ฒˆ์งธ ํ„ฐ๋ฏธ๋„ ๋ช…๋ น์–ด๋กœ ์ƒ์„ฑ๋œ example.s๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์ผ ๊ฒƒ์ด๋‹ค.

 

#3 ๋ฐ”์ดํŠธ ์ด์•ผ๊ธฐ

#3-1 ๋ฐ”์ดํŠธ์˜ ํƒ„์ƒ

๊ธฐ์›

1956๋…„ IBM์—์„œ ๊ทผ๋ฌดํ•˜๋˜ Werner Buchholz๋Š” '์ปดํ“จํ„ฐ๋งˆ๋‹ค ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๋น„ํŠธ ๋ฌถ์Œ'์„ ์˜๋ฏธํ•˜๋Š” 'byte'๋ผ๋Š” ์šฉ์–ด๋ฅผ ์ฐฝ์‹œํ–ˆ๋‹ค. ์ด๋•Œ byte์˜ ๋ชฉ์ ์€, ๋ฌธ์ž(character)๋ฅผ ๋‹ด๋Š” ์ตœ์†Œ ์ฃผ์†Œ ๋‹จ์œ„๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•จ์ด์—ˆ๋‹ค.

 

๊ตฌ์ฒด ๊ฐœ๋…์œผ๋กœ์˜ ๋ณ€๋ชจ

๊ฐ€๋ น byte๊ฐ€ n๊ฐœ์˜ ๋น„ํŠธ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค๋ฉด 1byte๋Š” ์ด 2n ๊ฐœ์˜ ๊ฐ€์ง“์ˆ˜๋ฅผ ์ง€๋‹ˆ๋Š” ๋ฌธ์ž๋“ค์„ ํ‘œ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค. 1byte๋Š” 1964๋…„ ์ „๊นŒ์ง€ 6bit, 7bit, 12bit ๋“ฑ ๊ฐ์–‘๊ฐ์ƒ‰์ด์—ˆ๋‹ค. 1964๋…„ ์ถœ์‹œ๋œ IBM 360์ด ๋Œ€์„ฑ ๊ณต์„ ๊ฑฐ๋‘๋ฉด์„œ, IBM 360๊ฐ€ ์‚ฌ์šฉํ–ˆ๋˜ 1byte = 8bit๊ฐ€ ๋„๋ฆฌ ํผ์ง€๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ ๋•Œ๋ฌธ์— 1byte๋Š” 8bit๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋Œ€๋ช…์‚ฌ๋กœ ๊ตณ์–ด์กŒ๋‹ค. byte = "๋น„ํŠธ ๋ฌถ์Œ"์ด๋ผ๋Š” ์ถ”์ƒ ๊ฐœ๋…์ด, "8๋น„ํŠธ ๋ฌถ์Œ"์ด๋ผ๋Š” ๊ตฌ์ฒด ๊ฐœ๋…์œผ๋กœ ๋ณ€๋ชจํ•œ ๊ฒƒ์ด๋‹ค.

 

์‚ฐ์—…์— ๋ผ์นœ ์˜ํ–ฅ

์ด์— ๋งž์ถฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฐ์—…๋„ ๋ณ€ํ–ˆ๋‹ค. ๋ฐ”๋กœ, ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜๋Š” ์ตœ์†Œ ์ฃผ์†Œ ๋‹จ์œ„๋ฅผ 8bit (1byte)๋กœ ๋‘” ๊ฒƒ์ด๋‹ค. (IBM ์ฒด๊ณ„์—์„œ) ๋ฌธ์ž ํ•˜๋‚˜๊ฐ€ 1byte์ด๋ฏ€๋กœ, ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ํ•˜๋‚˜์— ๋ฌธ์ž ํ•˜๋‚˜๊ฐ€ ๊ผญ ๋งž๊ฒŒ ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ ‡๊ฒŒ byte๋Š” ๋ฒ”์šฉ ๋ฐ์ดํ„ฐ ํ‘œํ˜„ ๋‹จ์œ„๋กœ (์‚ฌ์‹ค์ƒ) ๊ณ ์ •๋˜์—ˆ๋‹ค. ๋” ๋‚˜์•„๊ฐ€ byte๋ผ๋Š” 'ํ‘œํ˜„ ๋‹จ์œ„์˜ ํ‘œ์ค€'์€, (๋ฉ”๋ชจ๋ฆฌ·ํŒŒ์ผ·๋„คํŠธ์›Œํฌ·๋ช…๋ น์–ด ์ธ์ฝ”๋”ฉ ๋“ฑ์˜) '์ตœ์†Œ ๊ตํ™˜ ๋‹จ์œ„์˜ ํ‘œ์ค€'์œผ๋กœ๋„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด์–ด์กŒ๋‹ค. ์ด ์‹œ์ ๋ถ€ํ„ฐ "ํŒŒ์ผ์„ ์ฝ๋Š”๋‹ค"๋ผ๋Š” ๊ฒŒ 'byte ์ŠคํŠธ๋ฆผ'(byte๋“ค์˜ ์—ฐ์†๋œ ๋‚˜์—ด)์„ ๋ฐ›๋Š”๋‹ค๋Š” ๋ง๊ณผ ๋™์˜์–ด๊ฐ€ ๋˜์—ˆ๋‹ค.

 

#3-2 VM (Virtual Machine, ๊ฐ€์ƒ ๋จธ์‹ )

VM์€ 1970๋…„๋Œ€์— ๋“ฑ์žฅํ–ˆ๋‹ค. ๋‹น์‹œ์˜ ์†Œํ”„ํŠธ์›จ์–ด๋“ค์€ ํŠน์ • ๊ธฐ๊ณ„์— ๊ฐ•ํ•˜๊ฒŒ ์ข…์†๋˜์—ˆ๋‹ค. ํ•˜๋“œ์›จ์–ด ์‚ฌ์–‘(ISA, ABI ๋“ฑ) ๋“ฑ์ด ๋‹ฌ๋ž๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ™์€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„๋งˆ๋‹ค ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ด์•ผ ํ–ˆ๋‹ค. ๋•Œ๋ฌธ์— ์†Œํ”„ํŠธ์›จ์–ด์˜ ์ด์‹์„ฑ๊ณผ ํ˜ธํ™˜์„ฑ์„ ์ฆ๋Œ€์‹œ์ผœ์•ผ ํ•œ๋‹ค๋Š” ํ•„์š”๊ฐ€ ์ƒ๊ฒผ๊ณ , ์ด๋ฅผ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด VM์ด ๋“ฑ์žฅํ–ˆ๋‹ค.

 

VM์ด๋ž€ ๋ฌผ๋ฆฌ์ ์ธ ํ•˜๋“œ์›จ์–ด๊ฐ€ ์•„๋‹Œ, ์†Œํ”„ํŠธ์›จ์–ด๋กœ ๊ตฌํ˜„๋œ '์ถ”์ƒ์ ์ธ ์‹คํ–‰ ํ™˜๊ฒฝ'์„ ์˜๋ฏธํ•œ๋‹ค. ๋‹จ์ˆœํ™”ํ•ด์„œ ์„ค๋ช…ํ•˜์ž๋ฉด VM์€ ์ผ์ข…์˜ 'CPU ๋Œ€ํ–‰'(์ถ”์ƒํ™”๋œ CPU)์ด๋‹ค. ๊ฐ€์ƒ ISA, ๊ฐ€์ƒ ๋ ˆ์ง€์Šคํ„ฐ ๋“ฑ์„ ๋ณด์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํŠน์ • ๋ฌผ๋ฆฌ์  ํ•˜๋“œ์›จ์–ด์˜ ์ƒ์„ธ ์‚ฌ์–‘์„ ์ง์ ‘ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ , ํ”„๋กœ๊ทธ๋žจ์˜ ์˜๋„์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, VM์ด ์ œ๊ณตํ•˜๋Š” ์ถ”์ƒํ™”๋œ ํ•˜๋“œ์›จ์–ด ํ™˜๊ฒฝ๋งŒ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

 

#3-3 ๋ฐ”์ดํŠธ ์ฝ”๋“œ (Byte Code)

๊ฐ€์ƒ ๋จธ์‹ ์— ์ž…๋ ฅํ•  ์ฝ”๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ดˆ๊ธฐ์—๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ 'intermediate code'๋ผ๊ณ  ๋ถˆ๋ €๋‹ค. CPU์˜ ISA๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š๋Š” ์ฝ”๋“œ์ง€๋งŒ, VM์ด ์•Œ์•„์„œ ISA๋กœ ๋ณ€ํ™˜ํ•  ์ฝ”๋“œ์ด๋ฏ€๋กœ ์ค‘๊ฐ„ ๋งค๊ฐœ(intermediate) ์—ญํ• ์˜ ์ฝ”๋“œ๋ผ๋Š” ๋œป์œผ๋กœ ๋ง์ด๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ์ ์ฐจ byte code๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ถˆ๋ ธ๋Š”๋ฐ, VM์ด intermediate code๋ฅผ byte ๋‹จ์œ„๋กœ 'ํ•ด์„'(≠ ์ฝ์Œ)ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋Ÿฐ VM์— ๋„ฃ์„ code์ด๊ธฐ์— byte code์ธ ๊ฒƒ์ด๋‹ค.

 

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” 'ํ•ด์„'์€, ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ๋กœ๋ถ€ํ„ฐ ์ฝ์–ด ๋“ค์ด๋Š” ๊ฑธ ์˜๋ฏธํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋‹ค. byte(= 8bit) ๋‹จ์œ„๋กœ ์ฝ์–ด ๋“ค์ด๋Š” ๊ฒƒ์€ VM์ด ๋“ฑ์žฅํ•œ ์‹œ์ ์—์„œ๋Š” ์ด๋ฏธ ์—…๊ณ„์˜ ํ‘œ์ค€์ด์—ˆ๊ธฐ์—, ๋‹จ์ˆœํžˆ "byte ๋‹จ์œ„๋กœ ์ฝ๋Š”๋‹ค"๋ผ๋Š” ์ด์œ ๋งŒ์œผ๋กœ byte code๋ผ ๋ช…๋ช…๋˜์—ˆ๋‹ค๊ณ  ๋ณด๊ธฐ๋Š” ์–ด์ƒ‰ํ•˜๋‹ค (์ด๋Ÿฐ ์‹์ด๋ฉด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ผ๊ณ  ๋ถˆ๋Ÿฌ๋„ ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค!). ํ•ด์„์€ ์ด๋ฏธ ์ฝ์–ด ๋“ค์ธ ๋ฐ์ดํ„ฐ์— ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๊ทœ์น™์˜ ๋ฌธ์ œ๋‹ค. 

 

๊ทธ๋ ‡๋‹ค๋ฉด VM์€ ์™œ byte code ๋‹จ์œ„๋กœ ํ•ด์„ํ•˜๋Š”๊ฐ€? ์ „ ๋ฌธ๋‹จ์—์„œ 'ํ•ด์„'์„ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•ด์„œ '์ฝ์Œ'์„ ๋ฐฐ์ œํ–ˆ๋‹ค๋ฉด, ์—ฌ๊ธฐ์„œ๋Š” ์ „์ ์œผ๋กœ '์ฝ์Œ'์„ ๊ฐ•์กฐํ•ด์•ผํ•œ๋‹ค. ์ฝ๋Š” ๋‹จ์œ„์™€ ํ•ด์„ ๋‹จ์œ„๋ฅผ ์ผ์น˜์‹œํ‚ค๋ฉด ๋ณ„๋„์˜ ์กฐํ•ฉใ†์ •๋ ฌ ๊ณผ์ • ์—†์ด ์ž…๋ ฅ์„ ๊ณง๋ฐ”๋กœ ๋ช…๋ น์–ด๋กœ์„œ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” VM์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค. '์ฝ์Œ' ๋‹จ์œ„ → 'ํ•ด์„' ๋‹จ์œ„ ๋ณ€ํ™˜ ๊ณ„์ธต์ด ์—†๋Š” ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ์—์„œ ์˜ค๋Š” ๋†’์€ ์†๋„ ๋•๋ถ„์ด๋‹ค.