コンパイラ — 小さな言語を最初から最後まで作る
작은 언어 '미니' 를 렉서·파서·의미 분석·트리 인터프리터·바이트코드 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 — 定数プール、スロット、ジャンプの後埋め
- 実行前に決められることは決めておく — バイトコード reading
- バイトコードコンパイラとスタック VM を作る lab
- クイズ:バイトコードとスタック VM quiz
中間表現と最適化 — 定数畳み込み、CFG、支配とSSA
- 同じ結果、より安いプログラム — CFG と SSA reading
- 定数を畳み込み、CFG を組み、φ の位置を求める lab
- クイズ:中間表現と最適化 quiz
x86-64 コード生成 — 呼び出し規約とスタックフレーム
- レジスタ、フレーム、そして 16 バイト — 呼び出し規約 reading
- x86-64 に移して実際に焼く lab
- クイズ:コード生成と呼び出し規約 quiz
レジスタ割り当てとガベージコレクション — 線形スキャンと mark-sweep
- レジスタは少なく値は多い — 寿命で分け、片付ける reading
- 線形スキャンでレジスタを分け、マークしてスイープする lab
- クイズ:レジスタ割り当てと GC quiz
実務コンパイラを読む — 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)