GraalVM 发布候选版本

1.0-RC16

(2019-04-23)

Java

我们解决了若干基准测试性能较慢的问题,这些问题在使用作为原生库构建的 GraalVM 编译器(也称为 libgraal,这是上一个发布候选版本中选择的默认模式)运行时出现。我们修复了导致应用程序执行结束时虚拟机进程关闭延迟的问题(请参阅 #1140)。

Native Image

我们改进了 org.graalvm.nativeimage API 的结构:现在,只能在镜像生成期间使用的类位于 org.graalvm.nativeimage.hosted 包中,以便将其与可在镜像运行时使用的类明确分开。为了保持向后兼容性,原始类仍然存在,但已被标记为弃用。它们将在下一个发布候选版本中删除,因此请更新到新的类。

我们修复了 GitHub 上报告的几个错误,其中包括一个日志框架问题,该问题表现为镜像堆中不允许存在 java.util.logging.SimpleFormatter 实例的错误。

因此,原生镜像现在可以与 Helidon 正确配合使用。Helidon 是一个专为编写微服务而设计的 Java 框架,最近宣布支持 GraalVM 原生镜像:Helidon 在 GraalVM 下运行更快

Ruby

Ruby 组件的完整更新日志可在 GitHub 上查阅。主要亮点包括

  • FloatRationalBigDecimal 类的舍入模式已实现或改进(请参阅 #1509)。
  • 添加了纯 Ruby 实现的外部函数接口 (FFI),该接口通过了几乎所有 Ruby FFI 规范(请参阅 #1529)。
  • ENV#fetchHash#fetch 引发的 KeyError 现在与 MRI 的消息格式匹配(请参阅 #1633)。

JavaScript

JavaScript 组件的完整更新日志可在 GitHub 上查阅。主要亮点包括

R

R 组件的完整更新日志可在 GitHub 上查阅。主要亮点包括

  • 从 1.0-RC16 开始,lexer 允许解析标识符中的任何字母,包括例如日语,这与 GNU-R 的行为匹配。

Python

  • 改进了 graalpython 原生启动器的启动时间。

LLVM 运行时

  • lli 启动器现在以 C 区域设置启动。

1.0-RC15

(2019-04-05)

Java

默认情况下,运行 java 启动器或语言启动器使用 --jvm 模式时,现在会使用 libgraallibgraal 库是 GraalVM 编译器经 native-image 预编译的版本。除了缩短启动时间外,libgraal 完全避免了 GraalVM 编译器干扰应用程序代码的堆使用和剖析。它具有与其他原生 HotSpot 编译器(如 C1 和 C2)相似的执行特性。

JavaScript

  • 根据 Context.Builder.allowPolyglotAccess() 启用了 Polyglot 内置功能。
  • 添加了对外部对象的 rest 和 spread 属性支持。例如,现在支持以下 spread 语法
    var arr1 = [0, 1, 2];
    var arr2 = [3, 4, 5];
    arr1 = [...arr1, ...arr2]; // arr1 is now [0, 1, 2, 3, 4, 5]
    

要查看完整的更改列表,请参阅项目更新日志

R

新功能
  • 为 URL 连接实现了 gzcon 内置功能。
更改
  • Truffle 互操作性 API 会将 double 值转换为 int 值,如果它们在整数范围内。
错误修复
  • R 在未通过 --jvm 启动时错误地允许了 Java 互操作性。从 1.0-RC15 开始,再次需要 --jvm 标志才能启用与 Java 的互操作性。

完整的项目更新日志可在 GitHub 上查阅。

Ruby

GitHub 上提供了详细的更改列表。以下是一些最值得注意的更改的简短列表

更改
  • 我们实验性的 JRuby 兼容 Java 互操作性已移除 – 请改用 PolyglotJava
  • Process.clock_getres 已实现。
  • 已移除 debugprofileprofiler,它们之前已被标记为不受支持。
错误修复
  • autoload :C, "path"; require "path" 现在可以正确触发自动加载。
  • shell 标准库现在可以通过 require 加载。
兼容性
  • 改进了与 MRI 的 Float#to_s 格式化的兼容性 #1626
  • 增加了对 Dir.{[], glob} 的 base 关键字参数的支持。

Python

更改
  • 已迁移到新的 Truffle 库以支持互操作性。
  • 增加了使用普通 Python 导入语法从 java 命名空间导入 Java 类的支持,例如 from java.util import ArrayList
  • 实现了 PEP 487 和 PEP 560,以使 typing 模块正常工作。

更多详细信息可在 GitHub 上的项目更新日志中找到。

LLVM 解释器

  • 增加了对 LLVM 8 生成的比特代码的初步支持。

Native Image

根据反馈和错误报告,我们改进了跟踪 JavaHotSpot VM 上反射和 JNI 使用情况的代理。我们还将代理的实现语言从 C 更改为 Java。现在代理本身就是一个原生镜像。

native-image-maven-plugin 现在支持多行 buildArgs 和布尔参数 skip(如果为 true 则跳过镜像构建)。

GraalVM 集成商的 API 更改 (SDK + Truffle)

此版本的 GraalVM 对 Truffle 互操作性 API 进行了重大修订。大多数现有的 Truffle 互操作性 API 已被弃用。兼容层可能会导致互操作性调用的性能显著下降。有关概述和个别 @deprecated javadoc 标签的指导,请参阅互操作性迁移指南

我们添加了 Truffle Library API,它允许语言实现对接收者类型使用多态分派,并支持特定于实现的缓存/分析以及对非缓存分派的支持。更多详细信息请参阅Truffle Library 教程

GraalVM SDK Polyglot API 也引入了许多更改

  • Graal SDK 重命名为 GraalVM SDK
  • 实验性选项现在需要在命令行上将 --experimental-options 传递给 GraalVM 语言启动器,或者在其他场景中设置 Context.Builder#allowExperimentalOptionsEngine.Builder#allowExperimentalOptions。例如,要使用 --memtracer 性能分析工具诊断 JavaScript 应用程序的内存分配,您应该在前面加上 --experimental-options 选项:js --experimental-options --memtracer program.js
  • 增加了在 Source 构建器中设置编码的可能性。
  • 使用新的 HostAccess API 增加了目标类型映射的新 API。

我们已将 GraalVM 版本之间所有 Truffle 和 SDK 的更改总结在单独的更新日志中

工具

Chrome 检查器

  • 为 GraalVM 的 JavaScript 实现添加了对象预览功能。
  • 为 GraalVM 支持的所有语言实现了自定义预览实验性功能。

理想图可视化工具 (IGV)

从 GraalVM 的 1.0-RC15 版本开始,理想图可视化工具将作为独立下载项从 Oracle 技术网络下载页面提供。它不属于 GraalVM 社区版或企业版。

1.0-RC14

(2019-03-18)

引入 --vm.<option>

我们引入了统一的 --vm.<option>,它允许以统一的方式传递选项,而无需知道将使用哪种 VM 模式(--jvm--native)。它替代了 --jvm.<option>--native.<option> 命令行选项,例如,配置堆最大内存量的选项 --jvm.Xmx=5G 变为 --vm.Xmx=5G。这适用于所有语言。

Java

libgraal

这是第一个包含预构建的 libgraal 共享库的版本。此共享库由 native-image 生成,包含 GraalVM 编译器的预编译版本。除了改进启动性能外,libgraal 完全避免了干扰应用程序代码的堆使用和性能分析。也就是说,它具有与其他原生 HotSpot 编译器(如 C1 和 C2)相似的执行特性。要试用它,请将 -XX:+UseJVMCINativeLibrary 添加到您的 java 命令行。请注意,这仍在开发中,我们正致力于提高其稳定性并确保它不影响峰值性能。

默认失败行为

编译期间出现故障(即未捕获的异常)的默认行为已更改。现在这些故障会被静默忽略,并且不会向控制台打印任何内容。要恢复向控制台打印消息并收集故障诊断信息的旧行为,您现在需要指定 -Dgraal.CompilationFailureAction=Diagnose 选项。

原生镜像

新功能

我们为 Java HotSpot VM 引入了一个跟踪代理,该代理记录反射和 JNI 的使用情况,然后可以将其转换为原生镜像生成器的配置文件。这简化了使新应用程序作为原生镜像运行的过程。有关详细信息,请参阅文档

我们改进了对 java.util.logging API 的支持。有关详细信息,请参阅 GitHub 文档

现在支持 javax.script.ScriptEngine API。请注意,Nashorn JavaScript 引擎无法在原生镜像中运行,因此始终被排除。但是,当原生镜像使用 --language:js 选项构建时,基于 Truffle 的语言实现(如 GraalVM JavaScript 引擎)是可用的。

为原生镜像实现了 Class.getSimpleName 方法(请参阅 1020)。

错误修复
  • 修复了在访问用于反射的类上的注解元数据时,原生镜像生成过程中出现的 NPE(空指针异常)问题(请参阅 1048)。

  • 修复了 createTempFile() 提供非默认文件系统并失败的问题(请参阅 1035)。

  • 修复了因套接字地址长度值不正确导致的段错误(请参阅 1025)。

JavaScript

类似 HTML 的注释

我们增加了对类似 HTML 注释的支持。

var s = "Introducing html-like comments";
alert(s);
<!-- this is a comment -->
更改
  • 将选项 js.experimental-array-prototype 重命名为 js.experimental-foreign-object-prototype

更多详细信息可在 GitHub 上的项目更新日志中找到。

R

此版本中 GraalVM 的 R 实现带来了多项错误修复和改进。

错误传播

根据 R 的语义,错误在被引发的地方会立即处理。然而,在语言嵌入或多语言场景中,让错误传播出 R 作用域以便正确处理更为有用。我们为此改变了 FastR 的行为,现在 R 错误会进行传播。请注意,这仅在不导致 R 代码中出现意外副作用的情况下发生,即堆栈中没有 options(error = ...)on.exit(...) 处理程序时。

实验性选项

除了 --R.PrintErrorStacktracesToFile(此选项用于将 FastR 内部错误记录到文件,以便进行错误报告)外,所有特定选项(不包括与 GNU-R 兼容的选项,如 --save)均为实验性。实验性选项可以使用 --experimental-options 或通过 ContextBuilder#allowExperimentalOptions 解锁。

要查看完整的更改列表,请参阅项目更新日志

Ruby

此版本的 GraalVM 为 Ruby 实现提供了新的方法实现和其他更新。

新功能
  • 实现了 Dir.childrenDir#childrenString#delete_prefix#delete_suffix 及相关方法。
更改
  • -Xlog= 已被移除。请改用 --log.level=
  • -J 标志已被移除。请改用 --vm.*
  • -J-cp lib.jar 及类似选项已被移除。您应该改用 --vm.cp=lib.jar--vm.classpath=lib.jar
  • -X 选项现在与 MRI 中的功能相同。

GitHub 上提供了详细的更改列表。

Python

Python 3.7.0

标准库已从 Python 3.6.5 更新到 3.7.0。

更改
  • graalpython 启动器选项的子集定义为“稳定”选项。所有其他选项都可能发生变化,需要通过命令行显式解锁。
  • 增加了对 -I 标志的支持,以忽略用户环境且不将工作目录添加到 sys.path

更多详细信息可在 GitHub 上的项目更新日志中找到。

LLVM 运行时

  • 多项错误修复。

GraalVM 集成商的 API 更改 (SDK + Truffle)

新功能
  • 增加了 Context.Builder#allowExperimentalOptions,用于控制是否允许将实验性选项传递给 Context。
  • 增加了 Engine.Builder#allowExperimentalOptions,用于控制是否允许传递实验性工具和引擎选项。
  • @Option 注解现在可以指定选项的稳定性。
  • 为工具添加了引擎绑定的 TruffleLogger。引擎绑定的日志记录器可以由在没有任何上下文的情况下执行的线程使用。
更改
  • 从 Truffle 语言实现框架中移除了多个已弃用的元素,例如 TruffleException.isTimeoutEventBinding.getFilter 等。

我们已将 GraalVM 版本之间 GraalVM Truffle 和 GraalVM SDK 的更改总结在单独的更新日志中

1.0-RC13

(2019-03-05)

工具

理想图可视化工具

随着 GraalVM 1.0-RC13 版本的发布,理想图可视化工具发生了重大变化。Dgraal.Dump 选项的默认行为已更改,现在 IGV 转储默认写入本地文件系统。要获取直接转储到监听 127.0.0.1:4445 的 IGV 实例的旧行为,您需要添加 -Dgraal.PrintGraph=Network 选项。如果无法打开网络连接,则转储将回退到文件系统转储。

Graal VisualVM

另一个开发工具 Graal VisualVM 现在允许对原生镜像进程进行堆监控。此功能适用于 Oracle GraalVM。

R

  • R 专用命令行选项现在以 –R.PrintErrorStackTracesToFile=true 传递,而不是使用 JVM 属性(–jvm.R:+PrintErrorStackTracesToFile)。您可以使用 --help:languages 查看可用选项。
  • 可选的安装后脚本 configure_fastr 也会根据目标系统重新生成 etc/Renvironetc/ldpaths 文件。
  • R 向量不能从其他语言写入,因为这会违反 R 语言的语义。

GraalVM R 实现的更改列表可在 GitHub 上查阅。

JavaScript

  • Node.js 已从 10.15.0 更新到 10.15.2 版本。
  • 使 JavaScript 和 Java 互操作性在原生镜像中可用。请注意,您必须在原生镜像构建时配置可访问的类和方法。
  • 现在应该使用 Node.js 的 Worker 类,而不是已弃用的实验性 Java.Worker API。
  • 已移除已弃用的 NashornJavaInterop 模式。

更多详细信息可在 GitHub 上的项目更新日志中找到。

LLVM 运行时

  • 增加了对 Mach-O 文件中嵌入式比特代码的支持。我们支持 Mach-O 目标文件 __bitcode 部分中的比特代码,以及可执行文件或 dylibs__bundle 部分中嵌入式 xar 存档中的比特代码文件。例如,在 OS X 上,您可以使用 clang -fembed-bitcode -flto hello.c -o hello 编译您的代码,创建一个包含嵌入式比特代码的原生可执行文件。然后您可以原生运行它(./hello)或使用 GraalVM 运行它($JAVA_HOME/bin/lli ./hello)。

完整的项目更新日志可在 GitHub 上查阅。

Ruby

此版本的 GraalVM 在 Ruby 实现方面包含了丰富的性能和兼容性改进、多项更改和错误修复。

Github 上提供了所有更新的详细列表。以下是一些最值得注意的更新的简短列表

新功能

  • 与 Java 的主机互操作性现在也在 SubstrateVM 上工作。

更改

  • -Xoptions 已被弃用并将被移除。请改用 --help:languages
  • -Xlog= 已被弃用并将被移除。请改用 --log.level=
  • -J 已被弃用并将被移除。请改用 --jvm.
  • -J-cp lib.jar 等已被弃用并将被移除。请改用 --jvm.cp=lib.jar--jvm.classpath=lib.jar
  • -J-cmd--jvm.cmdJAVA_HOMEJAVACMDJAVA_OPTS 在 TruffleRuby 的任何已发布配置中均不起作用,因此已被移除。
  • -Xoption=value 已被弃用并将被移除。请改用 --option=value
  • TracePoint.traceTracePoint#inspect 已实现。

兼容性

  • 改进了未找到 -S 文件时的异常处理。
  • 移除了由裸 raise 引发的异常中的消息,以更好地匹配 MRI #1487
  • TracePoint 现在处理 :class 事件。

请注意,GraalVM 1.0-RC13 的 Ruby 实现基于 Ruby 2.4.4,并且仍然容易受到 CVE-2018-16395 的攻击。这将在下个版本中修复。

Python

新功能

  • 允许在 venv 中安装 NumPy。只需运行例如 bin/graalpython -m venv numpy_env; source numpy_env/bin/activate; graalpython -m ginstall install numpy。请注意,目前并非所有 NumPy 功能都可用。

要查看完整的更改列表,请参阅项目更新日志

GraalVM 集成商的 API 更改 (SDK + Truffle)

  • 增加了 Debugger.getSessionCount() 以返回活动调试会话的数量。
  • TruffleLanguage 类现在可以注册额外的服务。此更改也弃用了将语言类自动注册为服务的功能。
  • 为了清晰起见,OptionCategory.DEBUG 已重命名为 OptionCategory.INTERNAL
  • 为类对象添加了 static 成员,提供对类静态成员的访问。
  • 增加了 OptionStability 用于指定选项的稳定性。

GraalVM 版本之间所有 GraalVM SDK 和 Truffle 的更改已在项目更新日志中汇总

1.0-RC12

(2019-02-04)

原生镜像生成

原生镜像现在会在每次方法调用时检查剩余可用堆栈大小,并在堆栈溢出时抛出 StackOverflowError

我们继续支持不完整类路径的工作。没有大的更改,只是根据用户反馈进行了一些小错误修复。现在对不完整类路径的支持允许原生镜像生成器在字节码验证下运行,即在运行原生镜像生成器时不再将 --no-verify 选项传递给 Java HotSpot VM。

R

GraalVM R 实现的详细更改列表可在 GitHub 上查阅。以下是一些最值得注意的更改的简短列表

  • FastR 现在使用 R 的基本函数 print 来实现 TruffleLanguage#toString,以便工具和调试器(如 Chrome Dev Tools 控制台)以熟悉且类似 R 的方式格式化值(例如 data.frame 对象)。
  • GraalVM R 实现为通过 parse(...,keep.source=T) 解析的表达式提供了与 GNU-R 兼容的 parseData,这使得使用此功能的包(如 lambda.rplumber)能够正常工作。
  • 添加了 ALTREP 框架的虚拟实现以避免链接问题。

JavaScript

  • Node.js 已从 10.9.0 更新到 10.15.0 版本。
  • 添加了一个新选项 js.experimental-array-prototype,用于将类数组的非 JS 对象(如 ProxyArray 或 Java List)的原型设置为 Array.prototype。这使得可以直接在这些对象上使用 mapforEach 等函数。

更多详细信息可在 GitHub 上的项目更新日志中找到。

LLVM 运行时

  • 为了简化 LLVM 运行时中的多语言 API,我们弃用了 truffle_* 内置函数。我们还破坏了与 1.0.0-RC2(或更早版本)使用 polyglot.h 编译的比特代码的二进制兼容性。
  • 只读全局变量现在放置在只读内存中。这是必要的,以适应 macOS Mojave 的 libc 中的一些更改,当格式字符串放置在可写内存中时,这些更改会引发错误。

项目更新日志可在 GitHub 上查阅。

Ruby

此版本带来了兼容性改进

  • 更改为处理 C 扩展中 Ruby 对象的新系统,这大大提高了与 MRI 的兼容性。
  • 实现了对 BigDecimal#to_r 的支持(请参阅 #1521)。

完整的项目更新日志可在 GitHub 上查阅。

Python

要查看完整的更改列表,请参阅项目更新日志

  • 增加了对类作用域中 __class__ 变量的支持。
  • 启动了对 venv 标准库工具、内置 _bz2 模块和 pandas 包的初步支持。

GraalVM 集成商的 API 更改 (SDK + Truffle)

GraalVM 版本之间所有 GraalVM SDK 和 Truffle 的更改已在项目更新日志中汇总

工具

Graal VisualVM

  • 增加了直接从 Graal VisualVM 界面创建原生镜像堆转储的功能。
  • 改进了原生镜像中的堆转储支持。

1.0-RC11

(2019-01-14)

原生镜像生成

我们改进了对不完整类路径的处理,即引用了类路径中未提供的类的代码。我们在 RC10 中采取的方法在某些难以修复的极端情况下导致了问题,因此我们采用了不同的方法。感谢所有尝试我们最初方法并在 GitHub 上报告问题的人。我们已尝试验证所有报告的问题都已通过新方法解决。

JavaScript

  • Graal.js 仅支持 ECMAScript 5 (ES5) 及更高版本,并强制执行该规则。
  • 增加了使用实验性 Node.js Worker Threads API 共享 Java 对象的支持。
  • 增加了对 ScriptEngine GLOBAL_SCOPE 绑定的支持。
  • 增加了启用/禁用某些扩展功能的选项,例如 print()load()
  • 增加了禁用出于安全原因的功能的选项,例如 eval()

更多详细信息可在 GitHub 上的项目更新日志中找到。

LLVM 运行时

如果比特代码是使用调试信息编译的,GraalVM 现在会在堆栈跟踪中报告 LLVM 函数的源文件名和行号,即使原始源代码不可用。

完整的更新日志可在 GitHub 上查阅。

Ruby

完整的项目更新日志可在 GitHub 上查阅。以下是一些最值得注意的更改的简短列表

  • 允许信号 0Process.kill 一起使用(请参阅 #1474)。
  • 实现了 Dir.each_child
  • 增加了对 execspawn 中缺少 close_others 选项的支持。
  • 实现了缺少的 MatchData#named_captures 方法(请参阅 #1512)。
  • Process::CLOCK_ 常量已被赋予与标准 Ruby 相同的值。
  • 所有核心文件现在都使用冻结的 String 字面量,从而减少了核心方法的 String 分配数量。

Python

更新日志可在 GitHub 上查阅。

  • 增加了 ginstall 自定义模块,可使用 graalpython -m ginstall 安装 NumPy 和 setup tools 等已知包。
  • 增加了对 yield from 语法的支持。
  • time 模块添加了更多内置方法。
  • 增加了对标准 zipfile 模块的支持。
  • 增加了内置的 _cvs 模块。
  • 多项错误修复和性能改进。
  • 移除了通过 polyglot.eval 暴露内部语言的功能。

R

  • R 版本已升级到 R-3.5.1。
  • R 不会打印或记录内部错误的任何详细信息,除非它使用 --jvm.DR:+PrintErrorStacktracesToFile 运行。
  • 新实现的 R 原生 API 函数:Rf_duplicatedRf_setVarnorm_randexp_rand
  • 多项错误修复。

更多详细信息可在 GitHub 上的项目更新日志中找到。

GraalVM 集成商的 API 更改 (SDK + Truffle)

有关 API 更改列表,请参阅项目更新日志

工具

Graal VisualVM

  • 增加了对原生镜像进程的 CPU 监控。
  • 改进了文本视图(线程转储、OQL 控制台结果等)中的搜索功能。
  • 堆查看器现在显示 JVM 参数,并改进了性能和内存管理。

1.0-RC10

(2018-12-05)

所有 GraalVM 组件的错误修复和性能改进。

原生镜像生成

GraalVM 1.0-rc10 增加了一个新选项 --allow-incomplete-classpath。默认情况下(不指定此选项时),可达但在类路径中缺失的类会在原生镜像生成时报告。指定此新选项后,缺失的类只会在运行时报告。此选项支持例如探测类是否存在、捕获类加载错误然后回退到不同行为的库。这应该能使更多应用程序能够编译为 GraalVM 原生镜像。

JavaScript

项目更新日志可在 GitHub 上查阅。

  • 增加了以编程方式构建 Java 类路径的功能。如果您在运行时知道类和 jar 文件位于何处,您可以将它们添加到类路径并使用其中的 Java 代码。
  • 兼容性:增加了对可能成为 ECMAScript 2019 一部分的几项提案的支持:Array.prototype.{flat,flatMap}格式良好的 JSON.stringifyglobalThis
  • 兼容性:将几个非标准内置功能移到标志后面(请参阅更新日志)。

LLVM 运行时

  • 改进了调试体验:内部函数(源自 GraalVM LLVM 解释器实现)现在默认在堆栈跟踪中隐藏,并可以使用 --inspect.Internal 进行调试;未处理的异常现在输出到 stderr 而不是 stdout

更多详细信息可在 GitHub 上的项目更新日志中找到。

Ruby

GraalVM 1.0-rc10 的 Ruby 实现带来了多项新功能和错误修复,可在 GitHub 上的项目更新日志中查阅。

  • 兼容性:实现了以下 API 并添加了库
    • 已添加 nkfkconv 标准库。
    • QueueSizedQueue#close#closed? 已实现。
    • Kernel#clone(freeze) 已实现。
    • Warning.warn 已实现。
    • Thread.report_on_exception 已实现。
  • 兼容性:ArgumentError 消息现在更好地匹配 MRI。

Python

  • 嵌入接口方面进行了多项面向用户的改进:在 Python 中获取/设置当前工作目录现在使用适当的 Truffle API,Python 将在 KEY_INFO 消息中报告副作用,并且 KEYS 消息现在以属性和方法响应(而不是字典键)。
  • 交互式 help() 内置功能现在可用,包括查询语言和语法。

完整的项目更新日志可在 GitHub 上查阅。

R

在与 R 生态系统兼容性方面迈出了重要一步

  • 改进了对流行包的支持:Rcpp 模块,dplyr 现在大部分功能可用,FastR 提供了自己的 data.table 版本(正在开发中)。
  • 可以使用新的内置函数 install.fastr.packages(pkgs) 来安装 FastR 专用的 rJavadata.table 包版本。
  • 修复了在 macOS 上安装 R 包和使用 Fortran 代码时出现的链接问题。

完整的更新日志可在 GitHub 上查阅。

GraalVM 集成商的 API 更改 (SDK + Truffle)

要查看 API 更改列表,请参阅项目更新日志

工具

Graal VisualVM

多项生活质量改进

  • 增加了 SVM 堆转储系统属性的显示。
  • 增加了对客座语言(如 JavaScript、Ruby 等)的字段直方图和合并引用支持。
  • 改进了 CPU 采样器准确性。

理想图可视化工具

  • 该工具现在能够理解 mx 项目结构,例如在打开源代码时理解 GraalVM 编译器项目。
  • 改进了绘制大型图时的性能。

1.0-RC9

(2018-11-05)

适用于 Java 开发人员的 GraalVM (GraalVM + 编译器)

  • 已将基于的 JDK 更新到 8u192。您可以在 Oracle 技术网络网站上找到 JDK 发布说明。

Ruby

GraalVM 1.0-rc9 的 Ruby 实现包含了安全更新和多项错误修复,这些内容可在 GitHub 上的项目更新日志中查阅。以下是一些最值得注意的更改的简短列表

  • Oracle Linux 7 上的 LLVM 现在无需从源代码构建即可安装。
  • Oracle Linux 支持的 LLVM 版本已从 3.8 更新到 4.0。
  • mysql2 现已打补丁,以避免将 NULL 传递给 rb_scan_args 时的错误,并且现在通过了其大部分测试套件。
  • 安装后脚本现在会自动检测是否需要重新编译 OpenSSL C 扩展。安装后脚本也应始终在 TravisCI 中运行,请参阅文档
  • 更准确地检测系统 libssl 不兼容的情况,并添加关于如何重新编译扩展的说明。

Python

  • 在内置 Python shell 中增加了对 help 的支持。
  • 增加了 readline 以在 Python shell 中启用历史记录和自动补全。
  • 增加了对 -q-E-s-S Python 启动器标志的支持。
  • 改进了使用我们的 TRegex 引擎对字符串和字节正则表达式的支持。
  • 启动了对 binascii 模块的初步支持。

完整的项目更新日志可在 GitHub 上查阅。

R

  • R 中处理外部对象的各种改进。
  • 增加了缺少的 R 内置函数和 C API:eapply builtinrapply builtin

更多详细信息可在 GitHub 上的项目更新日志中找到。

JavaScript

完整的更新日志可在 GitHub 上查阅。

LLVM 运行时

项目更新日志可在 GitHub 上查阅。

GraalVM 集成商的 API 更改 (SDK + Truffle)

  • 增加了 SourceElement.ROOTStepConfig.suspendAnchors() 以调整调试器步进。
  • 增加了 Context.Builder.logHandlerEngine.Builder.logHandler 方法,用于安装写入给定 OutputStream 的日志处理器。
  • 基本类型、主机和 Proxy 值现在可以在多个上下文和引擎实例之间共享。它们在共享时不再抛出 IllegalArgumentException

GraalVM 版本之间主要的 GraalVM SDK 和 Truffle 更改已在项目更新日志中汇总

工具

Graal VisualVM

  • 通过修复类名和增加对 PString 的支持,改进了 Python 堆漫游器。
  • 修复了 ProfilerTreeTable 中 Page Up/Down 的处理问题。详细信息请参阅 GH-109

1.0-RC8

(2018-10-19)

适用于 Java 开发人员的 GraalVM (GraalVM + 编译器)

  • 增加了对 Intel 位操作指令的支持。更多详细信息请参阅 #666
  • 对非逃逸对象上的 unsafe 比较和交换调用进行虚拟化。请参阅 #636

Maven 工件

  • com.oracle.truffle 组 ID 已重命名为 org.graalvm.truffle
  • graal-sdklauncher-commonpolyglot-tck 工件已从 org.graalvm 组 ID 移动到 org.graalvm.sdk
  • 现已提供的新工件
    • org.graalvm.compiler:compiler
    • org.graalvm.js:js
    • org.graalvm.js:js-launcher
    • org.graalvm.js:js-scriptengine
    • org.graalvm.regex:regex
    • org.graalvm.tools:chromeinspector
    • org.graalvm.tools:profiler
    • org.graalvm.truffle:truffle-nfi
    • com.oracle.substratevm:library-support
    • com.oracle.substratevm:objectfile
    • com.oracle.substratevm:pointsto
    • com.oracle.substratevm:svm-driver
    • com.oracle.substratevm:svm
  • 现在是模块化 JAR 的工件
    • truffle-api
    • graal-sdk
    • js
    • js-scriptengine
    • compiler
  • compiler 工件提供了 jdk.internal.vm.compiler 模块,可用于在 JDK 11 中升级该模块。与 JDK 中存在的模块不同,此版本包含优化的 Truffle 运行时。

原生镜像生成

  • 原生镜像生成器现在自动支持使用 ServiceLoader 加载的服务。META-INF 目录中列出的所有服务实现类,一旦服务接口被使用,就会自动可用。这消除了手动为这些类注册资源和反射支持的需要。可以使用 -H:-UseServiceLoaderFeature 选项禁用自动注册。
  • 完成了对隔离区(在运行时启动多个独立的 VM 实例)和压缩引用(用于减少内存占用;仅限企业版)的支持。更多详细信息将在后续博客文章中提供。
  • 新的 Maven 插件允许在 Maven 构建中生成原生镜像。
  • 原生镜像生成所需的所有组件(Substrate VM 和 GraalVM 编译器)现在都可以在 Maven Central 上找到。其依赖项是
      <dependency>
        <groupId>com.oracle.substratevm</groupId>
        <artifactId>svm</artifactId>
        <version>1.0.0-rc8</version>
        <scope>provided</scope>
      </dependency>
    

JavaScript

  • Node.js 已更新到 10.9.0 版本。

完整的更新日志可在 GitHub 上查阅。

LLVM 运行时

项目更新日志可在 GitHub 上查阅。

Ruby

  • 现在支持 Ubuntu 18.04 LTS、Fedora 28 和 macOS 10.14 (Mojave)。
  • 已添加 Java.synchronized(object) { }TruffleRuby.synchronized(object) { } 方法。
  • 添加了 TruffleRuby::AtomicReference 类。
  • 现在已改进在线程上设置最后一个异常的性能。

完整的项目更新日志可在 GitHub 上查阅。

Python

  • Python 现在支持分配分析器 (--memtracer) 来分析应用程序的堆使用情况。

更新日志可在 GitHub 上查阅。

R

GraalVM 1.0-rc8 的 R 实现带来了多项错误修复,可在 GitHub 上的项目更新日志中查阅。

工具

Graal VisualVM

  • 引入了用于客座语言的 CPU 和内存采样器。
  • 提交了 R 语言堆漫游器的改进。

GraalVM 集成商的 API 更改 (SDK + Truffle)

GraalVM 版本之间主要的 GraalVM SDK 和 Truffle 更改已在项目更新日志中汇总

1.0-RC7

(2018-10-03)

适用于 Java 开发人员的 GraalVM (GraalVM + 编译器)

  • 增加了 Unsafe 比较和交换调用的虚拟化,更多详细信息请参阅 GH-636

原生镜像生成

JavaScript

  • 改进了在同一引擎的 Contexts 之间共享形状的支持,这允许在不同手动创建的上下文中重用 AST 和对象。
  • 支持 BigInteger 类型的 TypedArrays。

更多详细信息可在 GitHub 上的项目更新日志中找到。

LLVM 运行时

完整的更新日志可在 GitHub 上查阅。

  • 新的多语言内置函数 polyglot_has_member
  • 移除了对局部变量隐式多语言类型的支持,因为类型信息的可用性无法保证。现在严格要求显式多语言类型转换(polyglot_as_typed)。更多详细信息请参阅互操作性指南
  • 支持 IR 级别(比特代码文件的文本表示)跟踪,即创建所有已执行比特代码的执行日志,用于调试目的。
  • 初步支持 LLVM 7。

Ruby

完整的更新日志可在 GitHub 上查阅。以下是一些最值得注意的更改的简短列表。

  • 为更多外部对象添加了有用的 inspect 字符串。
  • 增加了 rbconfig/sizeof 原生扩展,以提高 MRI 兼容性。
  • 支持 pg 1.1。该扩展现在可以成功编译,但仍可能在某些数据类型上存在问题。
  • readline 现在可以被中断信号(Ctrl+C)中断。这修复了 Ctrl+C 在 IRB 中不起作用的问题。
  • 修复了阻止 TruffleRuby 与 Bundler 2.0 及更高版本一起工作的版本检查问题。
  • 现在 Bundler 1.16.5 已内置支持 TruffleRuby,因此移除了针对 Bundler 兼容性的过时补丁。
  • 修复了 Kernel.public_send 未正确跟踪其调用者的问题 rb_thread_call_without_gvl() 不再持有 C 扩展锁。
  • 修复了在 method_added 内部调用 caller_locations 时的问题。
  • 修复了在 initialize_copy 内部调用 mon_initialize 时的问题。

Python

  • 增加了对 re.split 内置功能的支持。
  • 使用内省实用方法增强了 java 互操作内置模块。
  • C 扩展接口的更改以减少开销。

更新日志可在 GitHub 上查阅。

R

  • 当 FastR 作为原生镜像运行时,支持基于 AWT 的图形设备(jpg、png、X11 等)。
  • eval.polyglot:参数 source 已重命名为 code
  • 新的内置函数 as.data.frame.polyglot.value 从 Polyglot 对象创建 R 数据帧(KEYS 用作列名,值必须是同构数组,例如响应 HAS_SIZE)。
  • eval.polyglot 中的路径相对于当前工作目录解析。
  • 通过 dplyr 测试(GitHub 版本的 dplyr)所需的各种修复。

更多详细信息可在 GitHub 上的项目更新日志中找到。

工具

理想图可视化工具

  • 用户可以从图节点导航到 JavaScript(客座语言)源代码。
  • 理想图可视化工具提示下载插件以支持 JavaScript 编辑。
  • 简单的脚本(用 JavaScript 编写)可以应用于图数据。

GraalVM 集成商的 API 更改 (SDK + Truffle)

要查看 API 更改列表,请参阅项目更新日志

1.0-RC6

(2018-08-31)

适用于 Java 开发人员的 GraalVM (GraalVM + 编译器)

原生镜像生成

  • 将类初始化延迟到运行时:默认情况下,对于原生镜像可见的所有可达类都会在镜像构建期间初始化,即类初始化方法在镜像构建期间执行,并且在运行时不被视为可达方法。但对于某些类,需要在运行时执行类初始化方法。现在可以使用新选项 --delay-class-initialization-to-runtime=<逗号分隔的类名列表> 或使用新的 API RuntimeClassInitialization 类来实现此功能。
  • 镜像堆中不再允许直接字节缓冲区:我们在镜像生成期间添加了新的验证,以确保镜像堆中没有直接或映射的字节缓冲区(MappedByteBuffer 实例)。此类缓冲区要么指向 C 内存,要么引用文件描述符,即在镜像生成期间可用但在镜像运行时不再可用的原生资源。使用此类缓冲区会导致运行时出现段错误。我们发现此问题是因为 Netty 有一些在类初始化器中创建的直接缓冲区。因此需要将此类类的初始化延迟到运行时。
  • 更好地自动发现通过反射访问的类、方法和字段。当 Class.forNameClass.getMethodClass.getField 和其他类似类的 String 参数可以在镜像生成期间进行常量折叠时,这些类、方法和字段会自动注册以供反射使用,无需在命令行上手动注册。常量 String 参数是一种常见的模式,用于支持例如不同 JDK 版本或不同库版本,在这些版本中,类、方法或字段并非在所有情况下都存在,因此无法直接使用。

LLVM 运行时

完整的更新日志可在 GitHub 上查阅。

  • 支持 LLVM IR 级别调试,即在 *.ll 文件级别而非 *.c 文件级别进行调试。
  • 针对原始数组类型的新多语言转换函数,允许其他语言的对象像原始数组一样使用。
  • 支持 polyglot_as_typed 中的函数指针成员,允许其他语言的对象在诸如 obj->func(args) 这样的表达式中使用。

Ruby

完整的更新日志可在 GitHub 上查阅。以下是一些最值得注意的更改的简短列表。

  • TruffleRuby 现在可用作 JSR 223 (javax.script) 语言;
  • 现在包含从 JRuby 迁移的指南
  • 嵌入式配置 -Xembedded 现在可以在启动器命令行上设置。
  • Polyglot.export 现在可以与基本类型一起使用,并在 Polyglot.import 从 Java 转换字符串时将字符串转换为 Java。
  • 外部对象优化,例如在 to_sto_strinspect 上取消装箱外部字符串。
  • 优化了性能和关键字 rest 参数 (def foo(**kwrest))
  • 根据用户报告进行的多次错误修复。

Python

完整的更新日志可在 GitHub 上查阅。

  • 通过将 CPython 的 sre 模块作为回退引擎(除了 Truffle 的正则表达式引擎)来改进了与正则表达式的兼容性。
  • C 扩展模块现在可以使用 LLVM 5+ 进行编译,这在之前因内部不兼容性而被阻止。
  • 引入了惰性字符串连接,以显著加快重复连接字符串的代码模式。
  • 多项 C-API 改进,以扩展对 scikit-learn 的支持。
  • 各个领域的扩展和修复:函数和代码对象的行为、集合、导入期间的异常处理、类型 ID、文档和生成器。
  • 将标准库更新到 CPython 3.6.5。
  • 启用在多个 Contexts 中重用 AST(要求 Contexts 在相同的多语言引擎中创建)。

R

完整的更新日志可在 GitHub 上查阅。

  • 支持通过 par 读取/写入图形参数。
  • 为 C API 添加了大量内置函数,从而支持 RCurl、rjson、compare、naivebayes 等包。
  • 增加了对包含 ... 的公式的支持。
  • 多项错误修复:NULL 对象的属性,readLine 中 CR/LF 处理,带枢轴的 La_chol,向量强制转换中的警告/错误。

GraalVM 集成商的 API 更改 (SDK + Truffle)

要查看 API 更改列表,请参阅项目更新日志

1.0-RC5

(2018-07-31)

GraalVM 1.0-rc5 是我们首次提供 适用于 macOS 的 GraalVM 社区版预构建二进制文件 的版本。一如既往,所有二进制文件均可从下载页面获取。

已知问题

  • 适用于 macOS 的 GraalVM 社区版目前依赖于某些在当前 macOS 版本上默认未安装的库。这可能会导致与 UI 相关的功能出现问题
    Library not loaded: /usr/X11/lib/libfreetype.6.dylib
    

    可以通过例如安装 https://www.xquartz.org 来添加必要的组件。我们将在未来的适用于 macOS 的 GraalVM 社区版中移除此依赖项。

适用于 Java 开发人员的 GraalVM (GraalVM + 编译器)

  • 1.0-RC5 包含 JVMCI 更改,这些更改是支持预编译 GraalVM 编译器并将其作为共享库与 libjvm.so(即 libgraal)一起部署所必需的。请注意,libgraal 本身的实现不属于此版本,因为它仍在开发中。

原生镜像生成

  • 添加了 API,允许应用程序区分原生镜像构建、原生镜像运行时和常规 Java 执行。有关更多信息和文档,请参阅 ImageInfo 类。

JavaScript

  • 移除了旧版 NashornExtensions 选项,请改用 --js.nashorn-compat
  • 增加了对 Symbol.prototype.description 的支持。
  • 增加了对 String.prototype.matchAll 的支持。

更多详细信息可在 GitHub 上的项目更新日志中找到。

Ruby

完整的更新日志可在 GitHub 仓库中查阅,以下是一些最值得注意的更改。

  • macOS 上更简单的安装:在 macOS 上不再需要将 LLVM (/usr/local/opt/llvm@4/bin) 添加到 PATH。
  • --log.ruby.level= 可用于从任何语言启动器设置日志级别。
  • String#unpack1 已实现。
  • 优化了必需和可选关键字参数。
  • -Dtruffleruby.logTRUFFLERUBY_LOG 已被移除 - 请使用 -Dpolyglot.log.ruby.level
  • 自定义日志级别 PERFORMANCEPATCH 已被移除。

Python

  • 生成器表达式现在在定义时正确地在其定义作用域中评估其第一个迭代器。
  • 嵌入器修复,以确保顶级作用域稳定,并且局部作用域始终包含 TruffleObjects。
  • C-API 改进以支持简单的 Cython 模块。
  • 支持使用多语言启动器识别 Python 源文件,因此现在使用多语言启动器启动 Python 脚本时不再需要 --language python(请注意,安装 Python 后,多语言启动器仍需要使用 bin/gu rebuild-images polyglot 重新构建)。

完整的更新日志可在 GitHub CHANGELOG.md 上查阅。

R

有关更改列表,请参阅 CHANGELOG

LLVM 运行时

项目更新日志可在 GitHub 上查阅。

  • 支持基于 LLVM 的 @llvmn.debugtrap 内置函数的 __builtin_debugtrap 函数,该函数可用于进入调试器(例如 Chrome 检查器)。
  • 支持在将多语言值作为结构体访问时,“结构体末尾零长度数组”模式。
  • 改进了全局变量访问的性能。
  • 改进了对 clang 生成的矢量化比特代码操作的支持。

GraalVM 集成商的 API 更改 (SDK + Truffle)

  • 增加了新的执行监听器 API,允许对执行的代码进行简单、高效和细粒度的内省。
  • 将默认语言上下文策略从 SHARED 更改为 EXCLUSIVE,即默认情况下每个多语言或内部上下文有一个独占语言实例。这可以通过语言使用上下文策略进行配置。

要查看 API 的完整更改列表,请参阅项目更新日志

工具

Graal VisualVM

  • Graal VisualVM 已添加到 GraalVM 社区版分发中。

1.0-RC4

(2018-07-13)

一般说明

虽然我们为本次 RC4 版本的所有语言提供了更新的组件,但只有 JavaScript 组件从其上游仓库获得了修复。所有其他语言的功能保持不变。

下一个版本 RC5 计划于 8 月初发布,并将为所有组件提供更新。

JavaScript

GraalVM JavaScript 组件已更新,以提供与 Nashorn 引擎更好的兼容性。现在有一个 --nashorn-compat 标志可以启用向后兼容功能。强烈不建议新应用程序使用此标志,但它可以简化现有代码从 Nashorn 到 GraalVM 的迁移。

  • 像字段一样访问 getter 和 setter
  • 提供 Java.extend, Java.super, JavaImporter, JSAdapter
  • 允许构造接口或抽象类
  • 提供顶级包全局变量 java, javafx, javax, com, org, edu

  • 提供 Java.isScriptFunction, Java.isScriptObject, Java.isJavaMethod 和 Java.isJavaFunction

为脚本模式添加了一些全局函数和对象,可以通过 --scripting 标志启用

  • 提供 $EXEC, $ENV, $ARG, $OPTIONS

1.0-RC3

(2018-06-29)

适用于 Java 开发人员的 GraalVM (GraalVM + 编译器)

  • 已将底层 JDK 版本从“1.8.0_171”更新到“1.8.0_172”。您可以在 Oracle 技术网络网站上找到 JDK 发布说明。
  • 修复了 JVMCI 初始化期间罕见的 NullPointerException。

原生镜像生成

  • 增加了对 java.lang.reflect.Proxy 的支持,支持自动检测和手动配置。
  • 增加了对 Classloader.getResource() 及类似方法的支持。
  • 增加了通过 theServiceLoader 加载服务的支持。
  • 修复了为配置文件引导优化生成原生镜像时(使用 --pgo-instrument 命令行选项)出现的 ClassCastException 问题。

JavaScript

  • 启用了同一引擎的 Contexts 之间的代码共享。
  • 增加了对 BigInt 算术表达式的支持。
  • 增加了 Nashorn 兼容模式标志 --js.nashorn-compat,详细信息以及从 Nashorn 迁移的指南请参阅文档
  • 将 V8 兼容模式的标志重命名为 js.v8-compat

更多详细信息可在 GitHub 上的项目更新日志中找到。

Ruby

完整的更新日志可在 GitHub 仓库中查阅,以下是一些最值得注意的更改。

  • 增加了在外部对象上调用 is_a? 的能力。
  • 修复:Qnil/Qtrue/Qfalse/Qundef 现在可以用作 C 扩展中全局变量的初始值。
  • 修复:SIGPIPE 在 SubstrateVM 上被正确捕获,并且当管道或套接字的读取端关闭时,相应的 write() 会引发 Errno::EPIPE
  • 修复了根据魔术编码注释确定 eval() 源编码的问题。

此外,我们对 stat() 相关调用、eval()、字符串替换、从 IO 读取等方面实施了多项性能改进。

Python

GraalVM Python 实现仍处于早期阶段,但我们正在朝运行使用 SciPy 的应用程序的目标迈进。

  • 多项 C-API 改进使得能够运行简单的 NumPy 示例。
  • 实现了缓冲 I/O 和更多编码支持,这使得可以通过标准 open 函数处理文件而无需强制非缓冲访问,并能够处理具有 utf-8 以外编码的文件。
  • 大多数数学模块函数现已实现并正常工作。
  • 移除了 random 模块的替代品,现在我们运行标准库 random 模块以实现完全兼容。
  • 在使用多线程 Python 上下文的嵌入式场景中改进了线程安全性。

更多详细信息可在 GitHub 上的项目更新日志中找到。

R

  • 增加了更多缺失的 R 内置函数和 C API 函数,完整列表请参阅 CHANGELOG
  • 简化了安装,用于为当前系统配置 FastR 的脚本 jre/languages/R/bin/configure_fastr 不再需要 Autotools。
  • 增加了配置文件,允许用户构建 FastR 运行时的原生镜像,从而缩短启动时间。运行 jre/languages/R/bin/install_r_native_image 以构建镜像。
  • 修复了绘图窗口在关闭并重新打开后不显示任何内容的问题。

LLVM 运行时

  • 新的内置函数 polyglot_from_typedpolyglot_as_typed,可用于动态地将类型附加到多语言对象。
  • TruffleObject 的实现者现在可以响应 GetDynamicType 消息,以便在从 LLVM 代码访问对象时提供类型。

更多详细信息可在项目更新日志中找到。

GraalVM 集成商的 API 更改 (SDK + Truffle)

  • 为 Truffle 语言和工具增加了对日志记录的支持。
  • 移除了已弃用的 ResultVerifier.getDefaultResultVerifier API。

要查看 API 更改列表,请参阅项目更新日志

工具

Graal VisualVM

我们改进了内存占用,并引入了多项 UI 改进,以提供更简洁、响应更快的 Graal VisualVM 体验。此外,还有以下改进:

  • 增加了对 LLVM 运行时进程的识别。
  • 改进了客座语言(guest languages)对象逻辑值的显示。
  • 改进了用于检查内存转储功能的面向对象查询语言 (OQL) 控制台——现在支持排序、过滤、聚合和无限制的结果数量。

Chrome 检查器

  • 现在,多个多语言(polyglot)引擎的多个检查器会话可以在同一端口上运行。

1.0-RC2

(2018-06-05)

适用于 Java 开发者的 GraalVM

  • 将底层 JDK 版本从“1.8.0_161”更新到“1.8.0_171”。您可以在Oracle 技术网络网站上找到 JDK 发行说明。
  • 改进了对 Java 微基准测试套件 (Java Microbenchmark Harness) 的支持。自 JMH 1.21 起,GraalVM 已成为受认可和支持的 JVM
  • 修复了栈溢出异常,并改进了递归内联 invokedynamic 指令时的性能。
  • 修复了在构建 scalac 编译器时导致代码生成不正确的编译器错误

原生镜像生成

  • 增加了对构建静态链接原生镜像的支持。现在您可以传递 --static,如果您安装了静态 libc 和 zlib,它将生成一个独立的无需 libc 即可运行的可执行文件。
  • 为 SubstrateVM 和 Graal 编译器组件的许可证添加了 Classpath 异常,以确保所有最终进入原生镜像的 GraalVM 代码都受此条款约束。
  • 修复了隐式异常(NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException 等)的处理:所有异常现在都具有正确的堆栈跟踪,并且可以按预期捕获。以前,隐式异常有时不会被同一方法中的异常处理器捕获。
  • 修复了早期采用者报告的在生成原生镜像时出现的一些异常。

JavaScript

  • Node.js 更新到 8.11.1(从 8.9.4),这不是一个破坏性更改,但带来了许多改进,包括 CVE 列出的安全修复。

LLVM 运行时

  • 增加了用于从 LLVM 语言访问 Java 类型和实例化外部对象的新 API。

现在可以轻松地从编译为 LLVM 位码的原生程序调用 Java 代码。下面的示例展示了如何从 C 语言访问 Java 的 BigInteger 大整数运算。

#include <stdio.h>
#include <polyglot.h>
int main() {
    void *bigInteger = polyglot_java_type("java.math.BigInteger");
    void *(*BigInteger_valueOf)(long) = polyglot_get_member(bigInteger, "valueOf");

    void *bi = BigInteger_valueOf(2);
    void *result = polyglot_invoke(bi, "pow", 256);

    char buffer[100];
    polyglot_as_string(polyglot_invoke(result, "toString"),
                       buffer,
                       sizeof(buffer),
                       "ascii");

    printf("%s\n", buffer);
}

如果我们将其编译为 LLVM 位码,就可以使用 GraalVM 执行它。您可以看到它计算了 2^256 的值,这在 C 语言中否则并不容易实现。

# shelajev at shrimp.local in /tmp
→ clang -c -O1 -emit-llvm -I$JAVA_HOME/jre/languages/llvm big-integer-demo.c

# shelajev at shrimp.local in /tmp
→ lli --jvm big-integer-demo.bc
115792089237316195423570985008687907853269984665640564039457584007913129639936

LLVM 解释器的更详细更改列表可在完整更新日志中找到。

Ruby

  • 我们现在与 Ruby 2.4.4 兼容。
  • Java.import name 将 Java 类作为顶级常量导入。
  • 外部数字(foreign numbers)强制转换为 Ruby 数字现在可行。
  • to_s 适用于所有外部对象并调用 Java 的 toString
  • to_str 将尝试 UNBOX(解装箱)然后再次尝试 to_str,以促使外部字符串(foreign strings)的解装箱。

更多详细信息可在完整的更新日志中找到。

R

除其他更改外,我们改进了 GraalVM 的 R 实现的稳定性。

  • 添加了一个 /jre/languages/R/bin/configure_fastr 脚本,允许 FastR 的原生构建脚本适应当前系统,这使得安装 R 包更加稳定。
  • 文件 *fastr_errors.log* 已重命名为 *fastr_errors_pidXYZ.log*,并存储在初始工作目录、用户主目录、/tmp 或 FastR 主目录(选择第一个可写入的位置)中。如果您提交问题,请将其添加到错误报告中。

Python

  • 增加了对 Python unittest 框架的支持。
  • Python 现在支持在 Chrome 检查器中捕获异常并在堆栈帧上回溯。

GraalVM 集成商的 API 更改 (SDK + Truffle)

GraalVM SDK 和 Truffle 都为开发者提供了 API,以支持在 GraalVM 之上构建应用、实现语言、嵌入 GraalVM 等。

  • 实现了具有相同引擎的客座语言上下文之间的代码共享,加快了代码的重复评估速度。

要查看 API 更改列表,请参阅项目更新日志

工具

VisualVM

  • 修复了加载多语言堆转储文件的问题
  • 修复了 R 控制台中脚本执行的问题
  • 改进了对 R REPL 的识别
  • 修复了 loop to 节点
  • 修复了子节点中的内存泄漏
  • 改进了在 macOS 上的外观
  • 适用性修复
  • 为类添加了根直方图

GraalVM 更新器 gu

  • 默认操作模式从“从本地文件安装”更改为“从目录安装”。
  • 从目录安装的 -c 选项可以省略(从目录安装是默认行为),但指定 -c 仍然有效。
  • 使用 -F 从本地文件安装,例如 bin/gu -F /tmp/ruby-installable.jar

Chrome 检查器

修复了多个问题

  • 修复了第一行没有语句的节点脚本的初始暂停问题
  • 修复了工具提示问题和函数的表示
  • 修复了 Chrome 检查器客户端重新连接的问题

联系我们