반응형
컴파일(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)를 생성하여 링커로 전달합니다.
- 해석 유닛 생성 (Translation Unit): 소위 말하는 컴파일이 이루어집니다.
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에 최적화된 컴파일을 진행합니다.
- ...
참고
- [씹어먹는 C++]: 코드 부터 실행 파일 까지 https://modoocode.com/319
- [씹어먹는 C++]: 코드 부터 실행 파일 까지: 컴파일 https://modoocode.com/320
- [코드없는 프로그래밍] 빌드 컴파일 소개: https://www.youtube.com/watch?v=x45lr3ZhLKM&list=PLDV-cCQnUlIY4TMoRsrW0oqjCLTSm1nAf&index=2
반응형
'Study: ComputerScience(CS) > CS: Basic' 카테고리의 다른 글
[CS] 캐시(Cache)란? (0) | 2022.07.06 |
---|---|
[CS] 링킹(Linking)에 대해 보다 심도있는 내용 (0) | 2022.07.05 |
[CS] 래퍼(Wrapper) 클래스란? (0) | 2022.07.04 |
[CS] 컴파일(Compile), 링킹(Linking), 빌드(Build), 배포(Release, Deploy, Distribute) 란? (0) | 2022.06.17 |
[CS] 컴퓨터 CPU 용어: CPU 코어, 쓰레드, 클럭, 캐시메모리 (0) | 2022.06.17 |