Java虚拟机语言是不可知的吗?

Java虚拟机语言是不可知的吗?,java,language-agnostic,stack,forth,Java,Language Agnostic,Stack,Forth,可以肯定地说,Java虚拟机“最初”是为Java编程语言设计的,但现在,其他开发人员已经能够编写编译成Java字节码的编程语言,如Scala、Jython和JRuby Java字节码中仍然有“面向对象”的引用,如接口、方法和字段。例如,invokespecial是对“object”方法的调用 它不是一个纯堆栈虚拟机,具有纯语言无关的指令集。例如,纯FORTH实现将只具有堆栈操作 问题是,JVM语言是否不可知 JVM绝对不是语言不可知论者,有些语言无法在其上高效实现。例如,JVM不提供内存寻址操作

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

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

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


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

JVM绝对不是语言不可知论者,有些语言无法在其上高效实现。例如,JVM不提供内存寻址操作,因此像C这样的低级语言的实现效率极低。但是如果有一个合适的智能编译器,它的原语集能够支持许多具有不同于Java的特性的流行语言。可以恰当地实现的语言不一定只是带有语法糖的Java;当然,Java与Java的区别越大,实现语言就越困难。JVM不是语言不可知论者;然而,它的语言是JVM字节码。考虑到虚拟机的组装,然后您将对JVM的运行有一个很好的了解。选择JVM字节码是为了方便运行Java程序,但与任何“足够完整”的程序集一样,它可以用于许多其他用途。关键是编译过程中要做什么

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

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


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

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


本文很好地讨论了这个问题:

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

编辑:
JVM不是在真空中开发的,它是与JAVA编程语言一起开发的,因此JAVA语言对JAVA字节码和JVM的设计产生了重大影响。因此,从这个意义上讲,可以说JVM的设计考虑到了Java。但在体系结构中,JVM是有意识地与Java语言分离的(通过中间字节码格式),因此设计中有一些元素考虑了可能的替代语言。

。。。只要那些“流行语言”在语义上等同于Java…@SK:以克林顿的方式,我不得不说这取决于你对“语义等价”的定义;Ruby有“duck typing”,但JRuby仍然存在,Java仍然是一种命令式的面向对象语言。JRuby也有类似的程序流程。使用对象上的参数调用方法并重复。在Java虚拟机上实现Haskell或Erlang之类的东西,如果没有黑客攻击,可能会有困难。@Ernest,这只是一个小区别,JRuby编译器仍然非常复杂。JVM不允许您高效地编译任何与Java明显不同的语言(而且Ruby从来都不是为了高效而设计的)。两个主要问题是:缺少明确的尾部调用和荒谬的方法大小限制。如果需要,可以用Java为另一种语言编写解释器。这就是他们如何在JVM中获得许多语言,特别是当语言对JVM不适用的机器做出假设时。由于所有图灵完备语言都具有(可证明的)同等的(表达)能力,因此每个图灵完备语言都应该存在一些Rube Goldberg解决方案来模拟另一个图灵完备语言的操作。我的意思是,JVM是否专门为Java设计。+1是的,它们都是图灵完备的,在一个或另一个效率水平上,可以用来模拟另一个。@BerlinBrown JVM不是在真空中开发的,它是与JAVA编程语言一起开发的,因此JAVA语言对JAVA字节码和JVM的设计产生了重大影响是理所当然的。因此,从这个意义上讲,可以说JVM的设计考虑到了Java。但事实确实如此