21.0.0.2

(2021-02-11)

这是 GraalVM 21.0.x 分支的错误修复版本。它包含对 GraalVM Updater 的操作性更改——这是一个用于安装可选 GraalVM 语言运行时和实用工具,以及更新您本地 GraalVM 安装的工具。

  • 增强了升级策略,以防止从 GraalVM Community 迁移到 GraalVM Enterprise Edition (gu upgrade --edition ee) 时组件未被升级。
  • 改进了 gu 处理许可证接受的方式,当用户被提示接受“Oracle GraalVM Enterprise Edition Native Image 许可证”时。

21.0.0

(2021-01-19)

Java

更新了 GraalVM 构建所基于的底层 JDK

  • GraalVM 社区版基于 OpenJDK 1.8.0_282 版和 OpenJDK 11.0.10 版。
  • Oracle GraalVM 企业版基于 Oracle JDK 1.8.0_281 版和 Oracle JDK 11.0.10 版。您可以在 Oracle Java SE 下载 中找到这些版本的 Oracle JDK 发布说明。

Truffle 上的 Java

  • 添加了一个基于 Truffle 解释器的实验性 Java 虚拟机实现。在此处了解更多信息

容器镜像

用于 Docker 容器的 GraalVM Community 镜像已更改位置,现在可从 GitHub 容器注册表 获取。请参阅该指南

平台支持

从该版本开始,我们提供适用于 AArch64 系统上 Linux 的 GraalVM 分发版。所有组件,包括 GraalVM 核心,都是实验性的。GraalVM 企业版基于适用于 AArch64 的 Oracle JDK11,而 GraalVM 社区版则相应地基于适用于 AArch64 架构的 OpenJDK 11。

Native Image

  • 添加了用于本地镜像的序列化支持。序列化支持确保类的构造函数包含在本地镜像中,以便它们可以首先被反序列化。这些类应在额外的特定配置文件中列入白名单,类似于反射支持,因为某些类无法被反序列化,包括可能是本地镜像一部分但未在配置文件中列出的类。您可以手动创建配置文件或应用 GraalVM 提供的跟踪代理来帮助编写配置文件。
  • 添加了本地镜像的方法句柄调用支持(请参阅 #2761)。通过方法句柄访问的方法和字段必须在 Reflection 配置文件中注册。还在跟踪代理中添加了方法句柄支持,以自动生成本地镜像构建的配置。大多数方法句柄用例都受支持。未存储在静态字段中的 VarHandles 仍然不受支持。
  • 添加了对 Linux 平台的 AWT 和 Swing 支持(需要使用跟踪代理进行配置收集)。
  • 添加了实验性选项 -H:+InlineBeforeAnalysis,以减少所需的配置条目数量并减小镜像大小。
  • 改进了跟踪代理:它现在捕获 Class.getClassesClass.getDeclaredClasses 的实例。
  • 改进了 ServiceLoaderFeature 类,以扫描使用模块声明的服务。
  • 禁止在本地镜像堆中使用 Random 实例。
  • 改进了 GC 性能(GC 耗时更少)。

使用 Truffle API 的语言和工具实现者的更新

  • 修复了许多与多层编译相关的问题。多层编译(--engine.MultiTier)将在 21.1 版本中默认启用。
  • 添加了 HostCompilerDirectives,用于指导 Truffle 解释器主机编译的指令
  • HostCompilerDirectives.BytecodeInterpreterSwitch 用于指示在字节码解释器中包含指令分派开关的方法
  • HostCompilerDirectives.BytecodeInterpreterSwitchBoundary 用于指示无需内联到字节码解释器开关中的方法
  • Truffle DSL 生成的节点不再受 64 位状态的限制。请负责任地使用这些状态位。
  • 更多更改已列在变更日志中。

Polyglot 嵌入器更新

  • 添加了对显式选择主机方法重载的支持,使用以逗号分隔的完全限定参数类型名称并用括号括起来的签名形式(例如,methodName(f.q.TypeName,java.lang.String,int,int[]))。
  • 弃用了通过 JNI 混淆签名选择主机方法的方式,取而代之的是上述新形式。计划在 21.2 版本中移除。

JavaScript

  • 将 Node.js 更新到 12.20.1 版本。
  • 默认启用了以下 ECMAScript 2021 模式/功能
    • 类字段
    • Promise.any
    • String.prototype.replaceAll
    • 逻辑赋值运算符
  • 采用了新的互操作异常处理,并使 JS 异常继承 AbstractTruffleException 类。
  • 暴露了 Graal.versionECMAScript 而非 Graal.versionJS
  • 实现了相对索引方法提案。它在 ECMAScript 2022 模式(--js.ecmascript-version=2022)下可用。

Python

  • 添加了 jarray 模块,以兼容 Jython。
  • 改进了对 Pandas 的支持,并添加了对 Matplotlib 可视化库的初步支持。
  • 提供了修复程序,以避免在共享引擎中运行 NumPy 时可能出现的内存泄漏和崩溃。
  • 修复了在 REPL 中粘贴代码片段时出现的无限延续提示问题。

更多详细信息可在变更日志中找到。

Ruby

  • 新的 IRB 在复制/粘贴代码时速度很慢。这是由于低效的 io/console 实现造成的,该问题将在下一个版本中解决。一个临时解决方案是使用 irb --readline,这会禁用一些 IRB 功能,但对于复制/粘贴代码来说速度快得多。

新功能

  • 更新到 Ruby 2.7.2。大多数 Ruby 2.7 功能和更改都已实现(请参阅 #2004)。

错误修复

  • 修复了枚举器和可枚举对象中特殊变量的设置问题(问题 #1484)。
  • 修复了 Method#to_proc 和特殊变量存储的问题(问题 #2156)。

兼容性

  • **kwargs 现在接受非 Symbol 键,与 Ruby 2.7 一致。

性能

  • 重构并实现了更高性能的 MatchData#length(请参阅 #2147)。
  • 重构并实现了更高性能的 Array#sample(请参阅 #2148)。
  • String#inspect 现在效率更高。

更改

  • 所有 InteropLibrary 消息现在都一致地作为 Truffle::Interop 上的方法暴露(请参阅 #2139)。一些方法已重命名,以匹配文档中描述的方案。
  • 更多详细信息可从变更日志中获取。

R

  • 修复了尝试安装 R validate 包时出现的 AssertionError(问题 #169)。

LLVM 运行时

  • 改进了 AST 共享,并支持辅助引擎缓存。除了允许在单个引擎中多个上下文之间共享代码的常规 AST 共享之外,这还允许跨进程边界持久化共享代码。
  • 添加了对 macOS 当前主要版本(macOS Big Sur)的支持。

弃用

  • 添加了对旧头文件位置 polyglot.hllvm/api/toolchain.h 的弃用警告。这些头文件已在 20.3.0 中弃用,但当时没有警告。

GraalWasm

  • 此版本包含语义、链接和模块内验证方面的多项错误修复。GraalVM 的 WebAssembly 解释器现在通过了官方规范测试套件中的几乎所有测试。
  • 暴露了 JS-to-WebAssembly 接口 API 所需的 Polyglot 绑定。
  • 优化了 GraalWasm 解释器,从而使解释执行模式实现了预热和整体 20 倍的峰值性能提升。
  • 通过使用基于字节缓冲的内存而非堆外内存,提高了安全性。

工具

GraalVM 更新器

从 21.0 版本开始,GraalVM Updater 变得更加强大,可用于将您的本地 GraalVM 安装更新到更高版本,或从 Community 版升级到 Enterprise Edition 版。在升级 GraalVM 中阅读更多信息。

Visual Studio Code 扩展

GraalVM 仪表板

  • 改进了 BGV 格式,以支持大量整数属性。

VisualVM

  • 实现了从先前安装的 VisualVM 无缝导入设置。

联系我们