Study: ComputerScience(CS)/CS: Basic

[CS] 컴파일(Compile)에 대해 보다 심도있는 내용

DrawingProcess 2022. 7. 5. 11:59
반응형

컴파일(Compile) 과정이란?


  • high-level 언어(개발자가 작성한 source code)를 lower-level 언어(어셈블리 형태로 변환한 후 binary code)인 기계어로 변환하는 과정입니다.
  • 해당 작업을 해주는 프로그램이 Compiler입니다.
    • Java의 경우, JVM(Java Virtual Machine)에서 byte 코드 형태의 *.class 파일이 생성됩니다.
    • C++의 경우, MinGW, Clang에서 byte 코드 형태의 *.o(Object file) 파일이 생성됩니다.
  • 컴파일 과정은 두가지로 분리할 수 있습니다.
    • 해석 유닛 생성 (Translation Unit): 소위 말하는 컴파일이 이루어집니다. 
      • 전처리기 토큰들이 컴파일 토큰으로 변환이 되고, 컴파일 토큰들은 컴파일러에 의해 해석되어서 해석 유닛 (Translation Unit - 줄여서 보통 TU) 을 생성하게 됩니다.
      • 참고로 이 해석 유닛은 각 소스파일(*.cpp) 별로 하나씩 존재하게 되며, 유일 정의 규칙 (ODR, One Definition Rule)을 만족해야 생성됩니다.
        • 유일 정의 규칙이란?
          • 각 TU 에 존재하는 모든 변수, 함수, 클래스, enum, 템플릿 등등의 정의(Definition) 은 유일해야 하며, 
          • inline 이 아닌 모든 함수의 변수들의 정의는 전체 프로그램에서 유일해야 합니다.
    • 인스턴스 유닛 생성 (Instantitaion Unit) 
      • 컴파일러는 생성된 TU 를 분석해서 필요로 하는 템플릿 인스턴스들을 확인합니다.
      • 템플릿들의 정의 위치가 확인이 되면 해당 템플릿들의 인스턴스화가 진행이 되고 이를 통해서 인스턴스 유닛이 생성됩니다.
      • 이 단계를 마치면 컴파일러는 목적 코드(*.o)를 생성하여 링커로 전달합니다.

 

Compile된 어셈블리 코드를 확인하고 싶다면?


소스코드를 어셈블리 코드로 변환

  • compiler explorer: https://godbolt.org/
    • 링크에 들어가 코드를 넣으면 어셈블리 코드를 확인할 수 있습니다. 

C++ 컴파일러 종류

  • clang
  • GCC(g++)
  • visual c++
  • ...

C++ 컴파일러 옵션

  • -o <name>: name으로 된 실행파일 생성.
  • -O0: optimization option, -O 뒤의 숫자를 이용하여 optimization level 설정 가능합니다.
    • 0: 빠른 컴파일 및 완전한 디버깅 지원한다.
    • 2: 저수준의 최적화를 수행하며 프로시저 경계에 한하는 부분적인 디버깅 지원한다.
    • 3: 레벨 2보다 더 많은 최적화를 수행한다. 다량의 컴파일 시간과 자원을 소요하며, 매크로가 아닌 경우의 최고 최적화 레벨이다.
    • 4: ‘-O3 -qhot -qipa -qarch=auto -qtune=auto –qcache=auto’의 매크로이다.
    • 5: ‘-O4 -qipa=level=2’의 매크로이다.
  • -Wall: 모든 warning을 보여줍니다.
  • -Werror: 모든 warning을 error로 처리합니다.
  • -std=<cpp-version>: 컴파일할 c++버전을 선택합니다. 
  • -g: Debug 정보를 함께 넣을 수 있습니다.
  • -v: 컴파일 과정을 보다 자세히 알 수 있습니다.
  • -march=<cpu-type>: cpu-type에 최적화된 컴파일을 진행합니다.
  • ...

 

참고

반응형