普通CPU(例如,Android设备)是基于寄存器的计算机。 Java虚拟机是基于堆栈的机器。但是基于堆栈的机器是否依赖于基于寄存器的机器才能工作?不能基于堆栈的机器运行孤独,因为它不是操作系统?除了JVM之外,还有基于堆栈的机器示例吗?有些人说1个操作数,2个操作数;你为什么需要这个?
答案 0 :(得分:7)
JVM没有提到任何地方寄存器的存在。从它的角度来看,内存只存在于少数几个地方,例如每线程堆栈,方法区域,运行时常量池等等。也就是说,如果你想实际实现一个遵循JVM的物理设备,你就是' d几乎肯定需要寄存器来保存执行某些字节码时产生的一些临时值,或者保留一些额外的临时信息。例如,尝试查找multianewarray
指令,看看是否可以在没有寄存器的情况下实现它。 : - )
现在,在实际CPU中可以找到的一个并行程序是,虽然程序员可以使用专用的寄存器集,但是大多数CPU具有更多的寄存器,这些寄存器在内部用于各种目的。例如,大多数MIPS芯片都有大量用于流水线操作的寄存器。它们保存了之前指令中的控制位。如果x86有任何不同,我会被吹走。
要记住的是,它不是真正定义基于寄存器的机器与基于堆栈的机器如何工作的寄存器。在大多数体系结构中,您有O(1)个专用于内部使用的寄存器。甚至JVM都有这些 - 每个方法都有一个“局部变量数组”,它最初保存函数的参数,但如果需要也可以用作临时空间。将堆栈计算机与其他计算机区分开来的更重要的部分是可扩展内存的工作原理。在大多数计算机中,内存是随机访问的,您可以随时从任何位置读取内存。也就是说,对于n个内存位置,您可以随时读取O(n)内存。在基于堆栈的机器中,您只能访问堆栈的前几个位置,因此您一次只能读取O(1)个内存位置。
理论上,因为JVM应该代表一个完整的虚拟机,你可以让一台计算机启动并运行一个没有任何操作系统的JVM(或者说,JVM就是操作系统,而你的“程序”只是Java字节码和类文件。)
还有一些其他基于堆栈的语言,其中第一个突然出现的是Forth。我提到Forth,因为它明确地是基于堆栈的语言;你所做的一切都是在操纵操作数堆栈方面的措辞。关于你原来的问题,这有什么好看的,Forth曾经在业余爱好者中非常受欢迎,因为你可以很容易地将它移植到嵌入式设备。要获得一个完整的Forth解释器工作,你不需要一个非常强大的操作系统 - 你只需要命令解释器。 Forth现在并不那么受欢迎,但它仍然是一种非常酷的语言。
另一种广泛使用的基于堆栈的语言是PostScript,它已经失去了很多PDF版本,但仍然广泛用于需要在各种平台上呈现可伸缩图形的环境中。它在技术上是一种图灵完备的编程语言,但很少有人这样使用它。
答案 1 :(得分:6)
我知道你已经选择了答案,但我想解决整个“堆栈机器”的问题。
虽然大多数物理CPU实际上是寄存器机器,但是堆栈机器已经成为物理CPU。例如,Burroughs' B5000- and B6000-series machines或太空飞行中使用的RTX2000-series芯片(最初由Chuck Moore在门阵列逻辑中实现,后来商业化)。 UCSD Pascal p-Machine直接在硬件中以及各种实施者实施。
就计算强度而言,寄存器和堆栈计算机大致相同。 (当然,这取决于您正在处理的寄存器或堆栈机器的精确模型。)堆栈机器具有简单,小尺寸和可扩展性的优点。注册机器往往更快。注册机器可以模拟堆栈计算机(毕竟这就是x86架构中的BP和SP寄存器所用的!)并且堆栈计算机本身可以根据需要模拟注册计算机。
已编辑以添加
我几乎忘了指向一个深入讨论堆栈计算机的book。库普曼对于堆栈计算机来说有点狂热,他预测他们是“新浪潮”是错误的,但这是一个有趣的读物。