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

今天我正在阅读一些关于Andoird基础知识的幻灯片 ,这句话出现了:

Dalvik VM是基于寄存器而不是基于堆栈的。

那么, 基于寄存器的虚拟机与基于堆栈的虚拟机有什么区别呢?


第二个链接回答了我的问题:

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

Solutions Collecting From Web of "基于寄存器的VM与基于堆栈的VM之间的主要区别是什么?"

这篇文章是相当丰富的: http : //www.codeproject.com/Articles/461052/Stack-based-vs-Register-based-Virtual-Machine-Arch

“基于堆栈的虚拟机基于堆栈的虚拟机在上面几点中实现了虚拟机所需的一般特性,但是存储操作数的内存结构是一个堆栈数据结构,操作是通过从堆栈,处理它们并以LIFO(后进先出)方式推回结果。在基于堆栈的虚拟机中,添加两个数字的操作通常按以下方式执行(其中20,7和'结果“是操作数):

stackAdd

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

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

registerAdd

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

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

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

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