当前位置: 首页 > 软件库 > 开发工具 > 编译器 >

GraalVM

JVM 即时编译器
授权协议 GPLv2
开发语言 Java C/C++ Python
所属分类 开发工具、 编译器
软件类型 开源软件
地区 不详
投 递 者 许波涛
操作系统 Linux
开源组织 Oracle
适用人群 未知
 软件概览

Graal — 新的 JVM 即时编译器

GraalVM 是新一代的高性能跨语言虚拟机,用于运行 JavaScript、Python 3、Ruby、R、基于 JVM 的语言,如 Java、Scala、Kotlin 和基于 LLVM 的语言,如 C 和 C++。

GraalVM 消除了编程语言之间的隔离,并支持共享运行时的互操作性。它可以独立运行,也可以在 OpenJDK、Node、Oracle 或者 MySQL 上运行。

Graal 是一个用 Java 编写的新的 JVM 即时编译器,集成到 HotSpot 虚拟机,侧重性能和语言互操作性。Graal 为 Java 代码提供性能优势,这得益于方法内联、流转对象分配和推理执行等新技术,从而可以实现高性能的脚本语言引擎。

与传统的 HotSpot 编译器不同,脚本语言解释器可以使用 Graal 包含的 Truffle API 发出原生代码,这样无需提前编译,即可让编程语言获得 Java 的性能。

语言解释器可以使用 HotSpot 所用技术提高 Java 代码的速度 — 包括发出优化的原生代码(含去优化的条件)— 该技术令即时编译的代码在性能方面优于提前编译的代码。

目前提供了一个技术预览版下载,Graal 很快就可用作 JDK 9 的附加组件。当前版本是一个独立的 JDK,包含 Graal。

语言支持

下载包括以下语言引擎:

  • JavaScript — Graal.js 是一个 JavaScript 解释器/编译器,能够在 JVM 上运行 Node.js 应用

  • FastR — R 语言解释器/编译器

  • RubyTruffle — 支持 Ruby 且性能优于 Ruby

  • SimpleLanguage — 一个有关如何使用 Graal API 的示例

好处

  • 性能 — Graal 结合了我们对编译器技术的研究,在一些负载上提供比传统 JVM 更好的峰值性能

  • 语言互操作性 — 用 Graal 执行的语言可以互相调用,可以使用来自其他语言的库

用法

只需下载 OTN 预览版并将其用作 JDK。它经过预先配置,使用 Graal 作为默认的 Java 编译器,包括命令行程序 nodejrb 和 R,可用于取代 NodeJS、Ruby 和 R。

请点击下面的“软件下载” 进行体验,下载后解压即可使用 bin 目录下的 java 和 trufflejs 命令分别来执行 Java 和 JavaScript 程序。

TruffleJS 是 Truffle 多语言执行框架的一个 JavaScript 版本的实现,该版本基于 GraalVM 运行。

  • 软件简介 Graal — 新的 JVM 即时编译器 GraalVM 是新一代的高性能跨语言虚拟机,用于运行 JavaScript、Python 3、Ruby、R、基于 JVM 的语言,如 Java、Scala、Kotlin 和基于 LLVM 的语言,如 C 和 C++。 GraalVM 消除了编程语言之间的隔离,并支持共享运行时的互操作性。它可以独立运行,也可以在 OpenJDK、Node、Ora

 相关资料
  • 问题内容: 即时编译器和解释器之间有什么区别,.NET和Java JIT编译器之间有什么区别? 问题答案: 即时编译是在执行之前将非本机代码(例如字节码)转换为本机代码。 从维基百科: JIT基于运行时环境中的两个较早的想法:字节码编译和动态编译。它在本地执行代码之前先在运行时将其转换,例如将字节码转换为本地机器代码。 一种解释执行程序。它可能有也可能没有抖动。 同样,来自维基百科: 解释器可能是

  • 不久前有人问了一个有趣的问题: 我决定证明使用Java8流API(确切地说是并行流)是可能的。以下是我的代码,它在非常罕见的情况下工作: 然后我想,也许是因为潜在的JIT编译器优化?因此,我尝试使用以下VM选项运行代码: 我禁用了JIT,成功案例的数量显著增加! 即时编译器如何优化并行流,以便优化可能会影响上述代码的执行?

  • 问题内容: 我正在编译一个具有package语句的程序。例如 我也有一个与package语句匹配的现有目录结构。 如何防止javac编译器在预先存在的目录结构中创建相同的目录结构?即 在我看来,编译器应该足够“聪明”,可以在创建目录结构之前先对其进行检查。 谢谢 问题答案: 通常,编译器期望源文件并根据包结构输出类文件。 如果不提供任何选项(或未提供任何sourcepath),则相对于当前目录搜索

  • 我们知道,JVM同时使用解释器和JIT编译器。JIT编译器将重复的字节码转换为机器码并存储在内存中。现在,当解释器逐行翻译字节码并运行它时,它将跳过已转换并存储在内存中的重复代码的翻译部分,但将直接运行它。从而减少了并发冗余翻译。 那么为什么Java在JVM中使用解释器呢?像JIT这样的编译器可以一次性完成将字节码转换为机器码的整个任务吗?

  • 问题内容: 他们两个几乎都做同样的事情。确定该方法很热,然后编译而不是解释。使用OSR,您只需在编译后立即转到编译版本,而不像JIT,后者是在第二次调用该方法时调用已编译的代码。 除此之外,还有其他区别吗? 问题答案: 通常, 即时 编译是指在运行时编译本机代码并执行它,而不是(或除了)进行解释。某些虚拟机(例如Google V8)甚至都没有解释器;这些虚拟机甚至没有解释器。他们通过JIT编译执行

  • 问题内容: 他们两个几乎都做同一件事。确定该方法很热,然后编译而不是解释。使用OSR,您只需在编译后立即转到编译版本,而不像JIT,后者是在第二次调用该方法时调用已编译的代码。 除此之外,还有其他区别吗? 问题答案: 通常,即时编译是指在运行时编译本机代码并执行它,而不是(或除了)进行解释。某些虚拟机(例如Google V8)甚至都没有解释器;这些虚拟机甚至没有解释器。他们通过JIT编译执行的每个