可以肯定地说,Java虚拟机“最初”是为Java编程语言设计的,但现在,其他开发人员已经能够编写编译为Java字节码的编程语言,如Scala、Jython和JRuby。
在Java字节码中仍然有“面向对象”的引用,比如接口、方法、字段。例如,invokespecial是对“object”方法的调用。
它不是一个纯语言不可知指令集的纯堆栈虚拟机。例如,纯FORTH实现将只有堆栈操作。
问题是,JVM语言是不可知的吗?
发布于 2011-09-20 15:09:02
在JVM和java字节码是图灵完成的意义上,任何其它图灵完成语言都可以被转换和编译成java字节码并在JVM上运行。它的效率可能非常低,但也不是不可能。至于“不可知论者”的最严格的定义,没有这样的事情。在硬件级别,所有处理器都有一组定义的二进制指令,因此在某些情况下,任何语言都必须转换为与其应该在其上执行的硬件兼容的汇编。
编辑: JVM不是在真空中开发的,它是与JAVA编程语言一起开发的,因此Java语言很大程度上影响了Java字节码和JVM的设计。因此,在这个意义上,您可以说JVM在设计时就考虑到了Java。但在体系结构中,JVM有意识地与Java语言解耦(通过中间字节码格式),因此在设计中有一些元素考虑了可能的替代语言。
发布于 2011-09-20 14:42:42
JVM绝对不是语言不可知的,有些语言不能在JVM上有效地实现。例如,JVM没有提供内存寻址操作,因此实现像C这样的低级语言将是非常低效的。但它的原语集能够支持许多流行的语言,具有不同于Java的功能,只要有一个适当的智能编译器。可以很好地实现的语言不一定只是加了语法糖的Java;当然,与Java的差异越大,实现这种语言就越困难
发布于 2011-09-20 14:51:54
JVM不是语言不可知的;但是,它的语言是JVM字节码。考虑虚拟机的组装,然后您将对JVM运行的内容有一个很好的了解。选择JVM字节码是为了方便Java程序的运行,但就像任何“足够完整”的程序集一样,它也可以用于许多其他用途。关键是编译过程中正在做什么。
其他语言障碍包括JVM是基于堆栈的机器的设计,这意味着显式地址对于字节码层中的JVM来说是无意义的。没有“加载”或“存储”操作;然而,这并不能阻止那些想要在JVM上实现寻址的语言的人。这只会让那些想要寻址的人变得更加困难。
要在JVM上进行寻址,基本上需要编写一个模拟器;在模拟器中,您有一个包含"address To object handle“查找表的对象。这允许您通过在缺乏寻址的虚拟机上进行模拟来执行基本寻址。它并不总是很好,并且模拟的质量通常只扩展到模拟语言允许的用例。
是的,将(对象的)地址映射(对象到Java堆引用)到(在JVM内部) java堆引用到物理内存地址,确实会造成一些性能损失。但这就是保持平台不可知性所必须做的事情。如果您可以直接访问内存,那么您最终将不得不为不同的硬件平台编码,而不是为虚拟机编码。好吧,至少你会比现在更早地被推入特定于平台的代码中。
https://stackoverflow.com/questions/7487045
复制相似问题