10

可以肯定地说 Java 虚拟机“最初”是为 Java 编程语言设计的,但现在,其他开发人员已经能够编写编译为 Java 字节码的编程语言,如 Scala、Jython 和 JRuby。

Java 字节码中仍然存在“面向对象”的引用,例如接口、方法、字段。例如,invokespecial 是对“对象”方法的调用。

它不是具有纯语言无关指令集的纯堆栈虚拟机。例如,纯 FORTH 实现将只有堆栈操作。

问题是,JVM 语言是否不可知?

4

4 回答 4

9

JVM 绝对不是与语言无关的,有些语言无法在其上有效地实现。例如,JVM 不提供内存寻址操作,因此像 C 这样的低级语言的实现将非常低效。但是它的原语集能够支持许多流行的语言,这些语言具有与 Java 不同的特性,只要有一个合适的智能编译器。可以体面实现的语言不一定只是带有语法糖的Java;但是当然,你从 Java 中获得的差异越大,实现该语言的难度就越大

于 2011-09-20T14:42:41.743 回答
4

JVM 与语言无关;但是,它的语言是 JVM 字节码。考虑一下虚拟机的组装,然后您将对 JVM 运行什么有一个很好的了解。选择 JVM 字节码是为了方便运行 Java 程序,但就像任何“足够完整”的程序集一样,它可以用于许多其他事情。关键是在编译过程中正在做什么。

其他语言障碍包括 JVM 是基于堆栈的机器的设计,这意味着显式地址对于字节码层中的 JVM 来说是无意义的。没有“加载”或“存储”操作;然而,这并不能阻止那些想要实现在 JVM 上进行寻址的语言的人。这只会让那些想要解决问题的人更难。

要在 JVM 上进行寻址,您基本上是编写一个模拟器;您有一个包含“地址到对象句柄”查找表的对象。这允许您通过在缺乏寻址的虚拟机上进行模拟来进行基本寻址。它并不总是很漂亮,并且模拟的质量通常只扩展到模拟语言允许的用例。

是的,在将地址(对象)映射到(对象到 Java 堆引用)到(在 JVM 内部)对物理内存地址的 Java 堆引用时,确实会损失一些性能。但这就是保持平台不可知论必须做的事情。如果你有直接的内存访问,你最终会被迫为不同的硬件平台编码,而不是为虚拟机编码。好吧,至少你会比现在更早地被推送到特定于平台的代码中。

于 2011-09-20T14:51:54.080 回答
4

在 JVM 和 java 字节码是图灵完备的意义上,任何其他图灵完备的语言都可以转换和编译为 java 字节码并在 JVM 上运行。这可能效率极低,但并非不可能。至于“不可知论”的最严格定义,没有这样的事情。在硬件级别,所有处理器都有一组定义的它们支持的二进制指令,因此在某些时候,任何语言都必须转换为与其应该执行的硬件兼容的程序集。

编辑:JVM 不是在真空中开发的,它是与 JAVA 编程语言一起开发的,因此 Java 语言严重影响了 Java 字节码和 JVM 的设计是有道理的。因此,从这个意义上说,您可以说 JVM 的设计考虑了 Java。但同样真实的是,在架构中,JVM 有意识地与 Java 语言分离(通过中间字节码格式),因此设计中的一些元素考虑了可能的替代语言。

于 2011-09-20T15:09:01.633 回答
2

忽略内置的 OOP 指令,一些语言更适合基于寄存器的 VM(如 parrot)而不是基于堆栈的 VM(如 JVM)。

本文很好地涵盖了这个问题:http: //db.usenix.org/events/vee05/full_papers/p153-yunhe.pdf

于 2011-09-20T14:55:20.967 回答