컴파일
컴파일 과정이란 사람이 작성하는 High Level Programming Language로 구성된 소스 코드를 기계가 이해할 수 있는 Low Level Programming Language로 바꾸는 과정을 의미합니다. 흔히 우리가 프로그래밍을 하고 실행 코드를 실행하는데, 실행이 되기 위해선 컴퓨터는 해당 코드를 ‘컴파일’하게 되는 것입니다. 그 결과로 우리가 원하는 결과를 얻을 수 있는 것입니다. GCC를 통해 C언어가 컴파일되는 과정을 알아보겠습니다.
컴파일 4단계
컴파일 과정은 전처리(Preprocessing) → 컴파일(Compiler) → 어셈블리(Assembly) → 링커(Linker) 순서로 이루어집니다.
전처리기(Preprocessor)
전처리 과정은 소스 코드 파일(.c)을 .i 파일로 변환해주는 과정을 담당합니다. 역할은 크게 1)헤더 파일 삽입, 2)매크로 치환 및 적용, 3) 주석 제거의 부분으로 나눠져있습니다. 어떠한 함수를 사용하기 위해선 해당 함수가 정의되어 있는 헤더 파일을 추가해야 합니다. C언어에서 #include 구문을 만나면 해당하는 헤더 파일을 찾아 파일의 내용을 삽입합니다. 또한 #define 지시문을 사용한 부분들을 정의된 값으로 변경합니다.
컴파일러(Complier)
컴파일 과정의 핵심으로 전처리된 소스 파일(.i)을 어셈블리어 파일(.s)로 변환해주는 과정을 담당합니다. 컴파일러는 1)문법이 타당한지, 2)해당 코드에 대한 최적화를 진행합니다. 컴파일러의 자세한 내용은 따로 다루고자 합니다.
어셈블러(Assembler)
어셈블러는 어셈블리어 파일(.s)을 오프젝트 파일(.o)로 변환해주는 과정을 담당합니다. 어셈블리 코드는 기계어로 어셈블이 되는 것인데, 오브젝트 파일은 기계어로 이루어져있기 때문에 사람이 읽기 어려운 형태로 구성되어 있습니다. 파일은 어셈블된 프로그램의 명령어와 데이터가 들어있는 ELF 바이너리 포맷 구조를 가집니다. 링커가 여러 개의 바이너리 파일을 효과적으로 파악하기 위해 형식화를 해놓은 것입니다.
링커(Linker)
링커는 여러 오브젝트 파일들과 표준 C 라이브러리, 사용자 라이브러리들을 묶어(Link) 실행 가능한 오브젝트 파일(Executable Object File)로 변환해주는 과정을 담당합니다. 결과물로 실행 파일(.exe)이 만들어집니다.
'CS > 프로그래밍 언어 (Programming Language)' 카테고리의 다른 글
[프로그래밍 언어] 프로그래밍 언어의 컴파일러 (0) | 2025.01.13 |
---|