컴파일러란
컴파일러: 소스 언어 → 타겟 언어로 번역하는 프로그램
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Source Code │ ──▶ │ Compiler │ ──▶ │ Target Code │
│ (C, Java) │ │ │ │ (기계어/어셈블리)│
└──────────────┘ └──────────────┘ └──────────────┘
인터프리터와의 차이
| 구분 | 컴파일러 | 인터프리터 |
| 동작 | 전체 번역 후 실행 | 한 줄씩 즉시 실행 |
| 속도 | 실행 빠름 ✅ | 실행 느림 |
| 디버깅 | 에러 위치 파악 어려움 | 에러 진단 쉬움 ✅ |
| 예시 | C, C++, Go | Python, Ruby |
컴파일러 구조
두 부분으로 나뉨
| Analysis (분석) | 소스 코드를 쪼개고 구조 파악 | Front-end |
| Synthesis (합성) | 중간 표현 → 타겟 코드 생성 | Back-end |
컴파일러의 단계 (Phases)
position = initial + rate * 60
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 1. Lexical Analyzer (어휘 분석기) │
│ 문자 스트림 → 토큰 스트림 │
│ 결과: ⟨id,1⟩ ⟨=⟩ ⟨id,2⟩ ⟨+⟩ ⟨id,3⟩ ⟨*⟩ ⟨60⟩ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 2. Syntax Analyzer (구문 분석기) │
│ 토큰 → 파스 트리 (Parse Tree) │
│ = │
│ / \ │
│ ⟨id,1⟩ + │
│ / \ │
│ ⟨id,2⟩ * │
│ / \ │
│ ⟨id,3⟩ 60 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 3. Semantic Analyzer (의미 분석기) │
│ 타입 검사, 의미 검증 │
│ 예: 60 (int) → 60.0 (float) 타입 변환 삽입 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 4. Intermediate Code Generator (중간 코드 생성기) │
│ 기계 독립적인 중간 표현 │
│ t1 = inttofloat(60) │
│ t2 = id3 * t1 │
│ t3 = id2 + t2 │
│ id1 = t3 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 5. Code Optimizer (코드 최적화기) │
│ 중간 코드 개선 │
│ t1 = id3 * 60.0 │
│ id1 = id2 + t1 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 6. Code Generator (코드 생성기) │
│ 타겟 기계어 생성 │
│ LDF R2, id3 │
│ MULF R2, R2, #60.0 │
│ LDF R1, id2 │
│ ADDF R1, R1, R2 │
│ STF id1, R1 │
└─────────────────────────────────────────────────────────────┘
Symbol Table
모든 단계에서 공유하는 자료구조:
| 이름 | 타입 | 주소 |
| position | float | ... |
| initial | float | ... |
| rate | float | ... |
컴파일러 파이프라인
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 소스 코드 │ ──▶ │ 렉서 │ ──▶ │ 파서 │ ──▶ │ 코드 생성 │
│ (텍스트) │ │ (Lexer) │ │ (Parser) │ │ (CodeGen) │
└─────────────┘ └──────┬──────┘ └──────┬──────┘ └─────────────┘
│ │
▼ ▼
token_vec AST (추상 구문 트리)
1. 렉서: 소스 코드 → 토큰 벡터 (`lex_process->token_vec`)
2. 파서: 토큰 벡터 → AST (추상 구문 트리)
3, 코드 생성: AST → 기계어/어셈블리
References
- Dragon Book Compilers Principle Techniques and Tools 2nd Edtion.pdf
- dfsdf
'System Programming > Compiler' 카테고리의 다른 글
| LLVM Compiler Under the hood #1 컴파일 흐름 이해 (0) | 2026.01.14 |
|---|---|
| LLVM #1 IR 이해 하기 (0) | 2025.11.11 |
| LLVM #0 LLVM 구조와 동작원리 (0) | 2025.11.10 |