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

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

在大学里,我为具有递归过程的语言构建了一个简单的编译器 - 它为每个调用的过程维护堆栈框架 - 以便可以递归地调用它们,以便参数和返回值可以工作......

2件事:

1)考虑到上面引用中使用的术语,我是否正确地认为我所实现的将被视为“基于堆栈的机器”?

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

谢谢!

有帮助吗?

解决方案

注册机是一个硬件或软件单元,在处理数据时从内存中取出它,将其放在可以快速处理它的位置,然后返回结果。

例如,常规CPU是注册机器。由于ALU(在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

其他提示

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

但堆栈机器很少有架构上可见的寄存器,或者它可能只有一个或两个。

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

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

堆栈计算机..这些非常罕见,因为实际的硬件设备..将直接在堆栈上运行其指令,并且将有一堆操作用于在堆栈和内存之间加载和存储。

现在,硬件注册机器比硬件堆栈机器更快的原因可能与软件“注册”的原因无关。根据所引用的论文,VM比软件“堆栈”更快。机等。

对于软件VM来说,显然需要执行更少的指令。根据引用文章中的说法,这是根据经验确定的,但我想这是因为需要在注册机中完成更少的推送,弹出和交换等开销指令,并且因为如果它们仍然可以轻松地重复使用操作数躺在寄存器文件中,无需加载或推送操作。当然,这真的只是记忆;它们是虚拟寄存器。

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

基于堆栈的机器使用堆栈在计算期间存储中间值。例如,要添加两个数字,请添加“添加”。指令从堆栈中弹出两个值,添加它们,然后将结果推回堆栈。

1)我认为我实施的内容将被视为“基于堆栈的机器”,鉴于上面的报价中使用的术语?

并不真地。某种堆栈几乎是实现递归函数调用的唯一方法。但是“基于堆栈的机器”在这方面走得更远 一切 通过堆栈。不仅是函数调用,还包括算术运算。在某种程度上,它们的行为就好像每个机器指令都是通过堆栈处理的函数调用。它使得机器设计非常简单,但很难编写汇编程序/机器代码。

2)如果我对(1)的假设是正确的,那么“注册机”如何工作?IE。它与基于堆栈的机器有何不同?

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

IIRC 有两种堆栈机:

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

寄存器机器是一个抽象机器,其操作码是通过引用它们在一组命名寄存器上的操作来定义的,而不是通过它们在堆栈顶部的操作来定义。

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

在堆栈计算机中:可以定义add以从堆栈中弹出两个操作数,添加它们,并将结果推送到堆栈。

您的编译器是否生成了机器代码?如果是这样,那么它的目标就是一台注册机(几乎所有的CPU设计都是注册机)。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top