The Super Tiny Compilerを写経してみた

はじめに

この記事はCODE BASE OKINAWA Advent Calendar 2022の21日目の記事になります。

1年ほど前に「言語処理系ってどうなっているんだろうな〜」と漠然と疑問に思っていて、Rubyで作る奇妙なプログラミング言語を一通りやったのですが、ほぼ内容を忘れていたので、今回たまたま見つけたThe Super Tiny Compilerをやってみることにしました。

The Super Tiny Compilerとは

Javascriptで書かれたコンパイラのこと。

github.com

Lispっぽい呼び出しをCっぽい呼び出しに変換します。

2 + (4 - 2) → (add 2 (subtract 4 2)) → add(2, subtract(4, 2))

全体の流れ

  1. Token生成(TOKENIZER)
  2. 構文解析(PARSER)
  3. AST変換(TRAVERSER)
  4. 新AST変換(TRANSFORMER)
  5. コード生成(CODE GENERATOR)

解説

解説を書こうと思ったのですが、凄く分かりやすくまとめている記事を発見したので、ぜひ読んでほしいです!めちゃ分かりやすい。

TypeScript with Denoで実装しているしリポジトリもあるから、後で写経してみよかな、、!

感想

ソースコードよりもコメントが多くてびっくり。その分丁寧に解説が書かれていたので一連の処理がイメージしやすかったのがとても良かったです。 また、Javascriptで書かれ、コード量も少ないのでそこまで時間がかからずにでき、とっかかりとして優れた教材だと思います。

個人的はAST→新ASTに変換(TRANSFORMER)の実装が難しかったです。parent._context_という意味が分からなかったり、parentってどういう意味だっけ?と何度も動かして確認していました。多分?理解できていると思います。

別の言語で実装してみるのもいいかもしれないです。ちなみにRubyはありました。

次はGoで作るインタプリタをやってみようかと思います。 Rubyで作るRubyも良さそう。

www.oreilly.co.jp

RubyでつくるRuby ゼロから学びなおすプログラミング言語入門www.lambdanote.com