1. massie_g

    No comment

    massie_g
Changes in body
Source | HTML | Preview
@@ -1,45 +1,47 @@
# はじめに
「RubyでつくるRuby ゼロから学びなおすプログラミング言語入門」([ラムダノート](https://www.lambdanote.com/products/ruby-ruby), [Amazon](https://www.amazon.co.jp/dp/4908686017)) という本を手を動かしながら読んで、非常に感銘を受けました。そんなおりに [PythonでつくるPython](http://akimacho.hatenablog.com/entry/2018/05/22/220109)という記事を読み、自分でもNode.jsでミニNode.js作りにチャンレンジすることにしました。
予想以上に手間取り端折った部分もありますが、なんとか最後はブートストラップまで行くことができました。
# 目次
+## ミニインタープリター編
+
* [Step1:ソースのパース](https://qiita.com/massie_g/items/3f604413ca5ea4552b45) ... 初めての esprima
* [Step2:単純化](https://qiita.com/massie_g/items/6c852f96f7271e9e70bf) ... 抽象構文木(AST)を単純化
* [Step 3: +演算子を評価する](https://qiita.com/massie_g/items/ad6ae33ec1e46b67ad57) ... 足し算を実行
* [Step 4: 四則演算で電卓を作る](https://qiita.com/massie_g/items/40591822228d7e166b63) ... 電卓を作るところまでと、比較演算子の実装
* [Step 5: 変数を使う](https://qiita.com/massie_g/items/1e5bf8b3cca0ae08fd1c) ... 変数の宣言、代入、参照
* [Step 6: 条件分岐と繰り返し](https://qiita.com/massie_g/items/f801692fb9b07d007285) ... ifで条件分岐、 whileで繰り返し
* [Step 7: 組み込み関数](https://qiita.com/massie_g/items/22506a9dabbd13cee13f) ... 組み込み関数を呼び出す
* [Step 8: ユーザ定義関数](https://qiita.com/massie_g/items/e537f14300a6113a6237) ... 自分で関数を定義、利用できるように
* [Step 9: 配列とハッシュ](https://qiita.com/massie_g/items/b2a94e98ff80868bedec) ... ブートストラップに備えて配列ハッシュを使えるように
* [Step 10: オブジェクトの利用を回避](https://qiita.com/massie_g/items/1b59efb5f891b3dda05b) ... 知らず知らずにオブジェクトを利用してた処理をモジュールとして分離
* [Step 11: returnを諦めて、無理矢理ブートストラップ](https://qiita.com/massie_g/items/5d8d61cdbf54390d8709) ... return処理を避けて無理矢理ブートストラップを実現
* [Step 12: returnをサポート](https://qiita.com/massie_g/items/35555286594e1cf780e1) ... あらためてreturn処理を実装してブートストラップ達成
* [Extra 1: ミニRubyの単純化Treeを実行する](https://qiita.com/massie_g/items/3a4888168bb288965393) ... ミニRubyの単純化Treeを読み込んで実行する
* [Extra 2: 演算子を追加する](https://qiita.com/massie_g/items/d1ef41bab2f8fd7343b5) ... 否定演算子や論理演算子を追加
## ミニコンパイラ編
* [ミニコンパイラ - 01 : 仕様の検討と、LLVMの準備](https://qiita.com/massie_g/items/1bdede3016a53f366fec) ... LLVMをつかったコンパイラに着手
* [ミニコンパイラ - 02 : LLVM IRの下調べ](https://qiita.com/massie_g/items/7e2d2d742f1da49b8daf) ... LLVMの中間表現について調べます
* [ミニコンパイラ - 03 : 足し算(+演算子)を実現する](https://qiita.com/massie_g/items/8d5f7afa012b7ae76ab8) ... 整数と足し算をコンパイル
* [ミニコンパイラ - 04 : 四則演算と余りをサポートする](https://qiita.com/massie_g/items/07b2bec3d7266faf9785) ... 残りの演算子(-, *, / %)をサポート
# 謝辞
「RubyでつくるRuby ゼロから学びなおすプログラミング言語入門」([ラムダノート](https://www.lambdanote.com/products/ruby-ruby), [Amazon](https://www.amazon.co.jp/dp/4908686017)) に感銘をうけて自分でもミニNode.jsを作って見ましたが、本を読んでいた時には気がつかなかったことが多々ありました。書籍の構成、ミニRubyの設計がとても優れていて、とても参考になりました。
素晴らしい書籍を作ってくださった作者の遠藤さんとラムダノートさんに改めて感謝します。ありがとうございました。
# ソースコード
今回作ったコードは GitHub で公開しています。
* [mganeko/mininode](https://github.com/mganeko/mininode)
# いつかやりたいこと
* Extra 3: 関数の前方参照、ブロックスコープ、グローバル変数をサポートする
* Extra 4:LLVMを使ってバイナリ生成できるか?