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

Pte*_*mys 6 language-agnostic stack-based vm-implementation

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

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

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

但为什么同样的操作数被推多次?

vir*_*tor 7

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

x = first(a,b,c)
y = second(a,b,c)
third(y,x)
Run Code Online (Sandbox Code Playgroud)

使用基于寄存器的系统,您可以简单地将参数放在它们预期的任何位置(如果寄存器可用于传递参数).如果所有寄存器都是"全局",而不是按功能(或至少在弹出调用堆栈时恢复),则可能不需要在调用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
Run Code Online (Sandbox Code Playgroud)

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

push a
push b
add
push a
push c
add
add
Run Code Online (Sandbox Code Playgroud)

而不是(假设有寄存器a,b,c,你可以破坏b和c的内容):

add b, a
add c, a
add b, c # result in b
Run Code Online (Sandbox Code Playgroud)

这避免了恢复a,这需要在第一种情况下单独推进.

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