Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@pokotyan

deno(typescript)でインタプリタを作る

はじめに

Go言語でつくるインタプリタという本を最近読みました。

この本はmonkeyと名付けられた独自言語が動くインタプリタをgoで作る本なのですが、理解を深めるためそのインタプリタをdenoで再実装をしました。
https://github.com/pokotyan/deno-monkey

そして、これをwebで実行できるようなプレイグランドにしました。
https://monkey-playground.netlify.app/
※herokuにデプロイしているのでサーバーが落ちてた場合、レスポンスが返ってくるのが遅いです
スクリーンショット 2020-08-23 13.59.34.png

Go言語でつくるインタプリタ

この本では、字句解析 => 構文解析 => 評価 の順に実装していき最終的にツリーウォークインタプリタが完成します。構文解析で作成したASTを直接評価してくやり方です。

ASTを直接評価するのではなく、ASTからIR(中間表現)を作成し、それを実行時に仮想マシンでJITコンパイルさせるという方法は「Go言語でつくるインタプリタ」の続編の書籍である Writing A Compiler In Go で解説しているみたいです。(勉強したい)

字句解析や構文解析ってそもそもなんぞやっていうのはこちらの記事がイメージが掴みやすかったです。

字句解析

1文字ずつソースコードを読んでいき、トークンを作っていく。マルチバイト文字には対応していない。

構文解析

再帰下降構文解析という方法で構文解析していきASTを作っていく。
演算子の優先順位を実現する方法がなるほどなあと思いました。(語彙力)

評価

作成したASTを一つずつ辿っていき、ノードが表現していることをそのまま評価する。
変数束縛、クロージャの実現の仕方がなるほどなあと思いました。(語彙力)

感想

  • goの標準ツール以外は使うことなく、フルスクラッチで書いていくので理解がしやすい。
  • インタプリタ、コンパイラの大枠を掴むとっかかりになる。
  • 静的解析で何かツールを作ってみようという気になる。
  • この本はコード生成などの部分はすっ飛ばしているので、次の学習としてコンパイラを学んでみたくなる。
  • go言語自体の学習にもなりそう
  • denoで書き換えるにあたって、goのコードをそのまま置き換えたので、ポインタ使ってるところとかは型の定義が雑になっているところがある。ちゃんとtsっぽいコードに直したい。

最後に

Go言語でつくるインタプリタ の本をもし勉強する際には、今回作ったプレイグランドも利用して勉強してもらえたら嬉しいです!

2
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
pokotyan
admin-guild
「Webサービスの運営に必要なあらゆる知見」を共有できる場として作られた、運営者のためのコミュニティです。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
2
Help us understand the problem. What is going on with this article?