6

为什么基于寄存器的虚拟机优于基于堆栈的虚拟机?

具体来说,在Parrot VM 的文档中,设计者解释了注册机的好处:

[...] 许多高级语言程序由嵌套的函数和方法调用组成,有时使用词法变量来保存中间结果。在非 JIT 设置下,基于堆栈的 VM 将多次弹出然后推送相同的操作数,而基于寄存器的 VM 将简单地分配正确数量的寄存器并对其进行操作,这可以显着减少操作量和 CPU 时间。

但是为什么相同的操作数被推了很多次?

4

1 回答 1

7

似乎他们描述了一个虚拟机,该虚拟机执行语言设计中描述的代码,逐字节码地执行代码,而无需编译或优化。在这种情况下是真的。想想代码做这样的事情,例如:

x = first(a,b,c)
y = second(a,b,c)
third(y,x)

使用基于寄存器的系统,您可以简单地将参数放在预期的任何位置(如果寄存器可用于传递参数)。如果所有寄存器都是“全局的”,而不是每个函数的(或者至少在弹出调用堆栈时恢复),那么您可能不需要在调用first和之间做任何事情second

如果你有一个基于堆栈的虚拟机,你最终会得到类似的东西(希望你有swap):

push a
push b
push c
call first
push a # pushing same arguments again
push b
push c
call second
swap
call third

此外,如果您计算一个重用相同变量的数学表达式,您可能需要执行以下操作:

push a
push b
add
push a
push c
add
add

而不是(假设有寄存器 a、b、c 并且您可以销毁 b 和 c 的内容):

add b, a
add c, a
add b, c # result in b

这避免了 restore a,在第一种情况下需要在单独的 push 中完成。

再说一次,我只是在猜测这些例子,也许它们意味着其他情况......

于 2012-01-01T13:25:13.637 回答