컴파일러(Compiler)
우리가 작성한 코드가 실제로 컴퓨터에서 동작하려면, 컴퓨터가 이해할 수 있는 기계어 수준의 언어로 번역되어야 합니다. 이 번역을 수행하는 핵심 도구가 바로 컴파일러(Compiler)입니다.
이 글에서는 컴파일러가 무엇을 하는 도구인지, 그리고 인터프리터와 어떤 차이가 있는지, 어떻게 코드를 분석하고 변환하는지, 대표적인 컴파일 언어와 컴파일러 도구는 무엇인지에 대해 단계별로 정리해봅니다.
1. 컴파일러란?
컴파일러(Compiler)는 개발자가 작성한 고급 프로그래밍 언어(예: C, Java, Rust)를 기계어 또는 실행 가능한 저수준 코드(예: 바이너리, 어셈블리어)로 변환하는 프로그램입니다. 이 변환 과정은 단순한 문법 치환이 아니라, 코드를 분석하고 최적화한 후 컴퓨터가 이해할 수 있는 형태로 "한 번에" 번역하는 것을 의미합니다.
컴파일러는 프로그래밍 언어의 핵심 구성 요소이며, 우리가 만든 프로그램이 실제로 컴퓨터에서 동작하게 하는 데 필수적인 도구입니다.
컴파일 과정의 전체 흐름
컴파일러는 단순한 번역기 그 이상입니다. 다음과 같은 여러 단계로 구성되어 있으며, 각 단계에서 중요한 역할을 합니다.
컴파일러의 주요 단계
- 어휘 분석 (Lexical Analysis)
- 소스 코드를 토큰(token) 단위로 분리
- 예: int age = 10; → [int, age, =, 10, ;]
- 구문 분석 (Syntax Analysis)
- 문법적으로 올바른 구조인지 확인 (파싱)
- 파싱 트리(구문 트리) 생성
- 의미 분석 (Semantic Analysis)
- 변수 타입, 선언 여부, 스코프 등 의미적 오류 검사
- 중간 코드 생성 (Intermediate Code Generation)
- 플랫폼 독립적인 중간 표현(IR, Intermediate Representation) 생성
- 최적화 (Optimization)
- 실행 성능을 개선하기 위한 코드 개선
- 기계어 코드 생성 (Code Generation)
- 실제 실행 가능한 바이너리 또는 어셈블리 코드 생성
- 코드 출력 (Code Emission)
- .exe, .out 등 실행 파일로 출력
컴파일러의 장점과 단점
장점
- 실행 속도가 빠름
- 코드 최적화 가능
- 컴파일 시점에 오류 발견 가능 → 디버깅 쉬움
단점
- 컴파일 시간이 필요함
- 플랫폼 의존성이 있을 수 있음 (예: OS에 따라 다름)
- 컴파일 오류가 많을 경우 진입 장벽이 있음
2. 컴파일 언어 vs 인터프리터 언어 vs 트랜스파일러
항목 | 컴파일러 언어 | 인터프리터 언어 |
실행 방식 | 전체 코드를 미리 번역 (컴파일) | 한 줄씩 읽으며 즉시 실행 |
속도 | 빠름 (한 번만 컴파일하면 됨) | 느림 (매번 해석 필요) |
오류 발견 시점 | 컴파일 타임에 오류 감지 | 런타임 중 오류 발생 가능 |
예시 언어 | C, C++, Rust, Go | Python, JavaScript, Ruby |
비유로 이해하기
- 컴파일러 : 책 전체를 한 번에 번역해서 한 권의 번역본 책을 만든다
- 인터프리터 : 원서를 한 페이지씩 읽고 실시간으로 통역해준다
트랜스파일러와의 차이점은?
항목 | 컴파일러 | 트랜스파일러 |
변환 대상 | 고급 언어 → 기계어 | 고급 언어 A → 고급 언어 B (또는 같은 언어의 다른 버전) |
목적 | 실행 가능한 프로그램 생성 | 개발 편의성, 호환성 |
예 | GCC(C → 기계어), Rustc(Rust → 기계어) | Babel(ES6 → ES5), TypeScript(ts → js) |
3. 대표적인 컴파일러와 언어
언어 | 컴파일러 이름 | 특징 |
C/C++ | GCC, Clang, MSVC | 전통적인 시스템 프로그래밍 언어 |
Java | javac (→ 바이트코드) | JVM 위에서 실행 (중간 형태로 컴파일) |
Go | go build | 빌드가 빠르고 단일 실행 파일 생성 |
Rust | rustc | 안전성과 성능을 모두 고려한 시스템 언어 |
Kotlin | kotlinc | JVM, JS, Native 모두 지원 |
4. 마무리
- 컴파일러는 소스 코드를 한 번에 실행 파일로 변환하는 도구입니다.
- 여러 단계를 거쳐 코드 분석, 최적화, 변환 과정을 수행합니다.
- 컴파일러 언어는 속도가 빠르고 안정성이 높지만, 초보자에게는 다소 진입 장벽이 있을 수 있습니다.
- 대표적인 컴파일 언어에는 C, C++, Rust, Go 등이 있으며, 각 언어마다 고유한 컴파일러가 존재합니다.
- 트랜스파일러와는 변환 대상과 목적이 다르며, 자바스크립트에서는 Babel이나 TypeScript가 대표적인 트랜스파일러입니다.
함께 보면 좋은 자료
블로그 글 :
[트랜스파일러] 자바스크립트 세계의 번역가
트랜스파일러(Transpiler) 트랜스파일러(Transpiler)는 소스 코드를 다른 언어가 아닌 같은 계열의 언어로 변환해 주는 컴파일러입니다. 주로 최신 문법의 코드를 구형 환경에서도 동작 가능하도록 변
dachaes-devlogs.tistory.com
[인터프리터] 한 줄씩 읽고 실행하는 언어의 실행자
인터프리터(Interpreter) 프로그래밍 언어는 우리가 작성한 코드가 실제로 컴퓨터에서 실행되기 위해 무언가의 해석 또는 번역 과정을 거쳐야 합니다. 그 중심에 있는 두 가지 핵심 개념이 바로 컴
dachaes-devlogs.tistory.com
[모듈 번들러] 프론트엔드 필수 도구의 개념과 대표 번들러 비교
모듈 번들러(Module Bundler) 현대 웹 개발에서는 수많은 자바스크립트 파일과 다양한 자산(CSS, 이미지, 폰트 등)을 효율적으로 관리하고 최적화할 필요가 있습니다. 이런 복잡도를 해결하고, 효율적
dachaes-devlogs.tistory.com
'개발 도구 및 빌드 시스템 > Build Tools' 카테고리의 다른 글
[인터프리터] 한 줄씩 읽고 실행하는 언어의 실행자 (0) | 2025.04.15 |
---|---|
[트랜스파일러] 자바스크립트 세계의 번역가 (0) | 2025.04.15 |
[모듈 번들러] 프론트엔드 필수 도구의 개념과 대표 번들러 비교 (0) | 2025.04.14 |