究竟有哪些优点和缺点使用基于寄存器的虚拟机与使用基于堆栈的虚拟机?
对我来说,这似乎是虽然基于寄存器的机器会比较直接的编程和更高效。 那么,为什么是它的JVM,CLR中,和Python的虚拟机都是基于堆栈的?
究竟有哪些优点和缺点使用基于寄存器的虚拟机与使用基于堆栈的虚拟机?
对我来说,这似乎是虽然基于寄存器的机器会比较直接的编程和更高效。 那么,为什么是它的JVM,CLR中,和Python的虚拟机都是基于堆栈的?
这已经回答了,到一定的水平,在鹦鹉虚拟机的常见问题及相关文件: 一只鹦鹉概述从文档中的有关内容是这样的:
鹦鹉VM将有一个寄存器架构,而不是堆栈架构。 它也将有非常低级别的操作,更类似于Java的比Perl和Python之类的中等水平欢声笑语。
作出这一决定的理由主要是由底层硬件类似于在一定程度上,它可能鹦鹉字节码编译到高效的本地机器语言。
此外,在高级语言很多程序包括嵌套函数和方法调用,有时词法变量来保存中间结果。 在非JIT的设置,基于堆栈的虚拟机将弹出,然后推相同的操作数很多次,而基于寄存器的虚拟机将只分配寄存器适量,并对其进行操作,它可以显著减少运算量和CPU时间。
您可能还需要阅读此: 寄存器VS栈解释设计引用了一点:
有没有真正的疑问,它更容易对堆栈机生成代码。 大多数大一学生的编译器可以做到这一点。 一个寄存器机器生成的代码是一个有点艰难,除非你把它当作与蓄能器堆栈机。 (这是可行的,虽然不是从性能的角度来看理想稍差)瞄准的简单是不是什么大不了的事,至少不适合我,部分原因是这么几个人实际上是要直接针对它 - 我的意思是,来吧,有多少人你知道究竟是谁尝试写东西的人会永远关心编译器? 这些数字是很小。 另一个问题存在许多与编译器知识的人已经很舒服目标寄存器机器,这就是所有常用的硬件CPU都。
在硬件中实现,基于寄存器的机器将是更有效的,只是因为有访问较慢RAM少。 在软件方面,但是,即使是基于寄存器的架构将极有可能在RAM中的“登记”。 基于堆栈的机器将是刚刚在这种情况下,作为高效。
另外一个基于堆栈的虚拟机将会使人们更方便写的编译器。 你不必处理寄存器分配策略。 你有,基本上,寄存器的数量不受限制工作,并具。
更新:我写这个回答假设的解释VM。 它可能不适合编译VM中的JIT成立。 我跑过本文这似乎表明,编译VM中的JIT可以使用寄存器架构更有效率。
在传统上,虚拟机的实现者青睐基于堆栈的架构基于寄存器由于容易编写编译器后端“的VM实现的简单” - 大多数虚拟机都是最初设计到主机的单一语言和代码密度和可执行堆栈架构都不约而同地比对可执行文件的架构寄存器较小。 简单性和代码密度的性能为代价。
有研究表明,一个基于寄存器的体系结构要求的47%的平均少执行比基于栈的架构VM指令,和寄存器代码比相应的堆栈代码,但取更多VM指令的这种增加成本大25%,由于较大的代码尺寸包括每个虚拟机指令,它是微不足道的只有1.07%的额外真机负载。 在基于寄存器的虚拟机的整体性能是它需要平均少32.3%的时间来执行标准的基准测试。
对于基于堆栈的虚拟机建立一个原因是,实际的操作码VM可以更小和更简单(无需编码/解码操作数)。 这使得生成的代码更小,也使得VM代码更简单。
多少个寄存器,你需要什么?
我可能会需要至少比一个多。
这不是明显,我认为是“基于寄存器的”虚拟机将是“更直着程序”或“更有效”。 也许你认为虚拟寄存器将提供在JIT编译阶段一条捷径? 这肯定不会是这样的,因为真正的处理器可能比VM更多或更少的寄存器,这些寄存器可以以不同的方式使用。 (示例:将要减少,最好放置在ECX寄存器的值在x86处理器)。如果真机比VM更多的寄存器,然后你就浪费资源,少你已经使用“寄存器焉得虎子诚为本”的节目。
基于堆栈的虚拟机更简单,代码更加紧凑。 作为一个真实的例子,一个朋友建(大约30年前)数据记录了自制第四VM上Cosmac系统。 第四VM为30个字节的代码的机器上的ROM 2K和256个字节的RAM。
基于堆栈的虚拟机更容易生成代码。
基于寄存器的虚拟机都更容易地创建快速的实现,也更容易产生高度优化的代码。
对于你的第一次尝试,我建议首先是基于VM堆栈。