컴파일이란??
- 프로그래밍 언어로 작성된 소스 코드(고 수준 언어)를 기계어(저 수준 언어)로 변환하는 과정이다.
- 컴퓨터는 0, 1로 이루어진 기계어만 이해할 수 있기 때문이다.
- 컴파일 과정을 거친 후에는 실행 파일이나 라이브러리 파일이 생성되며, 이를 통해 컴퓨터가 해당 프로그램을 실행할 수 있게 된다.
💡 번외! 컴파일러(Compiler)
- 일련의 소스 코드를 입력으로 받아들여 이를 분석하고, 그에 맞는 기계어로 변환시켜주는 프로그램이다.
- 이 과정에서 컴파일러는 문법적인 오류나 논리적인 오류를 찾아내고, 만약 오류가 있다면 개발자에게 알려준다.
컴파일 VS 컴파일러
컴파일러는 소스 코드를 번역하는 프로그램이고, 컴파일은 그 프로그램을 사용하여 소스 코드를 번역하는 행위이다.
컴파일 과정
총 4단계이다.
- 전처리 과정 - 컴파일 과정 - 어셈블리 과정 - 링킹 과정이다.
1️⃣ 단계 : 전처리(Pre-processing)
- .i 확장자를 가진 파일에 저장된다.
- 소스 코드에서 전처리 지시문(Preprocessor directive)을 처리한다.
- 전처리 지시문은 # 기호로 시작한다.
- 전처리 지시문은 주로 #include, #define, #ifdef, #ifndef, #endif, #if, #else, #elif, #undef 등의 형태를 가진다.
- 주로 헤더 파일을 포함시키거나 조건부 컴파일을 수행한다.
- 즉, 이 과정을 거쳐 "소스파일" 생성.
gcc -E hello -o hello.i
2️⃣ 단계 : 컴파일(Compilation)
- 전처리가 완료된 소스 코드를 컴파일러가 읽어들여 기계어로 변환한다.
- .s 확장자를 가진 파일에 저장된다.
- 이 때 컴파일러는 문법적인 오류를 검사하한다.
- 컴파일러는 소스 코드를 어셈블리 코드로 변환한다.
- 즉, 이 과정을 거쳐 "어셈블리 소스파일" 생성.
gcc -S hello.c
3️⃣ 단계 : 어셈블(Assembling)
- 어셈블러(Assembler)라는 프로그램에 의해 수행한다.
- .o 확장자를 가진 파일에 저장된다.
- 컴파일러가 생성한 중간 코드(대부분 어셈블리 코드 형태)를 어셈블러가 읽어들여 기계어로 번역한다.
- 어셈블러는 각 어셈블리 명령어를 해당하는 기계어 명령어로 변환하고, 그 결과를 목적 파일(Object File)로 변환된다.
- 즉, 이 과정을 거쳐 "목적 파일" 생성.
💡 목적 파일(Object File)이란?
- 더 이상 사람이 알아볼 수 없는 기계어로 변환되는데, 이진 형식의 파일이다.
gcc -c hello.c
4️⃣ 단계 : 링킹(Linking)
- 링커(linker)로 여러 개의 오브젝트 파일(컴파일된 코드의 이진 형식)을 하나의 실행 파일로 결합한다.
- 오브젝트 파일들과 프로그램에서 사용하는 라이브러리 파일들을 링크하여 하나의 실행 파일을 만든다.
- 이렇게 네 단계의 과정을 거치면 C 프로그램의 소스 코드가 컴파일되어 실행 가능한 실행 파일로 변환된다!!!
- 즉, 이 과정을 거쳐 "실행 가능한 파일" 생성.
gcc hello.c -o hello
- 컴퓨터 프로그램을 개발하기 위해 사용되는 여러 도구들의 집합이다.
- (전처리기-컴파일러-어셈블리-링커)와 같은 컴파일 단계를 말한다.
참고자료
컴파일(Compile)에 대한 이해