“寄存器机”是什么?

25

引用自http://code.google.com/p/unladen-swallow/wiki/ProjectPlan:

"使用JIT也将使我们能够将Python从基于堆栈的机器转移到基于寄存器的机器,这已经被证明可以提高其他类似语言的性能(Ierusalimschy等人,2005年; Shi等人,2005年)。"

我在大学里编写了一个包含递归过程的简单语言的编译器,该编译器为每个调用的过程维护了堆栈帧,以便它们可以被递归调用并且参数和返回值有效....

两件事:

1)我认为我实现的内容会被视为“基于堆栈的机器”,这是以上引文中使用的术语吗?

2)如果我在第1点中的假设是正确的,那么“寄存器机器”是如何工作的?即它与基于堆栈的机器有何不同?

谢谢!


顺便说一句,我必须得说,ProjectPlan 看起来措辞很糟糕,很难想象作者真的相信他所说的话。解释型和 JIT 之间的区别只需要完全淹没 SW 堆栈 VM 和 SW 寄存器 VM 之间的区别,而这个区别在 JIT 转码后甚至不会被保留。 - DigitalRoss
6个回答

24

寄存器机是一种硬件或软件单元,当处理数据时,它将其从内存中取出并放入可以快速处理的位置,然后返回结果。

例如,常规 CPU 就是一种寄存器机。由于算术逻辑单元(CPU 中负责数字计算的单元)只能使用寄存器中的数字。

堆栈机将数据添加到堆栈中,然后进行弹出或推入操作。

例如,将两个数字相加的步骤为:

Push 2 // Push 2 onto the stack
Push 3 // Push 3 onto the stack
Add // Add the top two things on the stack.

在寄存器机中,它会是这样的。

Load x, r0 // Load x onto register 0
Load y, r1 // Load y onto register 1
Add r0, r1, r2 // Add 1 and 2 and store the result in register 2

11

一台寄存器机几乎总是有一个堆栈。

但堆栈机很少具有体系结构可见的寄存器,或者只有一个或两个。

寄存器机可能有一些堆栈操作,并且甚至可能具有堆栈寻址模式。

区别在于方向。寄存器机将主要具有对寄存器进行操作的指令,并且将具有少量用于在寄存器、堆栈或存储器之间加载和存储的操作。

堆栈机......这些实际硬件设备非常罕见......将直接使用其指令在堆栈上操作,并且具有少量用于在堆栈和存储器之间加载和存储的操作。

现在,硬件寄存器机比硬件堆栈机更快的原因可能与软件“寄存器”虚拟机比软件“堆栈”虚拟机更快的原因不相关,据引用的论文所述。

对于软件虚拟机,显然需要执行较少的指令。根据引用论文中的说法,这是经验性确定的,但我想这是因为在寄存器机中需要做的类似于推入、弹出和交换的开销指令要少得多,并且因为寄存器机可以轻松地重用操作数,如果它们仍然在寄存器文件中,而不需要加载或推送操作。当然,这实际上只是内存;它们是虚拟寄存器。


5

寄存器机使用固定数量的寄存器或桶来存储计算过程中的中间值。例如,“add”指令可以将两个特定寄存器中的值相加,并将结果存储在另一个寄存器中。

基于栈的机器使用堆栈来存储计算过程中的中间值。例如,要添加两个数字,“add”指令会从堆栈中弹出两个值,将它们相加,并将结果推回到堆栈中。


4

1) 我的理解是,根据上面引用中使用的术语,“我实现的东西”被认为是“基于堆栈的机器”,这个理解正确吗?

不完全正确。某种类型的堆栈是实现递归函数调用的唯一方式。但是,“基于堆栈的机器”通过堆栈来执行所有操作,而不仅仅是函数调用,还包括算术运算。从某种意义上说,它们的行为就像每个机器指令都是通过堆栈处理的函数调用。这使得机器设计非常简单,但编写汇编程序/机器代码却相当困难。

2) 如果我在问题(1)中的假设是正确的,那么“寄存器机器”是如何工作的?即与“基于堆栈的机器”有何不同?

寄存器机器具有一些快速的内部存储器(寄存器),并且大多数操作都在这些寄存器中的数据上执行。还有其他的机器指令用于在寄存器和主存储器之间复制数据。

如果我没记错,有两种类型的堆栈机器:

  • 累加器机器具有“累加器”,它基本上是一个保存计算结果(并且可能还提供操作数)的单个寄存器,大多数机器指令都在累加器上执行。
  • “纯”堆栈机器在消耗操作数后将计算结果放置在堆栈顶部。

2

寄存器机是一种抽象机器,其操作码通过对一组命名寄存器的操作来定义,而不是通过对栈顶部分的操作来定义。

在寄存器机中:add 可以被定义为取三个寄存器名称作为操作数,将前两个的内容相加,并将结果放入第三个寄存器中。(更常见的设计是只命名一个或两个,并且结果始终放在一个特殊的累加寄存器中,但这不是重点。)

在堆栈机中:add 可以被定义为从堆栈中弹出两个操作数,将它们相加,并将结果推回到堆栈中。


2

你的编译器是否生成了机器代码?如果是,那么它的目标是寄存器机器(几乎所有CPU设计都是寄存器机器)。

堆栈机器将所有值存储在堆栈中,而寄存器机器具有固定数量的存储槽,其“地址”不会更改(与堆栈机器不同)。


我实际上没有生成机器码 - 只是汇编代码。汇编器的机器架构具有算术寄存器和标志寄存器 - 因此,如果我理解正确,它应该是一个“寄存器机器”。 - Dafydd Rees

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接