はじめに
Go言語でつくるインタプリタという本を最近読みました。
この本はmonkeyと名付けられた独自言語が動くインタプリタをgoで作る本なのですが、理解を深めるためそのインタプリタをdenoで再実装をしました。
https://github.com/pokotyan/deno-monkey
そして、これをwebで実行できるようなプレイグランドにしました。
https://monkey-playground.netlify.app/
※herokuにデプロイしているのでサーバーが落ちてた場合、レスポンスが返ってくるのが遅いです
Go言語でつくるインタプリタ
この本では、字句解析 => 構文解析 => 評価 の順に実装していき最終的にツリーウォークインタプリタが完成します。構文解析で作成したASTを直接評価してくやり方です。
ASTを直接評価するのではなく、ASTからIR(中間表現)を作成し、それを実行時に仮想マシンでJITコンパイルさせるという方法は「Go言語でつくるインタプリタ」の続編の書籍である Writing A Compiler In Go で解説しているみたいです。(勉強したい)
字句解析や構文解析ってそもそもなんぞやっていうのはこちらの記事がイメージが掴みやすかったです。
字句解析
1文字ずつソースコードを読んでいき、トークンを作っていく。マルチバイト文字には対応していない。
構文解析
再帰下降構文解析という方法で構文解析していきASTを作っていく。
演算子の優先順位を実現する方法がなるほどなあと思いました。(語彙力)
評価
作成したASTを一つずつ辿っていき、ノードが表現していることをそのまま評価する。
変数束縛、クロージャの実現の仕方がなるほどなあと思いました。(語彙力)
感想
- goの標準ツール以外は使うことなく、フルスクラッチで書いていくので理解がしやすい。
- インタプリタ、コンパイラの大枠を掴むとっかかりになる。
- 静的解析で何かツールを作ってみようという気になる。
- この本はコード生成などの部分はすっ飛ばしているので、次の学習としてコンパイラを学んでみたくなる。
- go言語自体の学習にもなりそう
- denoで書き換えるにあたって、goのコードをそのまま置き換えたので、ポインタ使ってるところとかは型の定義が雑になっているところがある。ちゃんとtsっぽいコードに直したい。
最後に
Go言語でつくるインタプリタ の本をもし勉強する際には、今回作ったプレイグランドも利用して勉強してもらえたら嬉しいです!