Compiler/Virtual Machine Interpreter
Compiler/Virtual Machine Interpreter
タスク概要
Code Generator で得られたアセンブリ出力を読み込み、Virtual Machine 用バイトコードに変換、実行する。
実装
Virtual Machine の実装はタスクのページにある "A simple example virtual machine" をそのまま Rust に持ってくるだけで何の問題もなく動いてしまう。
結果、"Virtual Machine Interpreter" というタスク名のくせに最も実装に時間がかかるのはバイトコードを生成するアセンブラの部分になってしまった。とはいえ、疑似命令やラベルすら存在しないこともあって、アセンブラ作成タスクとして見た場合にも特筆することがない。基本的に一行ずつ読み込んで一命令ずつ出力していくだけ。
ところで、このタスクにはバイトコードに関する仕様がない。タスク内で完結する表現であるため、ある程度好きに決めてしまっても影響を及ぼさないからだろうか。守るべきは
- オペコードは 1 バイト
- 各オペランドは 4 バイト
くらい。分岐命令におけるジャンプ先アドレスは "A simple example virtual machine" を見ると PC 相対になっているが、それに従わずに絶対アドレスでも Virtual Machine の側の仕様を合わせさえすれば普通に動くはず。
余談
実際のところ、バイトコードの仕様を決めた上で Code Generator タスク の出力をバイトコードにしても良かった気がする。そうすればこのタスクは純粋に Virtual Machine の実装になったのだけれど。
そうしなかったのは、バイトコードを出力させるようにするとエンディアンの問題などが出てしまうからかもしれない。
何にしろ、これで一連の Compiler タスクは全て実装したことになる。実装した言語は足りない機能がたくさんあって実用には耐えないが、これを足がかりにしていくのも一つの方法だろう。次にやるなら
- 関数
- 整数以外の変数
あたりの実装になるのかな。または下まわりを自前 VM から LLVM にしてみるとか。 今のところどちらもやるつもりはないが。