什么是“寄存器机”?
来自 http://code.google.com/p/unladen-swallow/wiki/ProjectPlan 的内容摘录:
“使用即时编译(JIT)将使我们能够把Python从基于栈的机器转移到基于寄存器的机器,这在其他类似语言中已经证明能提高性能(Ierusalimschy 等,2005;Shi 等,2005)。”
在大学时,我为一种支持递归过程的语言构建了一个简单的编译器——它为每个调用的过程维护了栈帧,这样就可以递归调用,并且参数和返回值也能正常工作……
有两个问题:
1) 我理解的是否正确,我实现的东西可以被称为“基于栈的机器”,因为上面引用的术语?
2) 如果我在第(1)点的假设是对的,那么“基于寄存器的机器”是如何工作的?也就是说,它和基于栈的机器有什么不同?
谢谢!
6 个回答
寄存器机器使用固定数量的寄存器或“桶”来存储计算过程中的中间值。举个例子,“加法”指令可以把两个特定寄存器里的值相加,然后把结果存储到另一个寄存器里。
栈式机器则使用一个栈来存储计算过程中的中间值。比如,要加两个数字时,“加法”指令会从栈里取出两个值,把它们相加,然后把结果再放回栈里。
寄存器机器几乎总是有一个栈。
但是栈机器很少有明显可见的寄存器,或者可能只有一两个寄存器。
寄存器机器可能有一些栈操作,甚至可能有栈寻址模式。
它们的区别在于使用的方式。寄存器机器主要有一些指令是针对寄存器的,同时也有少量指令用于在寄存器和栈或内存之间加载和存储数据。
而栈机器……实际上作为硬件设备非常少见……它的指令直接在栈上操作,并且也有少量指令用于在栈和内存之间加载和存储数据。
现在,硬件寄存器机器比硬件栈机器快的原因,可能和软件“寄存器”虚拟机比软件“栈”机器快的原因无关,正如引用的论文所说。
对于软件虚拟机,显然是需要执行的指令更少。根据引用的论文中的说法,这是通过实验证明的,但我想这可能是因为在寄存器机器中,像推入、弹出和交换这样的额外指令要少得多,并且寄存器机器可以轻松重用操作数,如果它们仍然在寄存器文件中,而不需要加载或推入操作。当然,这其实都是内存;它们是虚拟寄存器。
寄存器机器是一种硬件或软件单元,它在处理数据时,会从内存中取出数据,把它放到一个可以快速处理的位置,然后再把结果返回。
举个例子,普通的CPU就是一种寄存器机器。因为CPU里的算术逻辑单元(ALU)只能在寄存器中处理数字。
而基于栈的机器则是把数据放到一个栈上,然后可以从栈上取出或放入数据。
比如,两个数字相加的过程可以这样表示:
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