GraalVM 21.0:引入了运行Java的新方法

2021-01-20 13:07:39

在最近的寒假期间,此发行版的开发时间很短,但仍为整个GraalVM生态系统提供了许多改进和令人兴奋的新功能。

与每个版本一样,我们非常感谢出色的GraalVM社区对问题的所有反馈,协作和讨论,发送拉取请求,最后但并非最不重要的是,宣传了有关GraalVM项目及其对项目的帮助。在一起,我们使GraalVM变得非凡!

在本文中,我们想谈一谈GraalVM 21.0中一些最值得注意的更改。 GraalVM有很多组件,每个发行版都对其进行了改进和修复。因此,有关更改的详细列表,请考虑网站上的发行说明或各个组件的更改日志。

与往常一样,该发行版增加了用于GraalVM构建的JDK版本。 21.0中的GraalVM社区版基于OpenJDK 1.8.0_282版和OpenJDK 11.0.10版,以及Oracle JDK 1.8.0_281版和Oracle JDK 11.0.10版上的GraalVM Enterprise。

GraalVM 21.0中最令人兴奋的功能是在Truffle上实现Java的新组件。 Truffle上的Java是JVM,由Truffle框架实现。

松露上的Java当前被标记为实验性的。但是,即使在此初始发行状态下,它也提供了非常有趣的功能,并使Java(和其他JVM语言)可以在支持所有其他GraalVM语言的基础架构中运行。

使用gu install espresso安装它,并通过使用java -truffle运行您最喜欢的Java应用程序来尝试一下。

在此相邻的文章中阅读有关Truffle的更多信息,提供更多详细信息,动机和用例,以帮助您立即尝试使用Truffle上的Java。

现在可能发生的事情之一是在本机映像二进制文件中使用Java序列化。就像其他动态功能一样,需要配置序列化用法,并且在构建期间需要知道可以序列化/反序列化的类。可以使用javaagent的辅助配置来生成该配置,因此您不必从头开始创建它。

它会序列化,反序列化并打印斐波那契数。您可以使用javaagent编译并运行它:

现在在config目录中,我们可以看到JSON文件,其中显示了要进行序列化的类:

剩下的所有用于构建本机映像的操作只是运行以下命令:native-image -cp。:config Main。瞧,运行结果时,斐波那契数字的列表将被序列化/反序列化。

除了这一非常重要的更改之外,此更改比以前更容易为更多Java程序带来本机映像功能,此外21.0还改进了方法句柄调用支持。方法句柄的大多数用例现在应该可以工作。它们确实需要配置,但是跟踪代理也可以为您提供配置。

说到配置代理所提供的配置,您可以在Linux上构建AWT和Swing应用程序的本机映像(实验性的)。目前尚不支持其他平台,但这是第一步。

Truffle为指令添加了HostCompilerDirectives注释,这些指令指导Truffle解释器的主机编译中的优化:

HostCompilerDirectives.BytecodeInterpreterSwitchBoundary表示不需要内联到字节码解释器开关中的方法。

兼容性始终是第一要务,默认情况下,此版本启用以下ECMAScript 2021模式/功能:

甚至,如果您要通过--js.ecmascript-version = 2022选项启用的ECMAScript 2022模式下运行JavaScript引擎,您甚至可以实现相关索引方法建议的实现。

在GraalVM 21.0中,Ruby实现现在的目标是与Ruby 2.7.2兼容。大多数Ruby 2.7功能和更改都已实现(有关详细信息,请参见GitHub问题)。

除此之外,在此发行版的短时间内,它就进行了一些性能改进,特别是MatchData#length,Array#sample,String#inspect等方法现在更加高效。

Truffle :: Interop下的一些interop方法已重命名,以更好地匹配InteropLibrary(#2139)的命名。

请注意,新的IRB版本在将代码复制/粘贴到其中时非常慢。这是由于io / console实施效率低下,将在下一版本中解决。一种解决方法是使用irb --readline,它禁用了一些IRB功能,但是对于复制/粘贴代码要快得多。

该团队将继续致力于与Python本机库和Jython实现的兼容性。

例如,在21.0中添加了jarray模块以与Jython兼容。它还提供一些修复程序,以避免在某些设置中运行NumPy时可能出现的内存泄漏和崩溃,并改善了对Pandas的支持。

有关性能更新和其他修补程序的更多详细信息,请查看存储库中的更改日志。

预热是LLVM位代码运行时实现的主要改进领域之一。在21.0中,我们不仅改进了AST共享-在单个引擎中的多个上下文之间共享程序的内部表示,还引入了对辅助引擎缓存的支持。除了AST共享提供的功能之外,辅助引擎缓存还允许跨进程边界持久存储共享代码。

Webassembly解释器有时会躲在雷达下,但是总会进行积极的工作以使其更好,更快和更安全。在21.0中,我们优化了Graalwasm解释器,使预热更好,解释WebAssembly的总体峰值性能提高了20倍。现在,我们还通过了大多数官方的WebAssembly规范套件,并且我们正在修复几个剩余的小案例。

从GraalVM 21.0开始,gu实用程序变得更加强大,可用于将本地GraalVM安装更新到较新版本,或从社区升级到企业版。请参阅文档以获取更多详细信息。

另外,作为GraalVM 21.0版本的一部分,我们很高兴宣布用于Visual Studio Code的GraalVM扩展包。 在技术预览版中,它已经提供了许多功能,可以在VS Code环境中提高Java 8 +,JavaScript,Python,Ruby,R和Micronaut的生产率。 该扩展包可立即在Visual Studio Code Marketplace上使用,并准备从VS Code直接安装-只需在Extensions:Marketplace视图中键入GraalVM,选择GraalVM Extension Pack并单击Install按钮。 安装时,您可以在另一篇文章中阅读有关VS Code扩展的更多详细信息。