게임 개발/C++

[C++] 컴파일 과정 - 2. 컴파일 단계

유행성바코드 2025. 2. 20. 18:18

목차

  • Intro
  • 01. 컴파일 단계
    • 오브젝트 파일
    • 기계어로 변환 과정
    • 심볼 생성 및 심볼 테이블 등록
  • 02. 연관 내용

Intro

어제 컴파일 과정 중 첫 번째 단계인 '전처리 단계'를 알아봤습니다.

오늘은 전처리 다음 단계인 '컴파일 단계'에 대해 알아보겠습니다.


01. 컴파일 단계

컴파일 단계는 전처리된 소스 코드를 기계어로 변환하는 과정입니다.

각 소스 코드 파일별로 개별적으로 컴파일 되어 각각의 오브젝트 파일이 생성됩니다.

 

먼저, 오브젝트 파일이 무엇인지 살펴보겠습니다.

오브젝트 파일

오브젝트 파일은 컴파일 단계과 완료되면, 각 소스 코드 파일별로 생성됩니다.

이 때, 오브젝트 파일의 확장자는 2가지 종류가 있습니다.

.o 확장자와 .obj 확장자가 있지만, 운영 체제나 컴파일러에 따라 확장자가 다르게 결정됩니다.

 

  • 운영 체제

.o : UNIX 계열 시스템인 Linux, macOS 등

.obj : Windows

 

  • 컴파일러

.o : GCC ( GNU Compiler Collection )

.obj : MSVC ( Microsoft Visual C++ )

 

기계어로 변환 과정

전처리된 소스 코드는 아래와 같은 과정을 통해 기계어로 변환된 오브젝트 파일로 생성됩니다.

C++(고급 프로그래밍 언어) → 어셈블리어(저급 프로그래밍 언어) → 기계어(네이티브어)

 

먼저, 각 언어별로 어떤 차이점이 있는지 살펴보겠습니다.

 

C++ (고급 프로그래밍 언어)

GPT를 활용한 예시

C++는 고급 프로그래밍 언어로 우리가 읽고 이해할 수 있는 고수준 언어입니다.

또한, 인간이 작성할 수 있는 추상화된 코드로, 컴파일러를 통해 기계어로 번역됩니다.

 

C++는 다양한 운영체제와 하드웨어에서 동작할 수 있도록 추상화되어 있는 것이 가장 큰 특징입니다.

따라서, 코드의 기능을 효율적으로 표현하고, 복잡한 논리를 구현할 수 있도록 설계되어 있습니다.

 

어셈블리어(저급 프로그래밍 언어)

GPT를 활용한 예시

어셈블리어는 저급 프로그래밍 언어로 특정 하드웨어 아키텍처에 맞는 기계어와 1대1 대응되는 저수준 언어입니다.

특히, CPU가 직접 실행할 수 있는 명령어를 텍스트로 표현한 것입니다.

 

이는 저수준에서 하드웨어를 다루고, 메모리나 레지스터를 직접 관리할 수 있습니다.

물론, 어셈블리어도 사람이 읽고 이해할 수 있습니다.

따라서, 어셈블리어는 사람이 읽을 수 있는 코드면서 기계어와 1대1 대응하는 저수준 언어입니다.

 

만약에, 현재 소스 파일(.cpp)를 어셈블리어로 확인하고 싶으면,

g++ -S 파일명.cpp 명령어를 사용하면, C++ 소스 코드가 어셈블리어인 '파일명.s'로 변환됩니다.

 

기계어(네이티브어)

기계어와 네이티브어는 같은 의미로 사용됩니다.

정확히 보면, 기계어는 CPU가 직접(바로) 실행할 수 있는 바이너리 코드입니다.

즉, 기계어는 0과 1로 구성된 코드입니다.

 

오브젝트 파일은 기계어로 구성되어 있으며, 이를 직접 확인하기 위해서는

기계어를 어셈블리어로 바꾸는 과정인 디스어셈블리 과정을 거쳐야 합니다.

 

 

심볼 생성 및 심볼 테이블 등록

전처리 단계를 완료한 오브젝트 파일은 심볼과 심볼 테이블을 가지고 있습니다.

 

역할

심볼 테이블은 프로그램에서 정의된 함수나 변수의 이름과 메모리 주소(위치)를 매핑하는 테이블입니다.

심볼은 이름과 주소를 매핑하는 식별자입니다.

 

과정

다른 파일에서 선언한 함수나 변수를 호출하는 경우, 해당 함수와 변수의 위치를 알아야만 사용할 수 있습니다.

그래서, 함수나 변수의 이름과 그 주소에 대한 정보를 담는 식별자인 심볼을 먼저 생성합니다.

이때, 소스 파일에 존재하는 함수 및 변수별로 심볼을 생성합니다.

그 후, 생성된 심볼은 현재 소스 파일의 심볼 테이블에 등록됩니다. 

 

심볼 테이블을 바탕으로 함수, 변수의 위치를 연결하는 작업은 다음 단계인 링크 단계에서 진행됩니다.

즉, 컴파일 단계에서는 단순히 각 소스 파일별로 존재하는 함수와 변수에 대한 심볼을 만들고 심볼 테이블에 등록하는 것입니다.

 

그래서, 각 오브젝트 파일마다 별도의 심볼 테이블이 존재하고 해당 테이블에는 각 파일의 심볼들이 등록되어 있습니다.

 

 

심볼 및 심볼 테이블 추가 내용은 아래에 있습니다.


02. 연관 내용

  • [C++] 컴파일 과정 - 1. 전처리 단계
 

[C++] 컴파일 과정 - 1. 전처리 단계

목차Intro01. '컴파일 과정' 이란?02. 컴파일 과정 - 1. 전처리 단계#include : 헤더 파일 포함 지시어#ifdef, #endif .. 등 : 조건부 컴파일 지시어#define : 매크로 정의 지시어전처리 단계 후, 결과03. 연관 내

epidemic-barcode.tistory.com

 

  • [C++] 컴파일 과정 - 3. 링크 단계
 

[C++] 컴파일 과정 - 3. 링크 단계

목차01. Intro02. 링크 단계오브젝트 파일 병합심볼 해석주소 할당재배치라이브러리 연결03. 마무리04. 연관 내용01. Intro어제 컴파일 과정 중 두 번째 단계인 '컴파일 단계'를 알아봤습니다.오늘은

epidemic-barcode.tistory.com

 

 

 


 

읽어주셔서 감사합니다.

틀린 내용 지적은 언제나 환영입니다!