1000sj
SJ CODE
1000sj
전체 방문자
오늘
어제
  • 분류 전체보기
    • Algorithms
      • Crypto
      • Formal Methods
    • Security
      • Fuzzing
      • Exploit
    • System Programming
      • Kernel
      • Compiler
      • Device Driver
      • Emulator
      • Assembly
      • Memory
      • Network
    • Architecture
      • ARM
      • RISC-V
    • Cloud Computing
      • Infrastructure
      • SDN
    • TroubleShooting
    • Performance improvements
      • Parrelel Processing
      • HPC
    • ETC
      • 문화 생활
      • 커뮤니티

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
1000sj

SJ CODE

System Programming/Compiler

Compiler 개발 #1 컴파일러 동작 원리

2025. 12. 19. 17:06

 

컴파일러란

컴파일러: 소스 언어 → 타겟 언어로 번역하는 프로그램

┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│ 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
    'System Programming/Compiler' 카테고리의 다른 글
    • LLVM Compiler Under the hood #1 컴파일 흐름 이해
    • LLVM #1 IR 이해 하기
    • LLVM #0 LLVM 구조와 동작원리
    1000sj
    1000sj

    티스토리툴바