Java虚拟机如何执行用其他语言编写的代码?


12

从Java 1.6开始,JVM不仅可以运行Java,还可以运行多种编程语言。我从概念上了解Java如何在Java VM上运行,但其他语言也无法在Java VM上运行。在我看来,这一切都像黑魔法。您是否有任何文章可向我指出,以便我可以更好地理解它们之间的关系?


2
与您的Intel / AMD / Solaris(??)处理器可以执行“任何语言”的方式相同(尽管您并没有真正运行语言,只是按照这里的流程进行操作),可以将其编译成其本机汇编代码。
Apoorv Khurasia 2012年

13
问题是,JVM 没有运行Java。它运行一种独特的语言(尽管是相关的,并且Java编译器有意轻松地创建它),并且语言更加底层。

那是真实的。但是JVM从版本6开始运行其他语言。您无法(或没有人做过)在1.4.2版中对其运行python或Groovy。为什么呢?有什么变化?
Pomario 2012年

@delnan或者更确切地说是“更底层的执行模型,javac程序知道如何从Java代码中构建代码”。
Apoorv Khurasia 2012年

9
@Pomario Jython已经存在了一段时间。并且页面似乎暗示Jython脚本可以在1.4.2上运行。
Apoorv Khurasia 2012年

Answers:


23

关键是JVM的本地语言:Java字节码。可以将任何语言编译为JVM可以理解的字节码-您所需要做的就是发出字节码的编译器。从那时起,从JVM的角度来看并没有什么不同。如此之多,以至于您可以获取已编译的Scala,Clojure,Jython等类文件,并将其反编译(例如使用JAD)为普通的Java源代码。

您可以在以下文章/主题中找到关于此的更多详细信息:

我不了解Java 56 JVM中的任何根本变化,这些变化可能使其他语言(从其编译的代码)可以在其上运行或变得更加容易。在我的理解中,JVM 1.4在这方面或多或少地具有与JVM 6相同的能力(尽管可能有所不同;我不是JVM专家)。只是在十年的上半年,人们开始开发其他语言和/或字节码编译器,结果在2006年Java 6发布时开始出现(并广为人知)。

但是,所有这些JVM版本都有一些局限性:JVM本质上是静态类型的,并且直到发行版7,才支持动态语言。引入invokedynamic新的字节码指令后,这种情况发生了变化,新的字节码指令使方法调用能够依赖于动态类型检查。


8
JVM不“支持”动态语言并不是完全正确的。他们只需要使用存在严重缺陷的变通办法。
Michael Borgwardt 2012年

3
@MichaelBorgwardt,我们是否可以同意JVM pre v7 允许动态语言(在某种程度上)?:-)
彼得Török

1
这是一个好方法:)
Michael Borgwardt 2012年

3

虚拟机(例如JVM)是​​一个程序,它接受一组简单的指令(通常很容易转换为真实的CPU指令)作为输入(通常是文件),并实际上将其编译并作为本机CPU指令运行(通常使用按需编译器(例如HotSpot或JIT)。

它本质上是抽象层。由于几个相似之处(例如基于堆栈),将VM指令集实现移植到不同的处理器体系结构通常要容易得多。将不同的编程语言移植到VM指令也容易得多,因为与原始CPU指令相比,它更面向现代编程语言。许多虚拟机(例如JVM和CLR(.NET))都包含有关调用虚拟方法和创建对象实例的指令。

让我们以一种语言为例。称之为MyLanguage。由于它是一种编程语言,因此最终可以编译为一些CPU体系结构指令集。因此,这意味着,在给定兼容,灵活的虚拟机指令集的情况下,还可以将MyLanguage编译为该VM的指令集。

效率总是存在问题,因为您可能需要破解VM指令集中的一些变通方法,而这些变通方法本来不是必须要做的,但是仍然有可能。


3

JVM是图灵完备的计算机(有限的内存除外),任何图灵完备的计算机(物理或虚拟)都可以执行任何编程语言(内存,性能和物理IO限制除外)。


Erm ....为什么我们需要编译器?;-)
彼得Török

编译器和解释器本身可以在图灵机上运行(可能很慢)。也许一些预编译/翻译步骤可以提高以某种给定语言运行某个给定程序的性能?
hotpaw2

1
我的观点是,您的陈述“任何一台图灵完备的计算机(物理或虚拟的)都可以执行任何编程语言”,这实际上意味着我的笔记本电脑的x86 CPU可以直接执行我现在正在使用的这个漂亮的Java源文件。或PowerPC处理器的机器代码。没有编译器-CPU不包含编译器吗?:-)
彼得Török

您的“机器”不仅仅是CPU。
hotpaw2 2012年

1
@PéterTörök我明白你的意思了。他没有像我们那样详细介绍虚拟机。但是我认为他的回答仍然可以简短地回答OP的问题。JVM可以“运行”其他编程语言,因为它可以“运行”任何编程语言,因为它是图灵完整的。也许不详尽,但仍然是一个简洁有效的观点。:)
Yam Marcovic 2012年

2

片刻,您可以将JVM视为具有自己的指令集(例如x86)的处理器。处理器可以执行已编译为机器语言的C语言代码。如果对JVM应用相同的类比,则其他语言可以在JVM上执行,就像在其他处理器上一样,只要这些语言被编译成JVM的机器指令即可。JVM然后可以针对语言X运行这些指令。


您的比喻是一个很好的比喻
科比(Cobi)2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.