요약

컴파일러 내부 단계

  • 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 옵션으로 컴파일 시, 전처리 끝난 후의 파일 확인 가능

    • @명심 : #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개 씩 존재
      • 서로 독립적으로 컴파일 됨
  • 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

+ Recent posts

let textNodes = document.querySelectorAll("div.tt_article_useless_p_margin.contents_style > *:not(figure):not(pre)"); textNodes.forEach(function(a) { a.innerHTML = a.innerHTML.replace(/`(.*?)`/g, '$1'); });