컴파일러 — 작은 언어를 처음부터 끝까지 만든다
작은 언어 '미니' 를 렉서·파서·의미 분석·트리 인터프리터·바이트코드 VM·최적화·x86-64 코드 생성·레지스터 할당과 GC 까지 직접 만들고, 모듈마다 만든 것이 다음 모듈의 입력이 됩니다. 채점기는 적어 낸 답이 아니라 여러분의 구현을 무작위 프로그램으로 돌려 기준 구현과 대조하고, 코드 생성은 실제로 구워 실행합니다. 끝에서는 gcc·clang 의 -O0/-O2 어셈블리와 LLVM IR 을 같은 눈으로 읽어, 실무 컴파일러가 무엇을 하는지 숫자로 확인합니다.
고급 · 레슨 30 · 실습 10
커리큘럼
컴파일러가 하는 일 — 번역할 것인가, 바로 실행할 것인가
- 번역하는 프로그램과 실행하는 프로그램 reading
- gcc 를 멈춰 보고, 계산기를 두 번 만든다 lab
- 퀴즈: 컴파일러의 단계 quiz
렉서 — 글자를 토큰으로, 위치는 끝까지
- 렉서가 위치를 기억하는 이유 reading
- 위치를 기억하는 렉서를 만든다 lab
- 퀴즈: 렉서 quiz
파서 — 재귀 하강과 Pratt, 그리고 오류 복구
- 숫자 두 개로 푸는 우선순위 — Pratt 파싱 reading
- Pratt 파서와 오류 복구를 만든다 lab
- 퀴즈: 파싱과 오류 복구 quiz
의미 분석 — 스코프와 이름 해석, 알 수 있는 곳의 타입
- 문법은 맞는데 뜻이 틀렸다 — 의미 분석 reading
- 스코프와 이름 해석, 알 수 있는 곳만 보는 타입 검사 lab
- 퀴즈: 의미 분석 quiz
트리 워킹 인터프리터 — 환경과 클로저
- 선언될 때의 환경을 들고 다닌다 — 클로저 reading
- 환경과 클로저로 트리를 실행한다 lab
- 퀴즈: 인터프리터와 클로저 quiz
바이트코드와 스택 VM — 상수 풀, 슬롯, 점프 패치
중간 표현과 최적화 — 상수 접기, CFG, 지배자와 SSA
x86-64 코드 생성 — 호출 규약과 스택 프레임
- 레지스터, 프레임, 그리고 16바이트 — 호출 규약 reading
- x86-64 로 옮겨 실제로 굽는다 lab
- 퀴즈: 코드 생성과 호출 규약 quiz
레지스터 할당과 가비지 컬렉션 — 선형 스캔과 mark-sweep
실무 컴파일러 읽기 — gcc·clang 의 출력을 센다
- -O2 가 무엇을 했는지 읽는다 reading
- gcc 와 clang 의 출력을 세어 읽는다 lab
- 퀴즈: 실무 컴파일러 읽기 quiz
참고 문서
- GCC — Options That Control Optimization
- GNU as (Using as) — AT&T 문법
- System V AMD64 ABI (x86-64 psABI)
- LLVM Language Reference Manual
- Python — dis (바이트코드 디스어셈블러)
- Pratt — Top Down Operator Precedence (1973)
- Cytron et al. — Efficiently Computing SSA Form (1991)
- Poletto & Sarkar — Linear Scan Register Allocation (1999)