ISBN 9784873118222
Go言語でつくるインタプリタ
- 出版社
- オライリー・ジャパン
- 刊行
- 2018-06
概要
Monkey言語の実装を通じてインタプリタ設計とGo言語を習得する
想定読者
Go言語の基礎を持ち、言語処理系の内部構造やコンパイラの仕組みに興味のあるエンジニア
こんな人には向いていない
- 言語処理系の実装経験が豊富で、最適化・GCアルゴリズム・型推論など本格的な実装理論を求める読者には内容の深さが不足する
- Go言語自体を初めて学ぶことが主目的の読者には、言語学習と処理系実装を同時に進めることになり負荷が高い
この本で身につくこと
- 字句解析器(Lexer)がソースコードをトークン列に変換する仕組みをGoで実装できる
- 再帰下降構文解析によって抽象構文木(AST)を構築するパーサーを自作できる
- ツリーウォーキング評価器(Evaluator)でスコープ・クロージャ・関数オブジェクトを実装できる
- REPL(Read-Eval-Print Loop)の基本構造を理解し、自作言語上で動作させられる
- テスト駆動で言語処理系を段階的に構築するGoのコーディングパターンを身につけられる
ハイライト(外部からの言及)
Go言語を使って架空のプログラミング言語のインタプリタを作りながら言語の作り方とコンピュータの内部の動作を学ぶ書籍です。300ページ弱の分量で — 出典
「何を作るか」と「何が学べるか」が端的に示されており、本書の学習範囲と分量を端的に把握できる記述
この本の写経でGo言語を覚え、プログラミング言語の動作原理を学び、テスト駆動開発(TDD)を知りました。一石三鳥の本です! — 出典
「Go習得・言語処理系の動作原理・TDD」の3つを1冊で同時習得できたという読者の体験談。書籍概要を示す既存ハイライトに対し、実際の学習成果を読者自身の言葉で補完する
goの標準ツール以外は使うことなく、フルスクラッチで書いていくので理解がしやすい。インタプリタ、コンパイラの大枠を掴むとっかかりになる。 — 出典
外部ライブラリを一切使わないフルスクラッチ実装という本書の設計方針に言及し、言語処理系・コンパイラ入門への足がかりとして機能する点を述べる。「アプローチの特徴」という他ハイライトと重ならない角度
読了後にできること
Before(読む前): プログラミング言語がどのようにソースコードを解釈・実行しているかを「ブラックボックス」のまま使っていた
After(読み終えた後): 字句解析・構文解析・評価の一連のパイプラインを実装レベルで説明でき、RustやTypeScriptなど他の言語で同様の処理系を自作できる土台が身につく
章立て
第1章 字句解析
Lexer 実装。Go の slice / map / struct に慣れながら言語実装の基礎を掴む章
第2章 構文解析
Pratt parsing(演算子優先順位)を Go で実装。本書のハイライトとなる章
第3章 評価
AST を直接評価する Tree-walking interpreter を完成させる章。動くインタプリタが手に入る
第4章 インタプリタの拡張
string / array / hash map / built-in 関数を追加し、本書 Monkey 言語の表現力を上げる章
付録: マクロシステム
Lisp 風の準クォート / クォートを実装。コードがデータを操作する世界を体験できる
関連記事 / 参考情報
- Go言語関連書籍のまとめ — Goエンジニアが選ぶ実践書として本書を紹介するGo書籍リファレンス集
- Rust でつくるインタプリタ — 本書のMonkey言語実装をGoからRustに移植した実践記録。GoとRustのコード差分を比較しながら読める
- 新人プログラマの方におすすめしたい技術書5選 — 実装を通じた学習アプローチを評価し、本書を5冊の一つとして新人エンジニアに推薦している
- [Rust] 『Go言語でつくるインタプリタ』Rustで読了 — 全章をRustで実装しながら読み通した読了記。GoとRustの実装差異を整理している
- ワンライナー向け自作言語「Pangaea」の紹介 — 本書のMonkey言語をベースに機能拡張した自作言語Pangaeaの設計と実装を紹介
- Monkey言語に機能を追加する! — 本書のMonkey言語に独自機能を追加した実装例。読了後の発展的な実践として参考になる
学習のヒント
- 各章の末尾でREPLが一段階動作するよう設計されているため、動作確認を都度行いながら進めると達成感を維持しやすい
- 読了後にRustやTypeScriptなど別言語で同じMonkey言語を実装し直すと、Go固有の実装と言語処理系の本質的な構造を分離して理解できる(Qiitaに複数の移植実践事例あり)
- Evaluatorの章(スコープ・クロージャの実装)は他章と比べて難易度が上がるため、Goのクロージャとinterface{}の動きを事前に確認してから読むと詰まりにくい
前提知識
- Go言語の基本文法(変数・関数・型定義・インターフェース)とパッケージ構成
- 「ソースコードが実行される」という流れのおおまかなイメージ(コンパイル型・インタプリタ型の区別程度で十分)
次に読む本
Writing A Compiler In Go(Go言語でつくるコンパイラ)
本書はツリーウォーキング型インタプリタを実装するが、続編では同一の Monkey 言語をバイトコードコンパイラ+仮想マシン方式に置き換える。同一言語仕様を題材にするため本書との差分が明確で、実行速度改善の理論的背景も合わせて習得できる。
コンパイラ ―原理・技法・ツール(ドラゴンブック)
本書では字句解析・構文解析・評価の各フェーズを実装ベースで学ぶが、背後の形式言語理論(正規表現と有限オートマトン、文脈自由文法と LL/LR 解析)は扱わない。これらの理論基盤を体系的に補完したい段階でドラゴンブックの第 2〜4 章が対応する。
出版社による内容紹介
Go言語を使って架空のプログラミング言語のインタプリタを作ることで言語の作り方やコンピュータの仕組みを学ぶ ! Go言語を使って架空のプログラミング言語のインタプリタを作りながら言語の作り方とコンピュータの内部の動作を学ぶ書籍です。300ページ弱の分量で、インタプリタがどのように作られているのかを実際に言語を作りながら学ぶことができるます。
この本がどの学習段階で役立つかは、 関連する ロードマップ から確認できます。