ISBN 9784297141929
Rustで作るプログラミング言語 -- コンパイラ/インタプリタの基礎からプログラミング言語の新潮流まで
概要
Rustでプログラミング言語を一から実装し、コンパイラ設計の全工程を体得する
想定読者
Rustの基本文法を習得済みで、コンパイラ・インタプリタの内部構造を実装を通して理解したいエンジニア
こんな人には向いていない
- Rust自体をこれから学び始める段階の読者には前提知識が不足している
- ドラゴンブックや『エンジニアのためのコンパイラ設計』のような理論的厳密さを求める読者には実装寄りで物足りない可能性がある
- LLVMバックエンドやWebAssemblyだけを単独で学びたい読者には、前章から順に読む構成が遠回りに感じられる
読了後にできるようになること
- スタックベース仮想マシンをゼロから設計・実装し、関数の再帰呼び出しまで動作させられる
- PEG文法とパーサコンビネータ(nom)を使ってASTを構築し、インタプリタとして評価できる
- 静的型システムを導入し、型チェッカーを言語ランタイムに組み込む設計ができる
- バイトコードコンパイラを実装し、コルーチン・ジェネレータを含む制御フローをバイトコードに変換できる
- inkwell経由でLLVMバックエンドを呼び出し、ネイティブコードを生成するパイプラインを構築できる
- WebAssemblyへのコンパイルとブラウザ実行まで、言語実装の出口戦略を複数理解できる
本書のキー概念(章解説)
- 第 1 章 プログラミング言語概論 — コンパイルパイプライン全体像の把握に特化。第2章以降の実装前に必読
- 第 2 章 スタックベース仮想マシン — 最小構成のVMをRustで実装し、WebAssemblyへのコンパイルまで到達する。本書の基盤となる章
- 第 3 章 プログラミング言語の構文解析 — nomとPEGを段階的に導入。設定ファイルパースなど実用例も含む
- 第 4 章 スクリプト言語ランタイム — 動的型・ループ・関数定義を実装するAST実行モデル。実務的なスクリプト言語の完成形に相当
- 第 5 章 静的型付けと型チェック — 型推論なしの宣言型チェッカーから始め、エラー位置報告まで実装する
- 第 6 章 バイトコードへのコンパイル — コルーチン・ジェネレータを含む本格的なコンパイラ実装。全章中もっとも情報密度が高い
- 第 7 章 LLVMを使ったネイティブコードへのコンパイル — inkwell経由でLLVMを呼び出す。パフォーマンス計測まで扱い、出版社サポートページに正誤が多い章
ハイライト
- 久し振りにRustを勉強したく書店で本を探していたところ、目を引くモノがあったので購入。『Rustで作るプログラミング言語』(Rust再学習の動機として書店で即購入された経緯が示されており、実践的な切り口が読者を引き付ける点を裏付ける)
- 小さなプログラミング言語から本格的なプログラミング言語へ……ステップバイステップでの開発を通して、プログラミングそのものへの理解を深めよう!(書籍の設計哲学を一文で表しており、ステップ積み上げ型の構成を購入判断前に伝える最適な一節)
外部からの言及
- コンパイラ理論書(いわゆるドラゴンブック系)の代替として、Rust実装ベースで取り組みやすい入口として紹介される傾向がある。読みやすさを評価する声が見られる(qiita)
編集メモ
Qiita言及2件・累計likes1件。出版2024年6月と新しく言及数の蓄積はまだ少ないが、書店での即購入報告やコンパイラ第2版の代替として紹介される実例がある
読む前に押さえておきたいこと
- Rustの所有権・借用・ライフタイムの基本(The Rust Programming Language 1〜10章相当の読了を目安)
- enum・パターンマッチ・トレイトを使ったRustコードが読み書きできる程度の実装経験
- スタック・ヒープ・レジスタといったCPUアーキテクチャの基礎概念の理解
- 関数呼び出しスタック・再帰の仕組みを説明できるレベルのプログラミング経験
学習のコツ
- 第1章はコンパイルパイプラインの全体像を俯瞰するための地図として機能する。実装の前に必ず通読し、各章の位置づけを把握しておくと後続の理解が格段に速くなる
- 第2章のスタックベースVMは最小構成の言語実装を最速で体験できる。コンパイラ初挑戦であれば第3章より先にここで動くものを作り、実装感覚を掴むことを勧める
- 第6章(バイトコードコンパイル)は情報密度が高く、一読では消化しきれない。コルーチン節は第4章で実装したAST実行モデルとの対比で読むと変換の意味が理解しやすい
- 出版社サポートページに第7章(LLVMバックエンド)を中心に複数の正誤表が掲載されている。第7章を読む前に確認しておくことで不要なデバッグ時間を省ける
- 各章末まで実装が完結する設計なので、関心のある言語機能(例: 静的型付け=第5章)から部分的に読むことも可能だが、VMの基礎(第2章)は前提として押さえたい
出版社による内容紹介
小さなプログラミング言語から本格的なプログラミング言語へ……ステップバイステップでの開発を通して、プログラミングそのものへの理解を深めよう! ■第1章:プログラミング言語概論 ・プログラミング言語の分類 ・他の切り口での分類方法 ・コンパイルパイプライン ■第2章:スタックベース仮想マシン ・仮想マシン概論 ・Rustでの実装 ・標準入力からの読み込み ・パースとコマンドの実行 ・ブロックとネスト構造 ・if制御構文 ・変数の定義 ・複数行のソースコードへの対応 ・関数呼び出し ・関数の再帰呼び出し ・WebAssemblyへのコンパイルとブラウザでの実行 ■第3章:プログラミング言語の構文解析 ・構文解析が解決する課題 ・構文へのマッチ ・トークンの切り出し ・括弧によるグループ化 ・木構造の構築 ・式の構文木 ・パーサコンビネータnom ・Parsing Expression Grammarによる構文解析 ・ASTインタプリタ ・関数呼び出しの構文と評価 ・設定ファイルへの応用 ■第4章:スクリプト言語ランタイム ・本章で設計する言語 ・構文と意味論 ・AST実行モデル ・文(Statement)の導入 ・変数宣言 ・代入文 ・条件分岐 ・ループ ・関数定義 ・その他の制御構文 ・動的型の導入 ■第5章:静的型付けと型チェック ・静的型システムの概要 ・型チェックの基本構成法 ・型宣言 ・式と文の型チェック ・組み込み関数の型定義 ・エラー位置の報告 ■第6章:バイトコードへのコンパイル ・バイトコードとネイティブコード ・スタックマシンとレジスタマシン ・命令セットの特徴と設計 ・バイトコードの構成 ・最小限のバイトコードの定義と実行 ・バイトコードへのコンパイル ・リテラルテーブルの実装 ・任意のソースコードをパースしてバイトコードへ翻訳 ・完全な式のコンパイルと実行 ・条件分岐式のコンパイルと実行 ・ループ制御のコンパイルと実行 ・ユーザー定義関数 ・型チェッカーとの統合 ・状態マシンとコルーチン ・コルーチンオブジェクトとジェネレータ ・応用例 ■第7章:LLVMを使ったネイティブコードへのコンパイル ・llvm-sysとinkwell ・inkwellでのHello, world! ・ネイティブコードによるパフォーマンスの向上
この本がどの学習段階で役立つかは、 関連する ロードマップ から確認できます。