bunta의 보조기억장치

[3주차 TIL] KnockOn Bootcamp 컴파일러 본문

KnockOn Bootcamp

[3주차 TIL] KnockOn Bootcamp 컴파일러

bunta 2025. 4. 17. 20:04
반응형

💡 컴파일러란?

컴파일이란 프로그래머가 고급언어(C, C++, Java 등)로 작성한 코드 전체를 컴퓨터가 이해할 수 있도록 기계어로 번역하는 과정을 말한다. 그리고 이 컴파일을 자동으로 수행해주는 프로그램을 컴파일러라고 부른다.

컴파일러는 여러 종류가 있지만 이 글에서는 그 중에서도 gcc에 대해서 다뤄보고자 한다.


🔎 컴파일 과정

1. 전처리(Preprocessing)

  • #include, #define 같은 전처리 지시문 처리
  • 매크로 치환, 헤더 파일 포함 등

2. 컴파일(Compilation)

  • 전처리된 코드를 어셈블리어로 변환
  • 문법 검사, 변수·함수 분석, 오류 체크 등

3. 어셈블리(Assembly)

  • 어셈블리 코드를 기계어로 번역

4. 링킹(Linking)

  • 여러 개의 목적 파일과 라이브러리를 연결해 실행 가능한 프로그램 생성

 

🎯 컴파일 과정 예시

hello.c 파일의 컴파일 과정을 따라가면서 컴파일이 어떤 식으로 진행이 되는지 확인해보자

 

hello.c

#include <stdio.h>

#define HELLO "Hello, world!"

int main()
{
    printf("%s\n", HELLO);
    
    return 0;
}

 

 

전처리 진행

 

 

hello.i (hello.c 가 전처리된 파일)

extern int printf(const char *, ...);    // #include <stdio.h>가 실제 내용으로 치환, 실제 코드는 매우 길기 때문에 생략

int main() {
    printf("%s\n", "Hello, world!");     // HELLO 부분이 "Hello, world!")로 치환
    
    return 0;
}


 

컴파일 진행

 

 

hello.s (hello.i 가 어셈블리어로 변환된 파일)

    .file   "hello.c"
    .text
    .globl  main
    .type   main, @function
main:
    pushq   %rbp
    movq    %rsp, %rbp
    leaq    .LC0(%rip), %rdi
    call    printf
    movl    $0, %eax
    popq    %rbp
    ret
.LC0:
    .string "Hello, world!"


 

어셈블리 진행

 

 

hello.o (hello.s 를 목적 파일로 변환된 파일)

0000000000000000 <main>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   48 8d 3d 00 00 00 00    lea    0x0(%rip),%rdi
   b:   e8 00 00 00 00          callq  10 <main+0x10>
  10:   b8 00 00 00 00          mov    $0x0,%eax
  15:   5d                      pop    %rbp
  16:   c3                      retq


 

링킹 진행

 

 

hello (hello.o 를 라이브러리와 연결하여 실행 가능한 파일 생성)

$ ./hello
Hello, world!
반응형
Comments