
C++ 컴파일러란 무엇이며, 어떻게 작동할까?
C++로 작성한 코드는 우리가 바로 실행할 수 있는 형태가 아니다. 소스 코드를 컴퓨터가 이해하고 실행할 수 있는 형태로 변환해주는 과정이 필요한데, 그 중심에는 컴파일러(Compiler)가 있다. 이 글에서는 대표적인 C++ 컴파일러들과 컴파일 과정의 4단계, 그리고 각 컴파일러의 특징에 대해 정리해본다.
컴파일러란?
컴파일러는 프로그래밍 언어로 작성된 소스 코드를 기계어로 번역해주는 프로그램이다. C++의 경우, .cpp 파일로 작성된 소스 코드를 읽고, 컴퓨터가 직접 실행할 수 있는 실행 파일(바이너리)을 생성해준다.
대표적인 C++ 컴파일러
🐧 GCC (GNU Compiler Collection)
- GNU 프로젝트에서 개발된 오픈 소스 컴파일러.
- 다양한 언어 지원: C, C++, Fortran 등.
- 리눅스 환경에서 가장 널리 사용됨.
⚡ Clang
- LLVM 프로젝트의 일부로, 빠른 컴파일과 풍부한 오류 메시지 제공.
- GCC와 호환성이 뛰어나며, macOS의 기본 컴파일러로 사용됨.
🪟 MSVC (Microsoft Visual C++)
- Windows 환경에서 Visual Studio와 함께 사용됨.
- 디버깅 툴 및 IDE와의 통합이 뛰어남.
🔧 Intel C++ Compiler (ICC)
- 인텔 CPU에 특화된 고성능 컴파일러.
- 상용 제품이지만, 수치 계산이나 과학 연산에서 최적화된 성능 제공.
C++ 컴파일 과정: 4단계
C++의 컴파일 과정은 단순히 “코드를 실행 파일로 만드는 것”이 아니다. 다음과 같은 4단계를 거친다.
1. 전처리 (Preprocessing)
#include, #define, #ifdef 등의 지시문을 처리하는 단계.
- 헤더 파일 확장, 매크로 치환 등이 이뤄짐.
#include <iostream>
#define PI 3.14
int main() {
std::cout << "PI: " << PI << '\n';
}
→ 컴파일러가 보기 전에 PI는 3.14로 치환됨.
2. 컴파일 (Compilation)
- 전처리된 코드를 바탕으로 문법 검사 및 중간 코드(IR) 생성.
- 구문 오류나 타입 오류 등을 이 단계에서 확인할 수 있음.
3. 어셈블리 (Assembly)
- 중간 코드 → 어셈블리어 → 기계어로 변환.
- 어셈블리어는 CPU 아키텍처에 따라 다르며, mov, add 같은 명령어 사용.
mov eax, 10
mov ebx, 20
add eax, ebx
4. 링킹 (Linking)
- 여러 개의 오브젝트 파일(.o/.obj)과 라이브러리(.lib/.a)를 하나로 결합.
- 함수 호출, 전역 변수 등의 참조를 해석하고 실행 가능한 프로그램 생성.
g++ main.o utils.o -o program -lm
컴파일러가 제공하는 주요 기능
- 🔍 최적화: 중복 코드 제거, 루프 전개, 함수 인라인 등 성능 개선.
- 🐞 디버깅 정보 생성: gdb, lldb 같은 디버거와 연동 가능.
- ⚠️ 경고 메시지 출력: 잘못된 코드나 비정상적인 동작 가능성 경고.
마무리
C++ 컴파일러는 단순히 코드를 “번역”하는 도구가 아니다. 코드의 품질을 높이고, 성능을 최적화하며, 안정적인 실행 파일을 생성하는 핵심 도구다. 사용하는 컴파일러에 따라 제공하는 기능이 조금씩 다르므로, 자신이 사용하는 컴파일러의 매뉴얼을 꼭 참고하자.