3 ポイント 投稿者 GN⁺ 2024-07-13 | 1件のコメント | WhatsAppで共有
  • Crafting Interpreters は、自分で言語を作ってみたい読者が、完全なスクリプティング言語の実装を最初から最後まで追えるように構成された本
  • パースや意味論といった言語設計の概念から、バイトコード表現、ガベージコレクションのような実行時実装までを一連の流れで扱う
  • 読者は main() から始め、動的型付け、レキシカルスコープ、第一級関数、クロージャ、クラス、継承を備えた言語を自分で実装する
  • 数千行規模のクリーンで高速なコードをすべて自分で書くことで、完成した成果物よりも内部動作の理解に焦点を当てる
  • 印刷版、eBook、PDF、Web形式で提供されており、Webでは全チャプターと補足記事、イラストを無料で読める

本書の実装範囲

  • Crafting Interpreters は、独自のプログラミング言語を作りたい人や、言語がどのように設計・実装されるのかを知りたい読者を対象としている
  • 本書は、フル機能のスクリプティング言語を実装するために必要な主要トピックをまとめて扱う
    • パース
    • 意味論
    • バイトコード表現
    • ガベージコレクション
  • 実装は main() から始まり、最終的に次の機能を備えた言語へと拡張される
    • 豊かな構文
    • 動的型付け
    • レキシカルスコープ
    • 第一級関数
    • クロージャ
    • クラス
    • 継承

読み方と成果物

  • 読者はサンプルコードをただ眺めるのではなく、各行を自分で書きながら言語処理系の内部構造をたどっていく
  • 最終的なコードは数千行規模で、クリーンかつ高速な実装を目標に構成されている
  • 上位概念と低レベル実装を分けて説明するのではなく、ひとつの言語を完成させる過程で同時に理解できるよう設計されている

提供形式

  • 印刷版

  • eBook

  • PDF

  • Web

    • デスクトップからスマートフォンまで対応するレスポンシブデザインで提供され、全チャプターと補足記事、イラストを無料で読める
    • Read Now

1件のコメント

 
GN⁺ 2024-07-13
Hacker News の意見
  • 著者です。自分の本への好意的な反応を見ると、本当に心が温まります。多くの時間と愛情を注ぎましたし、期待していた効果があったのだと分かって、とても報われた気持ちです

    • 独学で、しかも21歳になってからプログラミングを始めたソフトウェアエンジニアですが、最初の職場で簡単なクエリ言語とそのインタプリタを作る仕事を任されました。インタプリタが何なのかまったく分かりませんでしたが、2017年にオンラインでこの本を見つけ、3〜4日で動くプロトタイプを作り、1〜2週間後には実際の製品まで作ることができました
      この資料のおかげで大きく自信がつき、今でもそのプロジェクトは最も好きだった仕事の一つとして覚えています
    • 本を書いてくれてありがとう。今は第1部をほぼ終えつつあり、ただやってみたくて Haskell で追いかけているのですが、各章ごとに自分が考えた「賢い小技」が、後の要件の前ではあまり賢くなかったのだと気づかされます
      Lox 用のコンパイラや JIT のような続編を書くつもりがあるのかも気になります。それから lexical analygator は最高で、社内発表にも出典付きで何度も登場しましたし、一時はホワイトボードのファンアートまでありました
    • Game Programming Patterns も素晴らしいです。どちらの本も文体が率直でまっすぐだという印象があります
      著者によっては、この分野はすべて黒魔術であるかのように装わなければならないと感じているようにも思えます。あるいは単に、私が GoF のデザインパターンを理解するには力不足だったのかもしれません
    • まだ本を最後まで終えてはいませんが、オンラインで無料公開してくれていることに本当に感謝しています。紙の本、PDF、Kindle版をすべて買いましたし、他の人にもそうやって著者を支援するよう勧めています
    • この本と Writing An Interpreter In Go は、時間がもっとできたら必ず読みたい本です。基本的な組版言語を作ってみたいアイデアがかなりあります
  • Crumb(https://github.com/liam-ilan/crumb)を作るときに Crafting Interpreters を読みました。特にスコープとローカル変数の部分は不可欠でした
    技術的な実装と概念的な洞察のバランスが良く、本に定められた道筋から外れようとするときにも大いに役立ちます。こういう技術文書は、目標にしたいほど質の高い資料です

    • 「志望エンジニア」と言っていましたが、Crumb を作ったのを見る限り、もう良い知らせがありますね
    • すでにエンジニアと呼んでいいと思います。謙遜する必要はありませんし、コンピュータサイエンスの学位を取り終えなければエンジニアになれないわけではありません
      ドキュメントも良いし、プロジェクトも素晴らしいです
    • かっこよく見えます。どんなデータ型を入れるか、どう決めたのか気になります
  • この本で一番良かったのは、同じ言語について異なるインタプリタを2つ書くよう導いてくれる点です
    そのおかげで、プログラミング言語を作る過程の、より複雑で微妙な部分をよく理解できます。本の前半で大きなアイデアに先に触れて慣れたあと、2つ目のインタプリタで再び出会うと、面白い部分をきちんと吸収できます。本当に驚くべき本です

  • 他のコンパイラ資料の話をすると、まだ全部は見ていませんが、Immo Landwerth が C# でコンパイラを作りながら IL やデバッグシンボルなどを生成する動画も良かったです
    約5年前の資料なので最新の C# 構文ではなく、.NET Core 3 あたりの時期だと思いますが、ほとんどの作業には大きな問題はないはずです。ただし nullable 型関連の警告はたくさん出るかもしれません
    https://www.youtube.com/playlist?list=PLRAdsfhKI4OWNOSfS7EUu...

  • ほとんどのプログラマは、いつかこの本を最後までなぞってみるべきだと感じます。実際にやってみると、コンパイラや言語ツールの内部で何が起きているのかを大きく理解できるようになりました
    これまで追いかけた技術ガイドの中でも指折りによく書かれていて、概念を自分のものにするうえで大いに役立ちました。その概念はコンパイラだけでなく、さまざまなところで役に立ちます

    • コンパイラ以外だと、どこで有用なのか気になります。たとえばデータ形式のパースのような場面かもしれません
  • この本の副次的ながら、おそらく同じくらい重要な長所は、明瞭さを教えてくれることです
    本文、コード、構成、ペース配分のすべてが明確で要点を押さえています。「Crafting」という言葉がぴったりで、職人が職人のために書いた本のように感じます

  • この本は、プログラミング言語コンパイラの旅における2番目か3番目の段階であるべきだと思います
    最初の段階は、インタプリタや言語設計をまったく知らない状態で、自作の簡単な言語用インタプリタを一人で書いてみることです。2番目の段階は、それを書き直してミスを減らすことです
    そうしないと、このテーマの微妙さをきちんと理解しにくく、重要に見えない概念をそのまま通り過ぎてしまいます

    • 私にとってこの本は、こうしたテーマを神秘的なものに見えなくしてくれ、むしろ2番目と3番目の段階を始められるようにしてくれました
      すべての技法を最初から自力で再発明しなくても大丈夫です。巨人の肩の上に立つのは自然なことです
    • どこから始めればいいのか分からず、こういうプロジェクトは自分の能力を超えた魔法のようなものだと思っていました。ところが Crafting Interpreters を読んでみると、考え方にほんの少し背中を押してもらうだけでよかったのだと分かりました
      CI のようなものを先に読んでいなければ、自分でインタプリタを書いてみようとすらしなかったでしょうし、3番目の段階まで到達できなかったはずです
    • Java を学び始めたばかりのころ、自分で言語を作りたかった記憶があります。調べもせずに演算子優先順位アルゴリズムを実装したのですが、トークンのリストを走査しながら、毎回優先順位が最も高い部分式を探すというものでした
      再帰はなく、スタックに自分で push/pop する方式でした。問題は、パースをきちんと理解していなかったため、言語の大半を string.split と string.replace で実装してしまい、予想どおりネストできない概念が出てきたことです。ソースコードを残しておかなかったのが惜しいです
    • 私もまさにそうしました。最初の段階として、TeX に似た言語を作り、マクロ定義と置換を実装しました
      数日もしないうちにあまりに多くのバグに遭遇し、もう少し学問的な態度を持つようになって本を読み始めました。それでも素晴らしい第一歩でした。そうした試みがなければ、これが本1冊分のテーマだという事実にすら気づかなかったかもしれません
  • そうした献身を持つ人たちや、開発インフラを維持しているすべての人を本当に尊敬する一方で、自分の「言語を作りたい」段階が一時的な興味で終わってよかったとも感じている
    作業量が本当に膨大

    • 必ずしも膨大な作業量である必要はない。もともとの SICP 本にある Lisp-in-Lisp や、Haskell で書かれたラムダ計算インタプリタは、1画面にも収まる
  • パラメトリック多相性や基本的な型推論のようなものを備えた 静的型付け言語を作るための良い資料を知っているか気になる

    • こういう本を書いてほしいという要望は何度も受けているが、まだ書いていない大きな理由は、テーマがあまりにも開かれているから
      Crafting Interpreters では、変数スコープ、関数、クロージャ、クラスと動的ディスパッチ、制御フローなど、教えたいほぼすべての概念を盛り込める、小さく自己完結した言語を作れると感じていた
      一方で型システムには、設計空間の分岐が多すぎて、明確な「最善」の道筋がない。サブタイピングはあるのか、ジェネリクスは消去されるのか具象化されるのか、ジェネリックコードはコンパイル時に特殊化されるのか、型推論は局所的なのか Hindley-Milner なのか、といった選択がすべて分岐になる
      どの選択をしても、選ばなかった枝の重要な内容を取りこぼし、別の道を期待していた読者を失望させる可能性がある。もしかすると Types and Programming Languages のような、より広い 概説書のほうが合っているのかもしれないが、そうすると一つの一貫したものを作り上げていく楽しさは失われる
    • A. W. Appel の Modern Compiler Implementation in ML がある
      同じ本の C 版と Java 版もあるが、やや劣ると思う。ML 版と併用するのがよさそう
    • パラメトリック多相性と型推論の核心は、結局 Algorithm W の実装。オンラインでおもちゃ実装を探して、自分でいじってみればいい
      私は https://github.com/wh5a/Algorithm-W-Step-By-Step/blob/master... の実装が非常に古いスタイルだと見て、現代化して整理し、https://gist.github.com/kccqzy/fa8a8ae12a198b41c6339e8a5c459... まで作った。その後、いくつかの部分をわざと「壊して」、アルゴリズムがどう破綻するかを観察した
    • もう少し理論寄りだが、Coursera の コンパイラ講義をゆっくり追ったことが、自分にとっては大きな転機だった。動画によっては何度も見直す必要があった
      魔法使いだけができると思っていたコンピュータサイエンスの作業を、手の届く形で一つやってみることを強く勧める。一つ二つやり遂げると、難しくはあっても、概ね粘り強く押し進めていく作業なのだと分かり、大きな自信がつく。この道に進もうとしている人は zellyn@(most things) まで連絡してもよい
  • ちょうど第2部を終えたところで、本当に良い本。各章の提案課題のうち 一つか二つを実際にやってみる と、内容を理解するのに大いに役立つ