C 언어로 작성된 소스 코드는 다음 4단계를 거쳐 실행 파일로 변환됩니다.
1. 전처리 (Preprocessing)
2. 컴파일 (Compiling)
3. 어셈블 (Assembling)
4. 링킹 (Linking)
이 과정들은 컴파일러가 내부적으로 한 번에 수행하기 때문에 개발자는 잘 인지하지 못하는 경우가 많습니다.
역할: 컴파일 전에 소스 코드를 준비하는 단계.
주요 작업:
#include)#define)#ifdef, #ifndef)전처리 결과: .i 확장자를 가진 전처리된 코드가 생성됩니다.
예시:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
전처리 후에는 <stdio.h> 헤더 파일의 모든 내용이 소스 코드에 포함됩니다.
역할: 전처리된 소스 코드를 어셈블리어로 변환.
주요 작업:
컴파일 결과: .s 확장자를 가진 어셈블리어 코드가 생성됩니다.
예시 어셈블리 코드:
mov rdi, message
call printf
역할: 어셈블리어 코드를 기계어로 변환.
주요 작업: CPU가 직접 실행할 수 있는 목적 코드 생성.
어셈블 결과: .o 확장자를 가진 목적 파일이 생성됩니다.
이 단계에서 생성된 파일은 실행 가능하지 않으며, 다른 목적 파일들과 결합이 필요합니다.
예시: 목적 파일은 0과 1로 이루어진 이진 파일 형태로 저장됩니다.
역할: 여러 목적 파일을 하나로 결합하여 실행 파일 생성.
주요 작업:
링킹 결과: 최종 실행 파일 (.exe, .out 등)이 생성됩니다.
예시:
메인 파일 main.c에서 함수 helper()가 필요하다면, 링킹 과정에서 helper.c의 목적 파일과 연결해야 실행 파일이 정상적으로 동작합니다.
이러한 과정들을 거쳐 C 언어 소스 코드는 최종적으로 컴퓨터에서 실행 가능한 상태가 됩니다.
컴파일러 내부 동작을 이해하면 프로그램의 빌드 및 오류 해결에 도움이 됩니다! 😊