Rustでインタプリタを作ってみる(日記): 1日目
日記のように殴り書きしていきます。
参考:
「Go言語でつくるインタプリタ」をRustで実装しました。
https://buildersbox.corp-sansan.com/entry/2020/06/29/110000
https://github.com/rariyama/imitation_interpreter
『言語実装パターン』を読んだ
https://blog-dry.com/entry/2018/01/08/132338
著者の作ったOSSインタプリタのコード
https://github.com/antlr/antlr4/tree/master/runtime/CSharp
最終ゴール (deadline : end of summer spring)
Goで学ぶインタプリタのRust版実装
C言語ライクな簡易言語を作る
達成すること
- 基礎概念を知る
- プロジェクトを立ち上げる
- 全体設計をする。
- ファイルを先に作っておく
- やる順番、リストを作る。
インタプリタ(解析器)概要
書いたコード
↓
読み取り器…字句抽出(tokenizer) or 字句解析(lexer)、構文解析、中間表現の作成
↓
意味解析器…記号の定義、バグの検出、意味検証、最適化
↓
生成器…コード(文字列)の作成
実行順
- 構文解析
- 字句解析
- 木を構築
- AST
- 木を走査
- 意味解析
- 記号の記録と識別
- データ集合体のための記号表
- 型互換性
- 入力文をインタプリタで実行する or ある言語から別の言語へと変換する
単語
式; expr ... X+1 など演算する
文;statement ... return , if , = などプログラムに作用する
- デザインパターン
- 入力の読み取りに関するパターン
- 入力の解釈実行に関するパターン
- 出力の生成に関するパターン
抽象構文木(abstract syntax tree、AST)
疑問
Tokenとは何を具体的に指す?
Streamとは何を具体的に指す?
以下引用: 『言語実装パターン』を読んだ
1章
言語実装に関する基本的な知識が詰め込まれています。1章を読んで本を閉じてもかまわないくらいよくまとまっていると思いました。
句の構造を理解して、木を作成するまでが構文解析
の仕事
4章
いわゆる AST (抽象構文木) を作るフェーズです
5章
木の走査について。Visitor パターンを使って、再帰的に処理していくのが一般的みたいですね。
7章
クラスや構造体のスコープ木の構築に関してでした。基本線は6章とそこまで変わりません。
8章
ついに型をつけます。
9章
これまでの章で解説された実装をすべてつなげて、インタプリタの実装を行います。総集編ですね。
10章
9章の実装で一通りインタプリタは作成できるのですが、それだけだと速度が遅く、とくにプログラミング言語を作る際にはとても使い物にならないそうです。そこで、バイトコードを直接解釈できるバイトコードインタプリタの作成に取り掛かります。
11章, 12章
Wiki から HTML に変換したり、あるいは Java のクラスを、テーブルを作成してくれる SQL に変換したりするサンプルが掲載されています
振り返り
今日達成するゴールを成果型(計測できる形)で設定したことは非常に有益だった。
次も始めるときに達成することを書き出そう。
Discussion