これは、進行中の書籍「Crafting Interpreters」に使用されるリポジトリです。これには、本の Markdown テキスト、両方のインタープリターの完全な実装、および 2 つを最終サイトに織り込むためのビルド システムが含まれています。
エラーを見つけた場合、または提案がある場合は、ここで問題を報告してください。ありがとう!
オンラインで本を執筆し、完成前に公開することの絶対的な利点の 1 つは、あなたのような人々が親切にフィードバックをくれたり、タイプミスを指摘してくれたり、その他の間違いや不明瞭な文章を見つけてくれたりすることです。
もしそうしたいなら、それは素晴らしいことです!ここのリポジトリにバグを報告することも、その気になればプル リクエストを送信することもできます。プル リクエストを送信したいが、HTML を再生成するようにビルド システムをセットアップしたくない場合でも、心配する必要はありません。引き込んだらそうします。
参加するもう 1 つの方法は、独自の Lox 実装を共有することです。すべての読者が Java や C を好むわけではないため、他の言語へのポートは特に便利です。Lox ポートまたは実装を wiki に自由に追加してください。
私は非常に忘れっぽく、間違いを犯しやすい哺乳類なので、できる限り自動化しました。
私は OS X マシンで開発していますが、どの POSIX システムでも動作するはずです。少し追加の努力をすれば、これを Windows でも同様に動作させることができるはずですが、私はあまりお手伝いできません。
作業のほとんどは make によって調整されます。ビルド スクリプト、テスト ランナー、その他のユーティリティはすべて Dart で書かれています。 Dart のインストール手順はこちらです。 Dart をインストールしてパス上に配置したら、次を実行します。
$ make get
これにより、ビルド スクリプトとテスト スクリプトで使用されるすべてのパッケージがダウンロードされます。
2 つのインタプリタをコンパイルするには、パス上にjavac
に加えて C コンパイラも必要です。
セットアップが完了したら、次のことを試してください。
$ make
すべてが正常に動作していれば、書籍のサイトが生成され、2 つのインタプリタ clox と jlox がコンパイルされます。どちらのインタープリターもリポジトリのルートから直接実行できます。
$ ./clox
$ ./jlox
マークダウンとソース コードのスニペットは、手書きの静的サイト ジェネレーターを使用して最終的な HTML に織り込まれます。このジェネレーターは、最初の本用の 1 つの小さな Python スクリプトとして始まり、どういうわけか実際のプログラムに近いものに成長しました。
生成された HTML は、 site/
下のリポジトリにコミットされます。これはbook/
にある散文用の Markdown と、 java/
およびc/
の Java および C 実装から組み込まれたコードのスニペットの組み合わせから構築されています。 (ソース コード内のこれらのおかしなコメントはすべて、どのスニペットがどこに配置されるかを知る方法です。)
すべての魔法を実行するスクリプトはtool/bin/build.dart
です。これを直接実行することも、以下を実行することもできます。
$ make book
これにより、サイト全体が 1 つのバッチで生成されます。段階的に作業している場合は、開発サーバーを実行するとよいでしょう。
$ make serve
これは、 site/
ディレクトリをルートとするローカルホスト上で小さなHTTPサーバーを実行します。ページをリクエストすると、マークダウン ファイル、インタープリタ ソース ファイル、テンプレート、アセットなど、ソースが変更されたファイルがすべて再生成されます。そのまま実行を続け、ローカルでファイルを編集し、ブラウザを更新して変更を確認してください。
次のように各インタープリターを構築できます。
$ make clox
$ make jlox
これにより、本の各パートの最後に表示される各インタプリタの最終バージョンが構築されます。
各章の最後には通訳の様子もご覧いただけます。 (本の途中でも機能することを確認するためにこれを使用します。) これは、コード スニペットに同じコメント マーカーを使用してコードのどのチャンクが機能するかを判断するスクリプト、 tool/bin/split_chapters.dart
によって駆動されます。各章に存在します。各章の終わりまでに表示されたスニペットのみを取得し、各章のコードごとに 1 つのディレクトリであるgen/
にソースの新しいコピーを作成します。 (これらは、邪魔なマーカー コメントがすべて取り除かれているため、ソース コードを表示する簡単な方法でもあります。)
その後、それぞれを個別に構築できます。走る:
$ make c_chapters
そして、 build/
ディレクトリには、 chap14_chunks
などの各章の実行可能ファイルが含まれています。
$ make java_chapters
これにより、Java コードが各章のサブディレクトリのbuild/gen/
にあるクラスファイルにコンパイルされます。
私は完全な Lox テスト スイートを持っており、本のインタプリタが期待どおりに実行していることを確認するために使用しています。テスト ケースはtest/
に存在します。 Dart プログラムのtool/bin/test.dart
は、これらの各テスト ファイルを Lox インタープリター上で実行し、結果を解析し、テストが期待どおりに実行されることを検証するテスト ランナーです。
テストを実行できるさまざまなインタープリターがあります。
$ make test # The final versions of clox and jlox.
$ make test_clox # The final version of clox.
$ make test_jlox # The final version of jlox.
$ make test_c # Every chapter's version of clox.
$ make test_java # Every chapter's version of jlox.
$ make test_all # All of the above.
テスト スイートとテスト ランナーを使用して、独自の Lox 実装をテストすることを歓迎します。テスト ランナーはtool/bin/test.dart
にあり、 --interpreter
を使用して実行するカスタム インタープリター実行可能ファイルを与えることができます。たとえば、 my_code/boblox
にインタープリターの実行可能ファイルがある場合、次のようにテストできます。
$ dart tool/bin/test.dart clox --interpreter my_code/boblox
どのテスト スイートを実行するかを指示する必要があります。それによってテストの期待値が決まるからです。インタプリタが jlox のように動作する必要がある場合は、スイート名として「jlox」を使用します。 clox のように動作する場合は、「clox」を使用します。インタプリタが本のいずれかの章の終わりまでしか完成していない場合は、その章を「chap10_functions」などのスイートとして使用できます。すべての章の名前については、Makefile を参照してください。
インタプリタで使用するために他のコマンド ライン引数を渡す必要がある場合は、 --arguments
使用してテスト ランナーに渡すと、インタプリタに転送されます。
asset/
– サイトの生成に使用される Sass ファイルと jinja2 テンプレート。book/
- 各章のテキストのマークダウン ファイル。build/
- 中間ファイルおよびその他のビルド出力 (サイト自体を除く) がここに配置されます。 Git にコミットしていない。c/
– C で書かれたインタプリタである clox のソース コード。必要に応じて、XCode プロジェクトも含まれます。gen/
– GenerateAst.java によって生成された Java ソース ファイルはここに移動します。コミットされていません。java/
– Java で書かれたインタプリタである jlox のソース コード。note/
– さまざまなリサーチ、メモ、TODO、その他の雑多な内容。note/answers
– 課題に対する回答例。不正行為はありません!site/
– 最終的に生成されたサイト。このディレクトリの内容は、craftinginterpreters.com を直接反映しています。ここのコンテンツのほとんどは build.py によって生成されますが、フォント、画像、JS はここにのみ存在します。生成されたコンテンツも含め、すべてがコミットされます。test/
– Lox 実装のテスト ケース。tool/
– ビルド、テスト、およびその他のスクリプトを含む Dart パッケージ。