java - 基于堆栈的机器依赖于基于寄存器的机器?

标签 java android jvm jvm-languages

普通 CPU(例如 Android 设备)是基于寄存器的机器。 Java 虚拟机是基于堆栈的机器。但是基于堆栈的机器是否依赖于基于寄存器的机器才能工作?基于堆栈的机器不能因为不是操作系统而孤独地运行吗?除 JVM 外,是否有任何基于堆栈的机器示例?有人说 1 个操作数,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 中失去了很多基础,但仍然广泛用于需要在各种平台上呈现可缩放图形的环境中。从技术上讲,它是一种图灵完备的编程语言,尽管很少有人以这种方式使用它。

关于java - 基于堆栈的机器依赖于基于寄存器的机器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5101908/

相关文章:

java - 有没有一种安全的方法来制作 HashSet<int[]> 而不用手动将它包装在另一个对象中?

android - 可以获得带有 Product 风格的 .aar

用于线性布局的 Android 幻灯片动画

java - Docker 容器 - JVM 内存峰值 - Arena Chunk 内存空间

java - 如何禁止 Java VM 在崩溃/将敏感数据写入磁盘时创建任何转储

java - Timer和TimerTask问题:“Timer.class不在android.jar中”和“应用程序意外停止”?

java - 检索存储在JSONArray中的HashMap的 key

java - 具有两种类型的Java自引用泛型

java - 设置安卓:windowIsFloating programmatically

java - JVM/JAVA 中的预取指令