컴파일러


1단계: 전처리 과정
- 전처리기(Preprocessor)를 통해 헤더파일(.h)과 전역변수를 처리한다.
- 전처리기를 이용하면 헤더파일(.h)와 소스 코드 파일(.cpp)을 전처리 된 소스 코드 파일(.i)로 변환한다.
- 이 과정에서는 '주석 제거', '헤더 파일 삽입', '매크로 치환 및 적용' 의 세가지 작업을 수행한다.
설명전처리 과정에선 #include, #define, #ifdef 등을 컴파일러가 이해할 수 있도록 코드로 변환시켜줍니다. #include 같은 경우는 헤더파일(.h)의 내용을 삽입하고 #define은 해당 값을 치환해주고, #ifdef는 지정한 define 값이 있거나 없을 때 작성한 소스코드로 치환해줍니다. 이처럼 전처리기를 통해 헤더파일을 전처리 된 소스코드 파일 (.i)로 변환하는 과정이 전처리 과정입니다.
2단계: 컴파일 과정
- 컴파일러(Compiler)가 Object 파일, 즉 어셈블리어 파일(.s)을 발생시킨다.
- 컴파일러는 전처리된 소스 코드 파일(.i)을 어셈블리어 파일(.s)로 변환한다.
- 이 과정에서 언어의 문법 검사가 이루어진다.
- 또한 Data 영역같은 정적 영역들의 메모리 할당을 수행한다.
- 컴파일러는 프론트엔드 - 미들엔드 - 백엔드 세 단계로 구성되어 있다.
설명
컴파일 과정에서는 각 운영체제에서 사용할 수 있는 컴파일러로 전처리가 완료된 C++ 코드를 컴파일합니다. 컴파일 과정에서 언어의 문법 검사가 수행되며 정적 영역의 메모리 할당을 수행합니다. 컴파일러는 프론트엔드-미들엔드-백엔드로 구성되어 있어 front 어휘분석 후 구문 분석, 의미 분석, 코드 생성의 순서로 컴파일을 진행합니다. 컴파일이 완료된 소스코드는 소스코드 파일을 어셈블리어 파일로 변환시킵니다.
3단계: 어셈블리 과정
- 어셈블리어 파일(*.s)를 오브젝트 파일(*.o)로 변환시킨다.
- 오브젝트 파일은 어셈블리 코드를 더이상 사람이 알아볼 수 없는 기계어로 변환된 코드로 구성된 파일을 말한다.
- 어셈블리어란: 기계어라고 불리는 이진수로 이뤄진 숫자들의 명령어를 사람이 이해할 수 있도록 부호화 한 것으로 CPU 명령어(기계어)와 1대1로 매칭된다.
설명
어셈블리 과정에선 어셈블리어 파일을 컴퓨터가 이해할 수 있도록 어셈블러를 통해 기계어로 변환하는 오브젝트 파일로 생성합니다. 0 또는 1로 이루어져 있는 오브젝트 파일은 링킹 과정에서 필요한 정보들을 가지고 있습니다.
4단계: 링킹 과정
- 링커(Linker)를 통해 오브젝트 파일(*.o)를 묶어 실행 파일로 만든다.
- 링커는 라이브러리를 링크하면서 관련된 정보를 모두 LAK 파일로 만들어낸다.
- 오브젝트 파일 + 라이브러리 파일들을 링크하여 하나의 실행 파일 (.exe)를 만든다.
- 링커의 역할은 비슷하게 '심볼 해석'과 '재배치'로 나뉜다.
설명
링킹 과정에서는 어셈블리 과정을 통해 번역된 오브젝트 파일이 링커를 통해 다른 오브젝트 코드 또는 라이브러리 파일들과 연결되어 실행 가능한 exe 프로그램으로 만들어집니다. 이때 라이브러리를 링크하는 방법에 따라 정적 링킹과 동적 링킹으로 나눌 수 있습니다.
언리얼 빌드 과정
2023.08.11 - [👩🏻💻면접준비] - [Unreal] 리플렉션(Reflection)
h(precompiler) -> UHT 컴파일(.h) -> CPP(Compiler) -> obj(어셈블리)
-> 언리얼 Module -> .dll 파일
언리얼 빌드 과정이 C++ 빌드 과정과 다른 점은 전처리기에서 컴파일러로 넘어가는 단계에 UHT 컴파일 과정이 추가된다는 점입니다.
언리얼 헤더 툴을 의미하는 UHT는 빌드 버튼을 누르고 컴파일러가 컴파일을 수행하기 전에 언리얼 헤더 툴과 언리얼 빌드 툴(UBT)가 개입하여 먼저 실행됩니다.
언리얼 헤더 툴은 .generated.h를 통해 헤더 파일을 수집하고, UClass나 UStruct 매크로를 찾아 리플렉션 정보를 먼저 수집합니다. 수집된 정보를 기반으로 프로그램이 실행될 때 리플렉션 객체를 생성하기 위해 필요한 요소를 GENERATED_BODY() 부분에 자동으로 생성합니다.
언리얼 헤더 툴은 intermediate 폴더에 이런 소스코드를 복사해 메타데이터를 만들어 저장하고 관리하여 리플렉션이 가능해집니다.
https://ledpear.tistory.com/74
C++ 소스 코드 빌드 과정
작성한 소스코드는 빌드 과정을 통해 실행할 수 있는 실행파일이 됩니다. 각 언어별로 빌드하는 과정과 실행하는 방법이 다른데 C++의 경우 어떻게 빌드가 되는지 정리해 보겠습니다. C++ 컴파일
ledpear.tistory.com
컴파일(Compile)에 대한 이해
서론 C, C++, Java 프로그래밍을 해봤으면 작성한 소스 코드를 빌드(Build) 혹은 컴파일(Compile)해서 실행해봤거나 코드를 잘못 작성하여 컴파일 에러가 났던 경험이 있을 것이다. 정확하게 컴파일이
bradbury.tistory.com
'👩🏻💻기초지식 > C++' 카테고리의 다른 글
[C++] Cast 4종류 (static, dynamic, const, reinterpret) (0) | 2023.09.04 |
---|---|
[C++] 동적할당/바인딩, 가상함수/테이블, 추상클래스, 인터페이스, 가상소멸자 (0) | 2023.08.28 |
[C++] 가변 파라미터 함수를 구현하는 방법은? (0) | 2023.08.17 |
[C++] 스택프레임이란? EBP와 ESP (0) | 2023.08.17 |
[C++] 함수 호출 규약이란? cdecl, stdcall, fastcall, thiscall 의 차이들? (0) | 2023.08.17 |