为什么JVM基于堆栈,而Dalvik VM基于寄存器?


98

我很好奇,为什么Sun决定使JVM基于堆栈,而Google决定使DalvikVM基于寄存器?

我想JVM不能真正假设目标平台上有一定数量的寄存器可用,因为它应该独立于平台。因此,它只是将寄存器分配等推迟到JIT编译器。(如我错了请纠正我。)

所以Android的人想:“嘿,那效率低下,让我们马上去注册虚拟机吧……”?但是,等等,有多个不同的android设备,Dalvik瞄准了多少个寄存器?Dalvik操作码是否为一定数量的寄存器进行了硬编码?

市场上当前所有的Android设备是否都具有相同数量的寄存器?还是在dex加载期间执行了寄存器重新分配?所有这些如何融合在一起?


5
那是Google决定使DalvikVM基于寄存器的决定吗?我认为,谷歌收购了Android公司之前DalvikVM开始实施
RoboAlex

1
您当然是对的。(虽然与问题不是很相关;)
aioobe 2015年

Answers:


68

基于堆栈的VM的一些属性非常适合Java的设计目标:

  1. 基于堆栈的设计对目标硬件(寄存器,CPU功能)的假设很少,因此很容易在各种硬件上实现VM。

  2. 由于指令的操作数在很大程度上是隐式的,因此目标代码将趋于更小。如果您要通过慢速的网络链接下载代码,则这一点很重要。

采用基于寄存器的方案可能意味着Dalvik的代码生成器不必费劲地生成高性能代码。在极其丰富的寄存器或贫乏的寄存器体系结构上运行可能会妨碍Dalvik,但这并不是通常的目标-ARM是一种非常中间的体系结构。


我也忘记了Dalvik的最初版本根本没有包含JIT。如果您要直接解释说明,那么基于寄存器的方案可能是解释性能的赢家。


1
好吧,这很有趣。那么DalvikVM是否假定目标设备上的寄存器数量最少?
aioobe

1
另外,我读到有人在笔记本电脑上安装Android,因为它是“轻量级”操作系统...如果笔记本电脑不是ARM,并且可能具有许多寄存器的体系结构,这似乎是一个坏主意?
aioobe

2
好的,我刚刚了解到dex字节码是用无限的寄存器机器定义的,并且在效率方面,它似乎主要与内存占用有关。
aioobe 2010年

1
我不记得Dalvik是基于无限寄存器的,还是具有固定的寄存器文件大小。如果它是无限的,那么它将倾向于在具有“足够”寄存器的架构上针对正在运行的任何代码执行最佳性能。
Mark Bessey 2010年

更详细的解释可以在这里找到:markfaction.wordpress.com/2012/07/15/...
noego

31

我找不到参考,但是我认为Sun决定采用基于堆栈的字节码方法,因为它可以轻松地在具有少量寄存器(例如IA32)的体系结构上运行JVM。

在Google I / O 2008的Dalvik VM Internals中,Dalvik的创建者Dan Bornstein演示幻灯片的幻灯片35中给出了以下选择基于寄存器的VM的论点:

登记机

为什么?

  • 避免指令派发
  • 避免不必要的内存访问
  • 有效地消耗指令流(每条指令的语义密度更高)

并在幻灯片36上:

登记机

统计数据

  • 指令减少30%
  • 代码单元减少35%
  • 指令流中的字节增加了35%
    • 但是我们一次要消耗两个

根据Bornstein所说,这是“将一组类文件转换为dex文件时可以找到的一般期望”。

演示视频的相关部分从25:00开始

Shi等人还发表了一篇题为《虚拟机摊牌:堆栈与寄存器》的有见地的论文(2005),探讨了基于堆栈和基于寄存器的虚拟机之间的差异。


13

我不知道为什么Sun决定基于JVM堆栈。由于性能原因,Erlangs虚拟机BEAM是基于注册的。由于性能原因,Dalvik似乎也基于注册。

Android Pro 2

Dalvik使用寄存器作为数据存储的主要单位,而不是堆栈。Google希望由此减少30%的指令。

关于代码大小:

Dalvik VM将生成的Java类文件合并到一个或多个Dalvik Executables(.dex)文件中。它可以重用来自多个类文件的重复信息,从而有效地将传统.jar文件的空间需求(未压缩)减少了一半。例如,Android中的Web浏览器应用程序的.dex文件约为200k,而等效的未压缩.jar版本约为500k。闹钟的.dex文件约为50k,大约是其.jar版本的两倍。

正如我记得的《计算机体系结构:一种定量方法》还得出的结论是,套准机的性能要比基于堆栈的机更好。


2
如果我不得不猜测,我会说Sun决定基于JVM堆栈,因为它比注册机更容易实现。(但是,如此处所述,这是不平凡的性能成本。)
Mason Wheeler 2013年

我找不到参考,但是我认为Sun决定采用基于堆栈的字节码方法,因为它可以轻松地在低寄存器架构上运行JVM。
流量

1
对于硬件ISA,是肯定的注册机。基本上每个CPU /微控制器都是一台寄存器机,因为相比之下,其他所有东西都很糟糕。有些寄存器很少,就像一个累加器,也许是一个或两个指针或索引寄存器,但是从计算理论的角度来看,它仍然更像是一个寄存器机器。但是,我们谈论的是经过解释的 VM ,因此如果内存中实际上存在一个“注册文件”。除非您将JIT编译为本机代码。reg比堆栈快的原因非常不同。
彼得·科德斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.