Dav*_*nco 8 c assembly programming-languages vm-implementation
我正在用C写一个虚拟机只是为了好玩.Lame,我知道,但幸运的是我在这么做,所以希望没有人会取笑:)
我写了一个非常快速的虚拟机,它可以读取(我自己的)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]);
}
Run Code Online (Sandbox Code Playgroud)
我在C中使用操作码查找表(可能效率不高但很优雅),一切似乎都正常.
我的问题更多的是一个"最佳实践"问题,但我认为这是一个正确的答案.我正在使VM能够读取二进制文件(存储字节unsigned char[])并执行字节码.我的问题是:VM的工作是确保字节码格式正确,还是只是编译器的工作才能确保它吐出的二进制文件格式正确?
我只问这个,因为如果有人编辑二进制文件并搞砸了(删除它的任意部分等)会发生什么.很明显,该程序将是错误的,可能不起作用.这甚至是VM的问题吗?我确信比我聪明的人已经找到了解决这些问题的方法,我只是好奇他们是什么!
Nor*_*sey 15
VM的工作是确保字节码格式正确还是仅仅是编译器的工作来确保它吐出的二进制文件格式正确?
你可以决定.
最佳做法是让VM在执行前进行单次检查,成本与程序的大小成比例,这是复杂的,应该保证在执行期间不会发生任何问题.然后在实际执行字节码期间,运行时不进行任何检查.但是,运行前检查的想法可能需要一些非常复杂的分析,即使是性能最敏感的VM通常也会在运行时进行一些检查(例如:数组边界).
对于一个业余爱好项目,我会保持简单,并在每次执行指令时让VM检查健全.大多数指令的开销不会太大.
| 归档时间: |
|
| 查看次数: |
2339 次 |
| 最近记录: |