【问题标题】:Stack-based machine depends on a register-based machine?基于堆栈的机器依赖于基于寄存器的机器?
【发布时间】:2011-07-03 09:08:59
【问题描述】:

普通 CPU(例如 Android 设备)是基于寄存器的机器。 Java 虚拟机是基于堆栈的机器。但是基于堆栈的机器是否依赖于基于寄存器的机器才能工作?基于堆栈的机器不能因为不是操作系统而孤独地运行吗?除 JVM 外,是否有任何基于堆栈的机器示例?有人说 1 个操作数,2 个操作数;为什么需要这个?

【问题讨论】:

  • 我认为这个问题应该属于programmers.stackexchange.com 虽然它非常好,我也对它的答案感兴趣。

标签: java android jvm jvm-languages


【解决方案1】:

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 中失去了很多基础,但仍广泛用于需要在各种平台上呈现可缩放图形的环境中。从技术上讲,它是一种图灵完备的编程语言,尽管很少有人以这种方式使用它。

【讨论】:

  • @Mikhail Naimy-理论上,是的,因为 JVM 从未在任何地方提及“注册”一词,但实际上没有。您必须有寄存器来实现 JVM 的硬件逻辑才能正常运行。
  • 不错的答案。我将O(1) 读为“恒定数量”,将O(n) 读为“全部可用”。对吗?
【解决方案2】:

我知道您已经选择了答案,但我想解决整个“堆栈机器”的问题。

虽然大多数物理 CPU 实际上是寄存器机,但也有堆栈机作为物理 CPU。例如Burroughs' B5000- and B6000-series machines,或用于太空飞行的RTX2000-series 芯片(最初由 Chuck Moore 在门阵列逻辑中实现,后来商业化)。 UCSD Pascal p-Machine 也由各种实现者直接在硬件中实现。

就计算强度而言,寄存器和堆栈机大致相当。 (当然,这取决于您正在处理的寄存器或堆栈机器的精确模型。)堆栈机器具有简单、小尺寸和可扩展性的优点。注册机往往更快。寄存器机器可以模拟堆栈机器(毕竟这就是 x86 架构中的 BP 和 SP 寄存器的用途!),如果需要,堆栈机器本身可以模仿寄存器机器。


编辑添加

我几乎忘了给你指出一个book,它深入讨论了堆栈计算机。 Koopman 有点喜欢堆栈计算机,他关于堆栈计算机是“新浪潮”的预测大错特错,但读起来很有趣。

【讨论】:

  • 堆栈机器如何在没有寄存器的情况下完美运行,你能回答吗?
  • 注册机器的运行方式相同,只是操作码会从堆栈中推送和弹出,并在堆栈的顶部条目/条目上执行操作。阅读我链接的书。
  • +1,我已使用您帖子中的信息来回答我在此处发布的问题:stackoverflow.com/questions/14603264/…。请随时回答我的问题,以便我给你一些功劳。
猜你喜欢
  • 2012-01-31
  • 2012-11-20
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 2020-07-09
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多