インタプリタ制作技術
(craftinginterpreters.com)- Crafting Interpreters は、自分で言語を作ってみたい読者が、完全なスクリプティング言語の実装を最初から最後まで追えるように構成された本
- パースや意味論といった言語設計の概念から、バイトコード表現、ガベージコレクションのような実行時実装までを一連の流れで扱う
- 読者は
main()から始め、動的型付け、レキシカルスコープ、第一級関数、クロージャ、クラス、継承を備えた言語を自分で実装する - 数千行規模のクリーンで高速なコードをすべて自分で書くことで、完成した成果物よりも内部動作の理解に焦点を当てる
- 印刷版、eBook、PDF、Web形式で提供されており、Webでは全チャプターと補足記事、イラストを無料で読める
本書の実装範囲
- Crafting Interpreters は、独自のプログラミング言語を作りたい人や、言語がどのように設計・実装されるのかを知りたい読者を対象としている
- 本書は、フル機能のスクリプティング言語を実装するために必要な主要トピックをまとめて扱う
- パース
- 意味論
- バイトコード表現
- ガベージコレクション
- 実装は
main()から始まり、最終的に次の機能を備えた言語へと拡張される- 豊かな構文
- 動的型付け
- レキシカルスコープ
- 第一級関数
- クロージャ
- クラス
- 継承
読み方と成果物
- 読者はサンプルコードをただ眺めるのではなく、各行を自分で書きながら言語処理系の内部構造をたどっていく
- 最終的なコードは数千行規模で、クリーンかつ高速な実装を目標に構成されている
- 上位概念と低レベル実装を分けて説明するのではなく、ひとつの言語を完成させる過程で同時に理解できるよう設計されている
提供形式
-
印刷版
- 640ページの印刷版で、高解像度の手描きイラストと、著者自身が組版したタイポグラフィを提供する
- Amazon.com
- Barnes and Noble
- Download Sample PDF
-
eBook
- 電子書籍リーダーと画面サイズに合わせたCSS、フルカラーのシンタックスハイライト、ライブハイパーリンクを提供する
- Kindle Amazon.com
- Apple Books
- Play Books Google
- Nook B&N
- EPUB Smashwords
-
PDF
- 印刷版の手作業による組版と鮮明なイラストをそのまま反映しつつ、持ち運びやすい形で提供される
- Buy from Payhip
- Download Free Sample
-
Web
- デスクトップからスマートフォンまで対応するレスポンシブデザインで提供され、全チャプターと補足記事、イラストを無料で読める
- Read Now
1件のコメント
Hacker News の意見
著者です。自分の本への好意的な反応を見ると、本当に心が温まります。多くの時間と愛情を注ぎましたし、期待していた効果があったのだと分かって、とても報われた気持ちです
この資料のおかげで大きく自信がつき、今でもそのプロジェクトは最も好きだった仕事の一つとして覚えています
Lox 用のコンパイラや JIT のような続編を書くつもりがあるのかも気になります。それから lexical analygator は最高で、社内発表にも出典付きで何度も登場しましたし、一時はホワイトボードのファンアートまでありました
著者によっては、この分野はすべて黒魔術であるかのように装わなければならないと感じているようにも思えます。あるいは単に、私が GoF のデザインパターンを理解するには力不足だったのかもしれません
Crumb(https://github.com/liam-ilan/crumb)を作るときに Crafting Interpreters を読みました。特にスコープとローカル変数の部分は不可欠でした
技術的な実装と概念的な洞察のバランスが良く、本に定められた道筋から外れようとするときにも大いに役立ちます。こういう技術文書は、目標にしたいほど質の高い資料です
ドキュメントも良いし、プロジェクトも素晴らしいです
この本で一番良かったのは、同じ言語について異なるインタプリタを2つ書くよう導いてくれる点です
そのおかげで、プログラミング言語を作る過程の、より複雑で微妙な部分をよく理解できます。本の前半で大きなアイデアに先に触れて慣れたあと、2つ目のインタプリタで再び出会うと、面白い部分をきちんと吸収できます。本当に驚くべき本です
他のコンパイラ資料の話をすると、まだ全部は見ていませんが、Immo Landwerth が C# でコンパイラを作りながら IL やデバッグシンボルなどを生成する動画も良かったです
約5年前の資料なので最新の C# 構文ではなく、.NET Core 3 あたりの時期だと思いますが、ほとんどの作業には大きな問題はないはずです。ただし nullable 型関連の警告はたくさん出るかもしれません
https://www.youtube.com/playlist?list=PLRAdsfhKI4OWNOSfS7EUu...
ほとんどのプログラマは、いつかこの本を最後までなぞってみるべきだと感じます。実際にやってみると、コンパイラや言語ツールの内部で何が起きているのかを大きく理解できるようになりました
これまで追いかけた技術ガイドの中でも指折りによく書かれていて、概念を自分のものにするうえで大いに役立ちました。その概念はコンパイラだけでなく、さまざまなところで役に立ちます
この本の副次的ながら、おそらく同じくらい重要な長所は、明瞭さを教えてくれることです
本文、コード、構成、ペース配分のすべてが明確で要点を押さえています。「Crafting」という言葉がぴったりで、職人が職人のために書いた本のように感じます
この本は、プログラミング言語コンパイラの旅における2番目か3番目の段階であるべきだと思います
最初の段階は、インタプリタや言語設計をまったく知らない状態で、自作の簡単な言語用インタプリタを一人で書いてみることです。2番目の段階は、それを書き直してミスを減らすことです
そうしないと、このテーマの微妙さをきちんと理解しにくく、重要に見えない概念をそのまま通り過ぎてしまいます
すべての技法を最初から自力で再発明しなくても大丈夫です。巨人の肩の上に立つのは自然なことです
CI のようなものを先に読んでいなければ、自分でインタプリタを書いてみようとすらしなかったでしょうし、3番目の段階まで到達できなかったはずです
再帰はなく、スタックに自分で push/pop する方式でした。問題は、パースをきちんと理解していなかったため、言語の大半を string.split と string.replace で実装してしまい、予想どおりネストできない概念が出てきたことです。ソースコードを残しておかなかったのが惜しいです
数日もしないうちにあまりに多くのバグに遭遇し、もう少し学問的な態度を持つようになって本を読み始めました。それでも素晴らしい第一歩でした。そうした試みがなければ、これが本1冊分のテーマだという事実にすら気づかなかったかもしれません
そうした献身を持つ人たちや、開発インフラを維持しているすべての人を本当に尊敬する一方で、自分の「言語を作りたい」段階が一時的な興味で終わってよかったとも感じている
作業量が本当に膨大
パラメトリック多相性や基本的な型推論のようなものを備えた 静的型付け言語を作るための良い資料を知っているか気になる
Crafting Interpreters では、変数スコープ、関数、クロージャ、クラスと動的ディスパッチ、制御フローなど、教えたいほぼすべての概念を盛り込める、小さく自己完結した言語を作れると感じていた
一方で型システムには、設計空間の分岐が多すぎて、明確な「最善」の道筋がない。サブタイピングはあるのか、ジェネリクスは消去されるのか具象化されるのか、ジェネリックコードはコンパイル時に特殊化されるのか、型推論は局所的なのか Hindley-Milner なのか、といった選択がすべて分岐になる
どの選択をしても、選ばなかった枝の重要な内容を取りこぼし、別の道を期待していた読者を失望させる可能性がある。もしかすると Types and Programming Languages のような、より広い 概説書のほうが合っているのかもしれないが、そうすると一つの一貫したものを作り上げていく楽しさは失われる
同じ本の C 版と Java 版もあるが、やや劣ると思う。ML 版と併用するのがよさそう
私は https://github.com/wh5a/Algorithm-W-Step-By-Step/blob/master... の実装が非常に古いスタイルだと見て、現代化して整理し、https://gist.github.com/kccqzy/fa8a8ae12a198b41c6339e8a5c459... まで作った。その後、いくつかの部分をわざと「壊して」、アルゴリズムがどう破綻するかを観察した
魔法使いだけができると思っていたコンピュータサイエンスの作業を、手の届く形で一つやってみることを強く勧める。一つ二つやり遂げると、難しくはあっても、概ね粘り強く押し進めていく作業なのだと分かり、大きな自信がつく。この道に進もうとしている人は zellyn@(most things) まで連絡してもよい
ちょうど第2部を終えたところで、本当に良い本。各章の提案課題のうち 一つか二つを実際にやってみる と、内容を理解するのに大いに役立つ