Rubyでコンパイラを作ってみる その3
コンパイル済みのアセンブリ言語ファイルを実行するインタープリターを作成しました。
C:\> ruby interpreter.rb sample.asm
Arrayインスタンス @memをメモリに見立てて、若い方からグローバル変数エリア、プログラムエリア、スタックエリアを割当、実行します。
DEBUG_STEP = false # ステップ動作(デバッグ用) MAX_MEM_SIZE = 1000 # メモリサイズ START_VAR_ADR = 0 # グローバル変数割当開始番地 START_PROG_ADR = 100 # プログラム開始アドレス BOTTOM_STACK_ADR = 900 # スタック下限アドレス TOP_STACK_ADR = MAX_MEM_SIZE - 1 # スタック上限アドレス
DEBUG_STEP=trueで、デバッグ用のステップ(1命令毎)動作します。
_a$ : 10 , _b$ : 0 , _c$ : 0 , # グローバル変数値 STK[ 10, 10, 899, 145,null, 900, 10,] # スタック状態(右がスタックTOP) BP # ベースポインタ位置 [LDI 0] in line 14 # 次回実行命令(ライン番号) ----- push any key(^C to abort)
詳細はこちら
余談ですが、Rubyソースのトップレベルで、@付きの変数名にするとグローバル変数の様に使えることに今回気がつきました。これはソースのトップレベルが一つのクラス定義の中に存在していて、そこでインスタンス変数として利用できているという理解で良いのでしょうか?