요약
Transition Unit 방식
&상세 블로그 링크 : 씹어먹는 C++ - <20 - 1. 코드 부터 실행 파일 까지 - 전체적인 개요>
컴파일러 내부 단계
Phase1. : < 여기부터 전처리 단계 >
- 소스 파일 문자 해석 (기본
Basic source character set
(공백, 영문자, 특수문자{총 96}) 및 다른 모든 문자\u
(유니코드) 치환
- 소스 파일 문자 해석 (기본
Phase2. :
\
문자 해석
Phase3. :
- 주석, 공백 문자, 전처리 토큰(Preprocessing token)(define, include 등 컴파일 전에 처리되는 것)들로 분리
- 특이사항
- 주석은 공백 문자 하나로 변경
- maximal munch 규칙 : 가장 긴 전처리 토큰을 구성하려고 함
int a = bar+++++baz
->bar++
,++
+ baz
int b = 0xE+foo
->0xe+
,foo
Phase4.
- 전처리기 실행 단계 (Phase2)에서 분리한 전처리 토큰 적용.
- #include : 지정 파일 내용 복사
- #define : 정의된 매크로 사용해서 코드 치환
- #if, #ifndef : 구문 실행해서 코드 치환
- 헤더 가드에서 중복 내용 개행문자처리
- #pragma : 명령문 해석
컴파일 할 떄,
-E
옵션으로 컴파일 시, 전처리 끝난 후의 파일 확인 가능
- 전처리기 실행 단계 (Phase2)에서 분리한 전처리 토큰 적용.
- @명심 :
#include
로 복사된 헤더 파일은 1~4 단계를 다시 거침 (전처리문 더 이상 없을 떄까지 반복) - TMI :
- C++ 20 에서는 모듈(module) 이라는 개념을 도입해서 이와 같은 문제를 해결할 수 있습니다. 모듈은 다른 파일의 클래스의 함수들을 참조할 수 있지만 #include 를 할 때 처럼 해당 파일의 모든 내용을 불러오지는 않습니다. 물론 아직 (2020년 10월 현재) 모듈이 정식으로 컴파일러에서 구현된 것은 아니라서 이를 사용하려면 조금 시간이 걸릴 것으로 보입니다.
- @명심 :
Phase5.
- 소스 코드 문자 셋(UTF-8 등)에서 실행 문자 셋(OS 문자{ANSI 코드 페이지 등})으로 변경
Phase6.
인접한 문자열 합치기
std::cout << "abc" "def"; {합치기} std::cout << "abcdef";
Phase7. : < 여기부터 컴파일 단계 >
- 해석 유닛 생성 (TU)
- 소프 코드 컴파일, 인터프리팅 할 떄 사용되는 단위
- 특정 파일과 해당 파일에 포함된 모든 헤더 파일 집합
- TU에 존재하는 모든 변수, 함수, 클래스, 템플릿 등등의 정의는 유일, inline이 아닌 모든 함수 변수 정의는 전체 프로그램에서 유일 (One Definition Rule; ORD)
- 선언은 여러개 있어도 되지만, 정의는 유일.
int f(); <- 선언이라 여러개 가능
int f(() {return0;} <- 정의라 유일
- 헤더파일에 정의 시, 다른 소스파일이
#include
할 떄, 2 개의 서로다른 TU에 같은 정의가 들어가게 되서 ORD 규칙 가능
- 흔히 알려진
컴파일
이루어지는 곳 - 전처리기 토큰 -> 컴파일 토큰 변환
- 컴파일 토큰 -> (해석) -> 해석 유닛(Translation Unity; TU)
- 해석 유닛은 소스 파일 별 1개 씩 존재
- 서로 독립적으로 컴파일 됨
- 해석 유닛 생성 (TU)
Phase8.
- 인스턴스 유닛 생성
- 탬플릿 정의 위치 확인 -> 인스턴스화
- 목적 코드 생성 ( .obj 같은 목적 파일 생성)
링킹 단계
- 목적 파일 및 외부 라이브러리 파일을 모아서 실행 파일 생성
- 결과물이 각기 다른 파일 형태
- 다른 실행 파일 (Portable Executable;PE <- exe 파일, Executable and Linkable Format;ELF 등)
'공부 > C++' 카테고리의 다른 글
C++ 여러가지 기본 (0) | 2025.03.02 |
---|---|
C++20: 모듈 선언 (0) | 2025.03.02 |
디버그 출력 (0) | 2025.03.02 |
C++ 저장&링킹 (1) | 2025.03.01 |
C++ 컨테이너 클래스 (0) | 2025.03.01 |