我用 C 语言编写虚拟机只是为了好玩。跛脚,我知道,但幸运的是我在 SO 所以希望没有人会取笑:)
我写了一个非常快的虚拟机,它读取(我自己的)ASM 行并做一些事情。现在,我只有 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的问题吗?我敢肯定,比我聪明得多的人已经找到了解决这些问题的方法,我只是好奇它们是什么!