2012-10-12 37 views
9

今天我读some slides about Andoird basics和短语出现了:基于寄存器的VM与基于堆栈的VM之间的主要区别是什么?

Dalvik虚拟机是基于而不是基于堆栈的注册。

那么,基于寄存器的VM与基于堆栈的VM之间的主要区别是什么?


第二个环节answerd足够我的问题:

http://markfaction.wordpress.com/2012/07/15/stack-based-vs-register-based-virtual-machine-architecture-and-the-dalvik-vm/

另一个链接:

http://androidjayavelu.blogspot.co.at/2011/06/dalvik-virtual-machine-vs-java-virtual.html

+1

来自Java源代码级别没有概念上的区别,区别在于字节码(即javac产生的),其中基于堆栈的字节码是根据堆栈编写的,而基于寄存器的模型(惊喜!)字节码是按照 –

+3

(JIT编译的Java,即使在“基于堆栈”的架构上,也是基于寄存器的)。 –

+0

此链接将帮助您获得更多解释http://markfaction.wordpress.com/2012/07/ 15/stack-based-vs-register-based-virtual-machine-architecture-and-the-dalvik-vm/ – LeoMobDev

回答

2

这篇文章是非常翔实,以及: http://www.codeproject.com/Articles/461052/Stack-based-vs-Register-based-Virtual-Machine-Arch

“基于堆栈的虚拟机 基于堆栈的虚拟机在上面几点中实现了虚拟机所需的一般特性,但存储操作数的内存结构是堆栈数据结构。操作是通过弹出堆栈中的数据,处理它们并以LIFO(后进先出)方式推回结果来执行的。

stackAdd

POP 20 POP:在一个基于堆栈的虚拟机,两数相加的操作通常会被以下面的方式(其中,20,7,和“结果”是操作数)进行7 ADD 20,7,结果 PUSH结果 由于PUSH和POP操作,需要四行指令来执行加法操作。基于栈的模型的一个优点是操作数由堆栈指针(上图中的SP)隐式地寻址。这意味着虚拟机不需要明确知道操作数地址,因为调用堆栈指针会给(Pop)下一个操作数。在基于堆栈的虚拟机中,所有的算术和逻辑操作都是通过推送和弹出操作数和堆栈结果来完成的。

基于寄存器的虚拟机 在基于寄存器的虚拟机实现中,存储操作数的数据结构基于CPU的寄存器。这里没有PUSH或POP操作,但指令需要包含操作数的地址(寄存器)。也就是说,指令的操作数在指令中明确指出,不同于基于堆栈的模型,其中我们有一个指向操作数的堆栈指针。例如,当加法运算是要在寄存器基于虚拟机上执行,该指令会或多或少如下:

registerAdd

ADD R1,R2,R3; #添加R1和R2的内容,将结果存储在R3中 正如我之前提到的,没有POP或PUSH操作,因此添加指令只是一行。但与堆栈不同,我们需要明确提及R1,R2和R3的操作数地址。这样做的好处是,从堆栈压入和弹出的开销不存在,基于寄存器的VM中的指令在指令调度循环内执行得更快。

基于寄存器的模型的另一个优点是它允许一些优化不能在基于堆栈的方法中完成。其中一个例子是代码中存在常见的子表达式,当子表达式再次出现时,寄存器模型可以计算一次并将结果存储在寄存器中供将来使用,从而降低重新计算表达式的成本。

基于寄存器的模型的问题在于,平均寄存器指令大于平均堆栈指令,因为我们需要明确指定操作数地址。尽管由于堆栈指针而导致堆栈机器的指令很短,但是相应的注册机器指令需要包含操作数位置,并且与堆栈代码相比导致更大的寄存器代码。

我遇到的一篇很棒的博客文章(在此链接中)包含基于注册表的虚拟机的解释性和简单的C实现。如果实现虚拟机和解释器是您的主要兴趣,ANTLR创建者Terrence Parr的书名为“语言实现模式:创建您自己的领域特定和一般编程语言”,可能会非常方便。“

+0

如果这是答案,请在此粘贴相关代码;链接可以改变,这个答案将不再相关。 – rfornal

相关问题