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 - 如何在java中将实体图(.vpp)转换为数据库或文本文件

java - 在屏幕上快速收集图像并读取像素

java - 是否可以使用 Java 为 Java Profiler 拍摄快照?

java - 从 uid 列表中检索数据

java - 嵌套 ConfigurationProperties 中的 Spring 属性验证

android - 获取与 Activity 相关的错误未在 fragment 中运行

android - 每次启动时应用程序崩溃

android -\android\build.gradle 行 : 14 : unexpected token: { 中的意外 token

java 8 中的 Java 内存区域

java - Heroku JVM 调优