java - 编译JVM
问题描述
是否可以将 JVM 编译为某些特定的 ISA?
我试图理解 JVM 的提议。我现在的一切,就是一个在任何 ISA 上模拟 ISA 的虚拟机,因此,它只是在 SO 上运行的另一个软件。但是所有的软件都必须编译到目标ISA,才能实现正确的指令。
那么,JVM 是否会为每个新的 ISA 重新编译?或者它有特定的方法来做到这一点并保持可移植性?
解决方案
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 项目的一部分。
推荐阅读
- spring-boot - 在 cookie spring boot 安全中发送访问令牌
- google-cloud-platform - 如何访问连接块中计数的 google_compute_instance 的 NAT IP?
- flutter - 如何在flutter中从cupertinoPicker返回值
- android-studio - 如何防止 android studio 将文件放入 SVN 更改列表?
- c# - 在通用存储库使用者类中创建通用方法
- deep-learning - 使用可训练的权重组合两个相同维度的张量以获得最终输出张量
- node.js - MongoDB:在路径中找不到标识符“elem”的数组过滤器
- microsoft-graph-api - 使用 Microsoft Graph API 加入 Skype 或 Teams 会议?
- python-3.x - 消息没有被刷新到 kafka
- git - 如果我有一个包含许多文件的大文件夹,如何创建不同的 github 存储库