楽しみのために C で仮想マシンを作成しています。ラメ、私は知っていますが、幸いなことに私はSOにいるので、誰もからかわないことを願っています:)
私は、(自分の) ASM の行を読み取り、何かを実行する、非常に迅速で汚れた VM を作成しました。現在、3 つの命令しかありません: add
、jmp
、end
。すべてが順調で、実際に行をフィードできるのはかなりクールです(次のようwrite_line(&prog[1], "jmp", regA, regB, 0);
にしてプログラムを実行します:
while (machine.code_pointer <= BOUNDS && DONE != true)
{
run_line(&prog[machine.cp]);
}
私は C でオペコード ルックアップ テーブル (効率的ではないかもしれませんが、エレガントです) を使用していますが、すべて正常に動作しているようです。
私の質問は「ベストプラクティス」の質問ですが、正しい答えがあると思います。VM がバイナリ ファイルを読み取って (バイトを に格納unsigned char[]
)、バイトコードを実行できるようにしています。私の質問は次のとおりです。バイトコードが整形式であることを確認するのは VM の仕事ですか、それとも、吐き出すバイナリ ファイルが整形式であることを確認するのはコンパイラの仕事ですか?
誰かがバイナリファイルを編集して何かを台無しにするとどうなるか(その任意の部分を削除するなど)、私がこれを尋ねるだけです。明らかに、プログラムにはバグがあり、おそらく機能しません。これは VM の問題でもありますか? 私よりずっと頭のいい人たちが、これらの問題の解決策を見つけているに違いありません。