此外,许多高级语言中的程序由嵌套函数和方法调用组成,有时使用词法变量来保存中间结果。在非 JIT 设置下,基于堆栈的虚拟机将弹出并多次推送相同的操作数,而基于寄存器的虚拟机将简单地分配适量的寄存器并对其进行操作,这可以大大减少操作量和 CPU 时间。
你可能也想阅读这篇文章: 注册器与解释器设计的堆栈
引用一下:
毫无疑问,为堆栈机器生成代码更容易。大多数大一的编译专业学生都能做到这一点。为寄存器机器生成代码有点困难,除非您将其视为带有累加器的堆栈机器。(这是可行的,尽管从性能的角度来看有些不理想)目标的简单性并不是什么大问题,至少对我来说不是,部分原因是很少有人真正直接瞄准它——我的意思是,拜托,你知道有多少人真正尝试编写一个任何人都会关心的编译器吗?人数很少。另一个问题是,许多具有编译器知识的人已经习惯于瞄准寄存器机器,因为所有常用的硬件 CPU 都是寄存器机器。
传统上,虚拟机实现者更喜欢基于堆栈的架构,而不是基于寄存器的架构,因为“简单的 VM 实现”编写编译器后端很容易——大多数虚拟机最初设计为托管单一语言,堆栈架构的代码密度和可执行文件总是小于寄存器架构的可执行文件。简单性和代码密度是性能的代价。
研究表明,基于注册的体系结构比基于堆栈的体系结构平均少执行47% 的 VM 指令,注册代码比相应的堆栈代码大25% ,但是由于代码大小增加了获取更多 VM 指令的成本,每条 VM 指令只需要额外的1.07% 的实际机器负载,这是可以忽略不计的。基于寄存器的 VM 的总体性能是,执行标准基准测试所需的平均时间减少了32.3% 。