빌드

빌드(Build)는 소스코드를 실행 가능한 프로그램으로 만드는 전체 과정입니다.

프로그래밍 언어로 작성된 소스 코드는 컴퓨터가 직접 이해할 수 없기 때문에, 이를 기계어로 변환하는 과정이 필요합니다.
이 변환 방식은 크게 다음 세 가지로 나뉩니다.

  1. Compile 방식
  2. Interpreter 방식
  3. Hybrid 방식이 있습니다.

C++은 Compile 방식을 사용하므로, 이 글에서는 컴파일 기반 빌드 과정만 다루도록 하겠습니다.

빌드 과정

빌드는 일반적으로 다음 4가지 단계로 이루어집니다.

  1. 전처리
  2. 컴파일
  3. 어셈블
  4. 링크

어셈블 단계는 개념적으로 분리되지만, 실제 컴파일러에서는 내부적으로 함께 처리되는 경우가 많습니다.

넓은 의미에서 빌드는 컴파일과 링크를 포함하는 과정으로 표현되기도 합니다.
이 때문에 상황에 따라 컴파일 과정과 링크 과정을 구분하여 설명하기도 합니다.

아래는 전체 흐름을 나타낸 이미지입니다.

CstyleString_Print

각 작업에 대한 설명은 아래에서 이어집니다.

전처리

전처리(Preprocessing)는 컴파일 전에 소스 코드를 정리하는 단계입니다.

전처리기(PreProcessor)는 소스코드(*.cpp)에 포함된 매크로나 지시문을 처리하여 컴파일 가능한 형태로 만들어줍니다.

이 과정에서 대표적으로 세 가지 작업을 수행합니다.

  • 주석 제거
    • 사용자의 필요로 인해 남긴 내용들을 컴퓨터가 알 필요 없기 때문에 주석을 제거합니다.
  • 헤더 파일 삽입 (#include)
    • 지정된 헤더의 내용을 그대로 삽입합니다.
    • 참조가 아닌 복사를 수행합니다.
  • 매크로 치환 및 적용 (#define)
    • 정의된 매크로를 코드 전체에 치환합니다.

컴파일

컴파일(Compiling)은 전처리된 코드를 컴퓨터가 이해할 수 있는 저수준 언어로 번역하는 과정입니다.

이 과정에서 수행되는 작업은 다음과 같습니다.

  • 문법 검사(Syntax Check)
  • 오류 발생 시 컴파일 오류 출력
  • 코드 최적화(가능한 경우)
  • 어셈블리 코드 또는 중간 코드로 변환

C++ 컴파일러는 일반적으로 어셈블리 코드 또는 중간 표현(IR)을 거쳐 오브젝트 코드를 생성합니다.

위의 작업을 해주는 도구를 컴파일러(Compiler)라고 합니다.

어셈블

어셈블(Assembling)은 어셈블리 코드를 기계어로 변환합니다.
해당 단계는 개념적으로 분리되지만, 실제 컴파일러에서는 내부적으로 함께 처리되는 경우가 많습니다.

이 과정의 결과물은 오브젝트 파일(Object File)이며, 이는 아직 실행 가능한 상태가 아닙니다.

기계어로 변환된 코드가 포함됩니다.

위의 작업을 해주는 도구를 어셈블러(Assembler)라고 합니다.

링크

링크(Linking)는 여러 오브젝트 파일과 라이브러리를 합쳐 하나의 실행 파일을 만드는 과정입니다. 해당 과정의 결과물로 만들어지는 파일이 Executable(.exe)인 실행 파일입니다.

운영체제별로 파일 형식이 존재하는데, Windows의 경우 PE(Portable Executable), Linux의 경우ELF(Executable and Linking Format)로 나눠집니다.

위의 작업을 해주는 도구를 링커(Linker)라고 합니다.

ComputerScience 카테고리 내 다른 글 보러가기

댓글남기기