普通 CPU(例如 Android 设备)是基于寄存器的机器。Java 虚拟机是基于堆栈的机器。但是基于堆栈的机器是否依赖于基于寄存器的机器才能工作?基于堆栈的机器不能因为不是操作系统而孤独地运行吗?除 JVM 外,是否有任何基于堆栈的机器示例?有人说 1 个操作数,2 个操作数;你为什么需要这个?
2 回答
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 中失去了很多基础,但仍然广泛用于需要在各种平台上呈现可缩放图形的环境中。从技术上讲,它是一种图灵完备的编程语言,尽管很少有人以这种方式使用它。
我知道您已经选择了答案,但我想解决整个“堆栈机”问题。
虽然大多数物理 CPU 实际上是寄存器机,但也有堆栈机作为物理 CPU。 例如, Burroughs 的 B5000 和 B6000 系列机器,或用于太空飞行的RTX2000 系列芯片(最初由 Chuck Moore 在门阵列逻辑中实现,后来商业化)。UCSD Pascal p-Machine也由各种实施者直接在硬件中实施。
在计算强度方面,寄存器和堆栈机大致相当。(当然,这取决于您正在处理的寄存器或堆栈机器的精确模型。)堆栈机器具有简单、小尺寸和可扩展性的优点。注册机往往更快。寄存器机器可以模拟堆栈机器(这就是 x86 架构中的 BP 和 SP 寄存器的用途,毕竟!)如果需要,堆栈机器本身可以模仿寄存器机器。
编辑添加
我几乎忘了给你指一本深入讨论堆栈计算机的书。Koopman 有点喜欢堆栈计算机,他预测它们是“新浪潮”是可悲的错误,但读起来很有趣。