- プログラミング言語の設計と実装を自ら学び、完全なスクリプト言語を作る過程を扱う本
- パース、意味論、バイトコード、ガベージコレクションなど、高水準の概念から低水準の実装までを段階的に説明
main() 関数から始めて、動的型付け、レキシカルスコープ、第一級関数、クラス、継承を含む言語を自分で実装
- 印刷版、eBook、PDF、Web版の4つの形式で提供され、Webでは全内容を無料で閲覧可能
- Google の Dart 言語開発者 Robert Nystromによる著作で、言語作成に関心のある開発者にとって実践的な学習資料として重要
本の概要
- Crafting Interpreters は、完全な機能を備えた効率的なスクリプト言語を自分で実装する方法を扱う本
- パースや意味論のような高水準の概念と、バイトコード表現やガベージコレクションのような低水準の実装詳細の両方を含む
- 読者が自らコードを書きながら、言語の構造を完全に理解できるように構成されている
- 完成する言語は、豊富な文法、動的型付け、ガベージコレクション、レキシカルスコープ、第一級関数、クロージャ、クラス、継承をサポート
- 数千行の簡潔で高速なコードで構成されており、すべてのコードを読者自身が実装する
提供形式
- 本は Print、eBook、PDF、Web の4つの形式で提供
- Print: 640ページ分量で、高解像度の手描きイラストと洗練されたタイポグラフィを含む
- eBook: CSS がデバイス画面サイズに合わせて調整され、カラーのシンタックスハイライトとハイパーリンクをサポート
- PDF: 印刷版の組版とイラストをそのまま再現しつつ、携帯性を高めた形式
- Web: レスポンシブデザインで全章とイラストを含み、全体を無料で閲覧可能
著者紹介
- 著者 Robert Nystrom は Google で Dart 言語開発に携わっている
- 過去には Electronic Arts で8年間ゲーム開発を担当
- ベストセラー Game Programming Patterns の著者であり、同書も無料公開されている
- 言語作成に魅了され、複数の**趣味の言語プロジェクト(Wren、Magpie、Finch、Vigil)**を開発
- 個人ブログや X(
@munificentbob)で活動し、著書に関連したメーリングリストも運営
アクセスと購入先
- 印刷版は Amazon、Barnes & Noble、Book Depository など主要書店で購入可能
- eBook は Kindle、Apple Books、Google Play Books、Smashwords などで提供
- PDF 版は Payhip で購入可能で、無料サンプル PDF のダウンロードも提供
- Web 版は公式サイトで全編を無料で閲覧可能
1件のコメント
Hacker Newsのコメント
おかげで、visitorが不要なクラス階層継承(Class Hierarchy Inheritance)の概念も完全に理解できた
Newspeak言語ではクラスの中にネストしたクラスを置くことができ、継承時にはそのネストしたクラスも一緒に継承される
この機能がFree Object Algebrasを可能にしていることが、このブログ記事で扱われている
参考: Expression Problemの記事, Newspeak公式サイト
2020年には777ポイント、2024年には607ポイントを記録した
さまざまな言語機能やパターンを自分で実装しながら学べるからだ
Javaにない機能を持つ言語では似たようなパターンを適用しにくいが、その挑戦自体が楽しかった
著者のくだけた文体と随所にあるユーモアが本当に気に入った
「Loxに型チェッカーを追加する」のような続編が出てほしい
最初は紙の本を買ったが、大きくて重すぎたので結局電子書籍を買い直した
メモや検索がずっと便利だ
それでも読んでいると山の中で道に迷ったような気分になることがある :)
著者の別の本であるGame Programming Patternsもおすすめする
印刷所なら簡単にやってくれるし、机の上で扱いやすさがずっと増す
ただし Crafting Interpreters は絶対に捨てられない本なので、そのままにしている
それほど素晴らしい本だ
しかもWeb版が無料なのは本当に寛大だ
ただ、Java版が古いのは残念だ
最近追加されたsealed classesやexhaustive switchのような機能を反映した改訂版があればと思う
そうすれば著者が作った一時的なコード生成ツールは不要になる
PEGベースのパーサーにcontext stackを追加するハック的なアプローチもあるが、構文切り替えの問題は依然として難しい
persistent data structureやtransactional data structureが役立ちそうだが、まだ明確な形式化は見つけられていない
パーサーがlexerに状態を渡すようにして、型名の集合をlexerが分かるようにする方式だ
たとえば Parsec のようなライブラリで‘do’記法を使うと、各段階の結果を後続のパーサーと共有できる
幸いRustやGoはこうした問題を避けており、慎重な設計で十分防げる
shiプロジェクト と、C言語の方に興味があるなら hacktical-c を参考にするとよい