为什么基于寄存器的虚拟机比基于堆栈的虚拟机更好?

时间:2012-01-01 13:07:57

标签: language-agnostic vm-implementation stack-based

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

具体来说,在the Parrot VM's document中,设计师解释了注册机的好处:

  

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

但是为什么同一个操作数被推多次?

1 个答案:

答案 0 :(得分:7)

似乎他们描述了一个VM,它执行语言设计中描述的代码,逐字节码,无需编译或优化。在那种情况下,这是事实。考虑代码做这样的事情,例如:

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

使用基于寄存器的系统,您可以简单地将参数放在它们预期的任何位置(如果寄存器可用于传递参数)。如果所有寄存器都是“全局”,而不是按功能(或至少在弹出调用堆栈时恢复),则在调用firstsecond之间可能不需要执行任何操作。

如果你有一个基于堆栈的虚拟机,你最终会得到类似的东西(希望你有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

这可以避免恢复a,这需要在第一种情况下单独推送。

然后,我只是猜测这些例子,也许他们意味着其他一些案例......