首页 > 解决方案 > 编译JVM

问题描述

是否可以将 JVM 编译为某些特定的 ISA?

我试图理解 JVM 的提议。我现在的一切,就是一个在任何 ISA 上模拟 ISA 的虚拟机,因此,它只是在 SO 上运行的另一个软件。但是所有的软件都必须编译到目标ISA,才能实现正确的指令。

那么,JVM 是否会为每个新的 ISA 重新编译?或者它有特定的方法来做到这一点并保持可移植性?

标签: javajvm

解决方案


JVM 不止一个,因此,关于“那个”JVM 的问题没有简单的答案。

原则上,可以用可移植的编程语言实现 JVM,该语言具有仅用于执行字节码的简单解释器。在这种情况下,将有可能支持用于实现 JVM 的语言所支持的所有体系结构。如果该语言需要为特定架构编译源代码(这对于通常用于此类任务的语言来说是正确的),那么必须为每个支持的 ISA 重新编译 JVM。通常,您还需要为每个支持的操作系统重新编译它,即使是相同的 ISA。

但在实践中,JVM 具有即时编译为本机代码的特性,以及需要与底层架构交互的特性,超出了用于实现的编程语言的标准特性(如 C 或 C++)。因此,要支持新的架构,仅仅重新编译JVM源代码是不够的,还需要为新的ISA实现新的JIT编译器,并提供一些低级组件的专门实现。这适用于广泛使用的 HotSpot JVM,它是您可以从Oracle 网站下载的 JDK 和 JRE 的一部分。您可能会注意到,您必须为您的系统选择正确的版本(如果支持)。

另一种可能的策略是在 Java 本身中实现 ​​JVM。为了能够在特定平台上运行它,至少它的某些部分必须提前编译为本机代码,这需要合适的 AOT 编译器。如果特定项目无论如何都具有对本机代码的编译(作为 JIT 编译器的一部分),那么利用它来实现 AOT 编译器并不是太牵强。这样的项目将独立于另一种语言的平台支持,但当然,它仍然需要实现和维护特定的代码来支持特定的架构。这适用于 Substrate JVM,它是GraalVM 项目的一部分。


推荐阅读