이 글에서는 시스템에서 C 프로그램이 어떻게 실행되는지 살펴봅니다. 이는 곧 C 프로그램의 컴파일 과정이라고 할 수 있습니다.
다음 다이어그램은 C 소스 코드가 실행 파일로 변환되는 전체 흐름을 보여줍니다.

위 다이어그램의 각 단계를 자세히 알아보겠습니다.
1. 소스 코드(C 코드)
개발자가 직접 작성한 코드입니다. 작성된 코드는 가장 먼저 전처리기(Preprocessor) 단계로 전달됩니다.
2. 전처리(Preprocessing)
전처리 단계에서는 전처리기 파일들이 작성한 코드에 결합됩니다. 우리는 stdio.h, math.h 같은 헤더 파일을 자주 사용하는데, 이 파일들이 C 소스 코드에 포함되어 최종적으로 전처리된 소스 코드가 생성됩니다. 참고로 '#include', '#define' 같은 문법이 바로 전처리기 지시문(Preprocessor Directives)입니다.
3. 컴파일러(Compiler)
전처리된 소스 코드가 생성되면 다음 단계인 컴파일러로 넘어갑니다. 컴파일러는 전체 프로그램을 컴파일하여 어셈블리 수준의 코드를 생성합니다.
4. 어셈블러(Assembler)
어셈블러는 컴파일러가 만든 어셈블리 언어 코드를 입력받아 오브젝트 코드(Object Code)를 생성합니다. 이 코드는 기계어(이진수 집합)와 상당히 유사한 형태를 띱니다.
5. 링커(Linker)
링커는 컴파일 과정에서 매우 중요한 역할을 담당합니다. 링커는 오브젝트 코드를 가져와 여러 라이브러리 파일들과 연결합니다. 이 라이브러리 파일들은 우리가 작성한 코드의 일부는 아니지만, 전체 프로그램을 실행하는 데 필수적인 요소입니다. 링킹이 완료되면 링커는 실행 준비가 된 최종 기계어 코드를 생성합니다.
6. 로더(Loader)
프로그램은 주기억장치(메인 메모리)에 적재되기 전까지는 절대 실행될 수 없습니다. 로더는 기계어 코드를 RAM에 올려 실제로 실행할 수 있도록 도와줍니다. 프로그램이 실행되는 동안에는 프로세스(Process)라고 부르는데, 즉 프로세스란 '실행 중인 프로그램'을 의미합니다.