使用基于寄存器的虚拟机与使用基于堆栈的虚拟机有什么优缺点?
对我而言,基于寄存器的机器似乎更直接的编程和更高效.那么为什么JVM,CLR和Python VM都是基于堆栈的呢?
在硬件中实现,基于寄存器的机器将更加高效,因为对较慢的RAM的访问较少.然而,在软件中,即使是基于寄存器的架构也很可能在RAM中具有"寄存器".在这种情况下,基于堆栈的机器将同样有效.
此外,基于堆栈的VM将使编写编译器变得更加容易.您不必处理寄存器分配策略.实际上,您可以使用无限数量的寄存器.
更新:假设解释的VM,我写了这个答案.它可能不适用于JIT编译的VM.我碰到了这篇论文,这似乎表明使用寄存器架构JIT编译的VM可能更有效.
这已经在Parrot VM的FAQ和相关文档中得到了一定程度的回答:Parrot概述 该文档 的相关文本如下:
Parrot VM将具有寄存器架构,而不是堆栈架构.它还将具有极低级别的操作,与Java相比,与Perl和Python等的中级操作类似.
这个决定的原因主要是通过在某种程度上类似底层硬件,可以将Parrot字节码编译成高效的本机机器语言.
此外,高级语言中的许多程序由嵌套的函数和方法调用组成,有时使用词法变量来保存中间结果.在非JIT设置下,基于堆栈的VM将弹出,然后多次推送相同的操作数,而基于寄存器的VM将简单地分配适当数量的寄存器并对其进行操作,这可以显着减少操作量和CPU时间.
您可能还想阅读此内容:注册表设计的寄存器与堆栈 引用它:
毫无疑问,为堆栈计算机生成代码更容易.大多数新生编译学生都可以做到这一点.为寄存器机器生成代码有点困难,除非您将其视为具有累加器的堆栈机器.(从性能的角度来看,这是可行的,虽然有点不太理想)目标的简单性并不是那么大,至少对我来说不是这样,部分原因是很少有人实际上直接针对它 - 我的意思是,来吧,你知道有多少人真正尝试为任何人都会关心的东西编写编译器?数字很小.另一个问题是许多拥有编译器知识的人已经习惯于定位注册机,因为这是所有常用的硬件CPU.
传统上,虚拟机实现者倾向于基于堆栈的体系结构而不是基于寄存器,因为"VM实现的简单性"易于编写编译器后端 - 大多数VM最初设计用于承载单一语言和代码密度以及用于堆栈体系结构的可执行文件总是比寄存器架构的可执行文件小.简单性和代码密度是性能成本.
研究表明,基于注册的体系结构需要比基于堆栈的体系结构平均执行的VM指令少47%,并且寄存器代码比相应的堆栈代码大25%但是这增加了由于代码更大而获取更多VM指令的成本每个VM指令只有1.07%的额外实际机器负载,这可以忽略不计.基于寄存器的VM的整体性能平均需要32.3%的时间来执行标准基准测试.
构建基于堆栈的VM的一个原因是实际的VM操作码可以更小更简单(不需要编码/解码操作数).这使得生成的代码更小,并且还使VM代码更简单.
你需要几个寄存器?
我可能至少还需要一个.