Rubyでコンパイラを作ってみる
GWの時間を利用して勉強のために、Rubyを使って超簡易コンパイラを作ってみました。
ソースを読み込んで、仮想スタックマシンのアセンブラを出力します。
使用したRubyのバージョンは1.9.1、Windows環境で作成しています。
仕様は以下のとおり
- 扱えるデータは整数値のみ
- 変数はグローバル変数のみ
- 制御構造として、if文とwhile文(break等はなし)をもつ
- 変数の入出力として、print文とinput文をもつ
- 最適化は何もしていない
以下のソースプログラムが
int a,b,c; a = 2; b = 3; if(a==0) print a; else{ c = a*(b+4); print c; }
こんな感じになります
_VAR _a$ INT 0 _b$ INT 0 _c$ INT 0 _END_VAR _PROG LDA _a$ LDI 2 STS DEL LDA _b$ LDI 3 STS DEL L001_IF: LDA _a$ LDS LDI 0 CMPEQ JPF L001_ELSE LDA _a$ LDS PRT JP L001_END L001_ELSE: LDA _c$ LDA _a$ LDS LDA _b$ LDS LDI 4 ADD MUL STS DEL LDA _c$ LDS PRT L001_END: STOP _END_PROG
詳細はこちら
あとは、ローカル変数と関数を使用できるようにしてみたいですね。