概要
- プログラミング初心者がコンパイラ本に直面する難しさの指摘
- 多くの入門書が難解で実践的な知識に繋がりにくい現状
- Jack Crenshawの「Let’s Build a Compiler!」シリーズの紹介
- 内部表現(抽象構文木)の重要性と高水準言語の利点
- Nanopass Frameworkの考え方と学習への活用提案
コンパイラ本の難しさと神話
- プログラミング初心者 がAmazonで高評価の本「The Art of Computer Programming」を購入する状況の例示
- 全ての入門書が高度すぎる というコンパイラ本の現状
- 内容が広範囲すぎて どこから始めるべきかわからない問題
- 正規表現から状態機械、文法理論まで 分厚い章 が続く構成
- 読破しても 実際のコンパイラ作成 には結びつきにくい現実
- この難解さが「 コンパイラは難しい」という 神話 を生む原因
Jack Crenshawの「Let’s Build a Compiler!」シリーズ
- Jack Crenshaw による1988年開始の連載「Let’s Build a Compiler!」の紹介
- Turbo Pascalクラス のシンプルなコンパイラを題材
- シングルパスで パースとコード生成を一体化、最小限の最適化のみ実装
- Pascal での実装例が中心だが、 CやForth版 も存在
- Forth版 は対話的で実験しやすく、理解が容易
- このシリーズの大きな欠点は 抽象構文木(AST) などの内部表現がない点
抽象構文木(AST)と高水準言語
- 内部表現を省略することで 柔軟性を犠牲 にしている問題
- Pascalでは 木構造操作が煩雑 なため、チュートリアルでは省略
- Python, Ruby, Erlang, Haskell, Lisp などの高水準言語では 木構造の扱いが容易
- 特に Lisp, Erlang, Haskell は 木構造データの操作 を得意とする設計
Nanopass Frameworkの提案
- Sarkar, Waddell, Dybvig による「A Nanopass Framework for Compiler Education」の紹介
- 重要なコンセプトは 「コンパイラ=内部表現の変換の連続」 という発想
- 1パスごとに 単純な変換処理 を行い、 複雑な変換は分割 して独立させる方針
- 各パスの 入出力仕様を明確化 するフレームワーク
- Scheme で実装され、動的型付けによる 実行時検証 が特徴
学習ステップの提案
- 1~2本のコンパイラ を自作して基礎を体得
- その後で「 Dragon Book」などの有名専門書に挑戦する選択肢
- 場合によっては 専門書が不要 になる可能性も示唆