1. 소개


무엇인가를 빌드한다는 것은 어떤 것일까? 내가 만든 프로그램을 컴퓨터가 읽는 과정은 어떻게 될까?

빌드는 소스 코드를 컴파일, 어셈블, 링크하는 일련의 과정을 통해 기계가 실행할 수 있는 실행 파일로 변환하는 과정이다. 이번에는 흔히 C 처럼 소스 코드가 실행되기 전에 컴파일러를 통해 기계어로 변환된 후 실행되는 프로그래밍 언어(컴파일 언어)의 빌드 과정을 알아보자!



2. 빌드 과정


2-1. Preprocessing (전처리)

전처리는 **전처리기(cpp)**에 의해 수행된다. 이 단계에서는 소스 코드가 컴파일되기 전에 미리 준비해야 하는 작업들이 처리된다. 주요 작업은 다음과 같다:

이 단계의 결과물은 전처리가 완료된 소스 파일인 .i 파일이다.


2-2. Compilation (컴파일)

컴파일 단계는 컴파일러에 의해 수행된다. 이 단계에서 전처리가 완료된 C 코드를 어셈블리어로 변환한다. 어셈블리어는 기계어와 인간이 이해할 수 있는 코드의 중간 단계에 해당하는 저수준 언어이다.

전처리된 .i 파일이 컴파일러에 의해 .s 파일로 변환된다. .s 파일은 어셈블리어로 작성된 파일이다. 이 단계에서는 변수, 함수, 제어 구조 등이 어셈블리어로 변환되어 코드가 하드웨어에 더 가까운 형태로 표현된다.


2-3. Assembly (어셈블리)

어셈블리 단계는 **어셈블러(as)**에 의해 수행된다. 어셈블리어 파일을 목적 파일(object file)로 변환하는 과정이다. 목적 파일은 컴퓨터가 실행할 수 있는 기계어로 작성되었지만, 아직 독립적으로 실행할 수 없다.

어셈블리어로 작성된 .s 파일이 어셈블러에 의해 .o 파일(목적 파일)로 변환된다. 이 파일은 이진(binary) 형태로, 실제로 하드웨어에서 실행 가능한 형태에 가까워진다.


2-4. Linking (링킹)

링킹은 **링커(ld)**에 의해 수행되는 단계이다. 여러 개의 목적 파일(.o)과 라이브러리 파일을 하나의 실행 파일로 결합하는 과정이다. 이 단계에서 정적 라이브러리나 동적 라이브러리도 함께 연결된다.

여러 목적 파일을 하나의 실행 가능한 프로그램으로 통합하는 과정이다. 이때 이미 컴파일된 라이브러리 파일도 링크되어 프로그램에서 사용할 수 있게 된다. 링킹을 통해 실행 가능한 단일 파일이 생성되며, 이 파일은 .out 또는 .exe 형식으로 나타난다. 이 단계가 완료되면 프로그램이 **빌드(build)**되었다고 한다.


2-5. Runtime (런타임)

실행 파일이 생성되었더라도, 프로그램의 실행은 빌드와는 별도의 단계이다. 런타임은 프로그램이 실제로 실행되는 동안 일어나는 일들을 의미한다. 메모리 할당, 입출력 처리, 예외 처리 등은 프로그램이 실행 중 즉 런타임 중 일 때 일어난다.

빌드 과정에서 목적 파일로 나누는 이유는 다양한 언어로 작성된 파일을 통합하거나, 큰 프로젝트를 여러 소스 파일로 분리하여 관리하는 것이 더 효율적이기 때문이다. 최종적으로 링킹 단계에서 이 파일들을 모아 하나의 실행 파일로 만든다.

이러한 전체 과정을 통해 C 프로그램은 소스 코드에서 기계어로 변환되어 실제로 실행할 수 있는 상태가 된다.