続・いまどきのプログラム言語の作り方
![Kodai Matsumoto](https://res.cloudinary.com/zenn/image/fetch/s--_aDuQTfE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/add3a03287.jpeg)
「いまどきのプログラム言語の作り方」(randy 著) を元ネタにした、プログラミング言語処理系の実装についての技術同人誌を執筆するうえで得た情報や考えたことをまとめていく。
![Kodai Matsumoto](https://res.cloudinary.com/zenn/image/fetch/s--_aDuQTfE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/add3a03287.jpeg)
元ネタでは動的型付けのプロトタイプベース OOP 言語のインタプリタを Java で実装する。
最初は電卓として使えるように算術式の評価機能だけを実装し、その後条件分岐や繰り返し、関数定義 / 呼び出し、オブジェクト指向関連機能の順に拡張していく。
章ごとに最低限動く言語処理系が手元に出来上がるので、レキサ・パーサ・意味解析を別々の章で説明するタイプの本よりも実践的でありモチベーションの維持がしやすい。
この特徴は今回書く技術同人誌でも引き継ぎたいと考えている。
![Kodai Matsumoto](https://res.cloudinary.com/zenn/image/fetch/s--_aDuQTfE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/add3a03287.jpeg)
「いまどきの」プログラミング言語でプロトタイプの仕組みを意識することはほぼ無い。こと JavaScript においては、本来プロトタイプベース OOP 言語であるが、後に追加されたクラスベース言語風の糖衣構文のほうが多用される。
いま新たにプログラミング言語処理系の自作のチュートリアルを用意するとしたら、主流となりつつある Rust や Go 言語で採用されているような、シンプルなメソッド呼び出し構文のみをサポートするほうが興味を惹くと考える。
![Kodai Matsumoto](https://res.cloudinary.com/zenn/image/fetch/s--_aDuQTfE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/add3a03287.jpeg)
元ネタの実装の記述量は長めで、抽象クラスを用いて多態性も駆使しており、正直 OOP に慣れていなければ写経の際に理解することは難しい。
![Kodai Matsumoto](https://res.cloudinary.com/zenn/image/fetch/s--_aDuQTfE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/add3a03287.jpeg)
自作する言語と実装に用いる言語とを類似したものにすることで、チュートリアルを進めるなかでの混乱を最低限にしたい。
また、言語処理系の実装では代数的データ型を用いるべき機会がとても多いため、それをより簡潔に記述し可能な限り静的検査できる言語が望ましい。
よって、実装言語には F# が最適だと考える。
![Kodai Matsumoto](https://res.cloudinary.com/zenn/image/fetch/s--_aDuQTfE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/add3a03287.jpeg)
元ネタと同じく、各章で導入する構文形式と評価規則はできるだけ簡潔にしたい。プログラム意味論に関してより厳密な議論をするために、CoPL や TaPL での説明のように推論規則・構造的帰納法を扱うことも考えたが、動的型付け言語を実装する実践的な本としてはハードルを必要以上に高くしてしまう。なので意図的に導入しない。
![Kodai Matsumoto](https://res.cloudinary.com/zenn/image/fetch/s--_aDuQTfE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/add3a03287.jpeg)
F# は優れた言語であるものの、やはり入門のための日本語で書かれた教材は Java や C# に比べて少ないため、読者が初めて関数型言語や F# に触れることを想定して最低限の説明をするつもり。
![Kodai Matsumoto](https://res.cloudinary.com/zenn/image/fetch/s--_aDuQTfE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/add3a03287.jpeg)
最初は式評価機能のみを備えるツリーウォークインタプリタをつくり、後半では GC つきの VM 型インタプリタを実装したい