The Super Tiny Compilerを写経してみた
はじめに
この記事はCODE BASE OKINAWA Advent Calendar 2022の21日目の記事になります。
1年ほど前に「言語処理系ってどうなっているんだろうな〜」と漠然と疑問に思っていて、Rubyで作る奇妙なプログラミング言語を一通りやったのですが、ほぼ内容を忘れていたので、今回たまたま見つけたThe Super Tiny Compilerをやってみることにしました。
The Super Tiny Compilerとは
Javascriptで書かれたコンパイラのこと。
Lispっぽい呼び出しをCっぽい呼び出しに変換します。
2 + (4 - 2) → (add 2 (subtract 4 2)) → add(2, subtract(4, 2))
全体の流れ
- Token生成(TOKENIZER)
- 構文解析(PARSER)
- AST変換(TRAVERSER)
- 新AST変換(TRANSFORMER)
- コード生成(CODE GENERATOR)
解説
解説を書こうと思ったのですが、凄く分かりやすくまとめている記事を発見したので、ぜひ読んでほしいです!めちゃ分かりやすい。
TypeScript with Denoで実装しているしリポジトリもあるから、後で写経してみよかな、、!
感想
ソースコードよりもコメントが多くてびっくり。その分丁寧に解説が書かれていたので一連の処理がイメージしやすかったのがとても良かったです。 また、Javascriptで書かれ、コード量も少ないのでそこまで時間がかからずにでき、とっかかりとして優れた教材だと思います。
個人的はAST→新ASTに変換(TRANSFORMER)の実装が難しかったです。parent._context
の_
という意味が分からなかったり、parent
ってどういう意味だっけ?と何度も動かして確認していました。多分?理解できていると思います。
別の言語で実装してみるのもいいかもしれないです。ちなみにRubyはありました。
次はGoで作るインタプリタをやってみようかと思います。 Rubyで作るRubyも良さそう。