はじめに
「RubyでつくるRuby ゼロから学びなおすプログラミング言語入門」(ラムダノート, Amazon) という本に感銘を受けて、自分でもNode.jsでミニインタープリターを作りました。
そして Turing Complete FM というポッドキャストを聴くうちにコンパイラも作って見たくなり、LLVMを使ってチャンレンジしてみました。
前提環境
今回は私の環境である Mac OS X 10.12 Sierra を前提にしています。
ミニコンパイラ編 目次
- ミニコンパイラ - 01 : 仕様の検討と、LLVMの準備 ... LLVMをつかったコンパイラに着手
- ミニコンパイラ - 02 : LLVM IRの下調べ ... LLVMの中間表現について調べます
- ミニコンパイラ - 03 : 足し算(+演算子)を実現する ... 整数と足し算をコンパイル
- ミニコンパイラ - 04 : 四則演算と余りをサポートする ... 残りの演算子(-, *, / %)をサポート
- ミニコンパイラ - 05 : ローカル変数を使う ... ローカル変数、複数行をサポート
- ミニコンパイラ - 06 : 比較を行う ... 比較演算子を実装する
- ミニコンパイラ - 07 : 条件分岐を行う ... if 〜 else をサポートする
- ミニコンパイラ - 08 : Whileループを実装する ... while ループをサポートする
- ミニコンパイラ - 09 : 文字列出力とFizzBuzz ... ループを使ってFizzBuzzを実現
- ミニコンパイラ - 10 : ユーザー定義関数 ... ユーザー定義関数をサポートする
- ミニコンパイラ - 11 : FizzBuzzとフィボナッチ数列 ... ユーザー定義関数を使ってFizzBuzzとフィボナッチ数列を実現(再帰呼び出し)
- ミニコンパイラ - 12 : いまさらテストを追加 ... シェルスクリプトによる実行結果を確認するテストを用意
番外編
- Extra01 : WebAssembly 化 ... emscripten を使って、LLVM IRからWebAssembly(.wasm)に変換
- (いつかやりたい)Node.jsとの互換性を高めるため、console.log()を使えるようにする
- (いつかやりたい)ミニRubyの中間表現から、LLVM IRを使ってバイナリを生成
- (いつかやりたい)LLVM IR を経由せずに、WebAssemblyのテキスト表現に直接変換
ミニインタープリター編
謝辞
「RubyでつくるRuby ゼロから学びなおすプログラミング言語入門」(ラムダノート, Amazon) に感銘をうけて自分でもミニNode.jsを作って見ましたが、本を読んでいた時には気がつかなかったことが多々ありました。書籍の構成、ミニRubyの設計がとても優れていて、とても参考になりました。
素晴らしい書籍を作ってくださった作者の遠藤さんとラムダノートさんに改めて感謝します。ありがとうございました。
ソースコード
今回作ったコードは GitHub で公開しています。
いつかやりたいこと
- (実施済み)LLVM IRから、WebAssemblyを生成する