はじめに
「RubyでつくるRuby ゼロから学びなおすプログラミング言語入門」(ラムダノート, Amazon) という本を手を動かしながら読んで、非常に感銘を受けました。そんなおりに PythonでつくるPythonという記事を読み、自分でもNode.jsでミニNode.js作りにチャンレンジすることにしました。
予想以上に手間取り端折った部分もありますが、なんとか最後はブートストラップまで行くことができました。
目次
ミニインタープリター編
- Step1:ソースのパース ... 初めての esprima
- Step2:単純化 ... 抽象構文木(AST)を単純化
- Step 3: +演算子を評価する ... 足し算を実行
- Step 4: 四則演算で電卓を作る ... 電卓を作るところまでと、比較演算子の実装
- Step 5: 変数を使う ... 変数の宣言、代入、参照
- Step 6: 条件分岐と繰り返し ... ifで条件分岐、 whileで繰り返し
- Step 7: 組み込み関数 ... 組み込み関数を呼び出す
- Step 8: ユーザ定義関数 ... 自分で関数を定義、利用できるように
- Step 9: 配列とハッシュ ... ブートストラップに備えて配列ハッシュを使えるように
- Step 10: オブジェクトの利用を回避 ... 知らず知らずにオブジェクトを利用してた処理をモジュールとして分離
- Step 11: returnを諦めて、無理矢理ブートストラップ ... return処理を避けて無理矢理ブートストラップを実現
- Step 12: returnをサポート ... あらためてreturn処理を実装してブートストラップ達成
- Extra 1: ミニRubyの単純化Treeを実行する ... ミニRubyの単純化Treeを読み込んで実行する
- Extra 2: 演算子を追加する ... 否定演算子や論理演算子を追加
ミニコンパイラ編
WASMコンパイラ編
謝辞
「RubyでつくるRuby ゼロから学びなおすプログラミング言語入門」(ラムダノート, Amazon) に感銘をうけて自分でもミニNode.jsを作って見ましたが、本を読んでいた時には気がつかなかったことが多々ありました。書籍の構成、ミニRubyの設計がとても優れていて、とても参考になりました。
素晴らしい書籍を作ってくださった作者の遠藤さんとラムダノートさんに改めて感謝します。ありがとうございました。
ソースコード
今回作ったコードは GitHub で公開しています。
いつかやりたいこと
- Extra 3: 関数の前方参照、ブロックスコープ、グローバル変数をサポートする
- 済 Extra 4:LLVMを使ってバイナリ生成できるか? ... コンパイラ編で実施済