프로그래밍/CS및OS
3. 컴파일러의 실행 과정
데일리 백수
2025. 5. 14. 12:37
컴파일러의 실행과정은 크게 4단계로 분리할 수 있습니다.
소스 코드 (.c, .cpp)
↓
[1] 전처리 (Preprocessing)
↓
[2] 컴파일 (Compilation)
↓
[3] 어셈블 (Assembly)
↓
[4] 링크 (Linking)
↓
실행 파일 (.exe, a.out)
의 과정을 거치며 소스코드를 최종 컴퓨터가 실행가능한 실행 파일로 변환해줍니다.
1단계: 전처리 (Preprocessing)
.c 또는 .cpp → .i 파일 생성
하는 일:
- #include → 헤더 파일 코드 삽입
- #define → 매크로 치환
- 조건부 컴파일 (#ifdef, #ifndef)
- 간단하게 #은 전처리 단계에서 처리된다고 생각하면 편하다!
예시
#include <stdio.h>
#define PI 3.14
//전처리 후
// stdio.h의 모든 코드 삽입
// PI는 3.14로 치환됨
명령어:
gcc -E main.c -o main.i
2단계: 컴파일 (Compilation)
전처리된 .i → 어셈블리 코드 .s 생성
하는 일
- C/C++ 문법 분석 (문법 오류 잡기)
- 어셈블리 코드로 변환 (mov, add 등)
- 코드 최적화 수행
- 이 과정에서 코드 최적화/에러 검수 및 실제 어셈블리 코드로 변환이 이루어짐
명령어:
gcc -S main.i -o main.s
3단계: 어셈블 (Assembly)
어셈블리 .s → 목적 코드 .o (기계어)
하는 일:
- 어셈블리 명령어를 기계어(이진코드)로 변환
- 이진 .o 파일은 아직 단독 실행 불가
- 어셈블리와 기계어는 다르다.
4단계: 링크 (Linking)
.o + 라이브러리 → 최종 실행파일 .exe, a.out
하는 일:
- 외부 함수 연결 (printf, malloc 등)
- 여러 .o 파일 결합 (main.o, util.o, math.o)
- 실행 가능한 프로그램 생성
- 컴파일은 내 소스코드만 컴파일
- 링크는 필요한 외부 코드만 가져와 유연하고 빠르다.
요약표
단계입력출력설명
전처리 | .c/.cpp | .i | 매크로 치환, 헤더 삽입 |
컴파일 | .i | .s | 어셈블리 코드 생성 |
어셈블 | .s | .o | 기계어 목적 파일 생성 |
링크 | .o | 실행파일 | 실행 가능한 최종 프로그램 |