gpt4 book ai didi

c - 编写 VM - 格式正确的字节码?

转载 作者:太空狗 更新时间:2023-10-29 16:59:02 25 4
gpt4 key购买 nike

我正在用 C 编写一个虚拟机只是为了好玩。蹩脚的,我知道,但幸运的是我在 SO 所以希望没有人会取笑 :)

我写了一个非常快速的'n'dirty VM,它读取(我自己的)ASM 的行并做一些事情。现在,我只有 3 条指令:addjmpend。一切都很好,能够提供线路实际上非常酷(像 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 的工作来确保字节码格式正确,还是只是编译器的工作来确保它吐出的二进制文件格式正确?

我问这个只是因为如果有人编辑一个二进制文件并搞砸了(删除它的任意部分等)会发生什么。显然,该程序会出现错误并且可能无法正常运行。这甚至是虚拟机的问题吗?我敢肯定,比我聪明得多的人已经找到了解决这些问题的方法,我只是好奇它们是什么!

最佳答案

Is it the VM's job to make sure the bytecode is well formed or is it just the compiler's job to make sure the binary file it spits out is well formed?

你来决定。

最佳做法是让 VM 在执行前进行一次检查,成本与程序的大小成正比,这足以保证在执行期间不会发生任何异常情况。然后在字节码的实际执行期间,您无需检查即可运行。然而,运行前检查的想法可能需要一些非常复杂的分析,即使是最注重性能的虚拟机也经常在运行时进行一些检查(例如:数组边界)。

对于业余项目,我会让事情保持简单,并让 VM 在您每次执行指令时检查完整性。大多数指令的开销不会太大。

关于c - 编写 VM - 格式正确的字节码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2815222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com