GraalVM提供了一个全面的生态系统,支持大量的语言集合包括(Java以及其他基于JVM的语言、JavaScript, Ruby, Python, R, 以及 C/C++ 还有其他基于LLVM的语言),同时还能支持在不同的部署场景下运行(包括OpenJDK、Node.js、MySQL、Oracle Database,或者其他独立场景)。本篇文章提供了概述,简要说明对于不同场景下GraalVM能够为你的应用程序带来的不同特性。一些多样性的功能可能并不会展示在这篇文章中,有兴趣的可以参考下面这篇文章:前10件GraalVM能够为你做的事情
对于Java
对于已有的java程序,GraalVM能够使它们运行得更快,通过脚本语言提供扩展性功能以及创建提前编译的本地镜像
使java运行得更快
GraalVM能够通过一种新的及时编译技术在OpenJDK的上下文中运行,使得java程序能够运行的更快。GraalVM接手了java字节码到机器码的编译工作。特别是对于那种基于JVM的语言,比如Scala,这样的配置可以收到更好的效果,比如Twitter在生产环境中的使用经验总结:Twitter在生产环境中运行GraalVM
GraalVM的编译器对于高度抽象的程序能够有显著的性能提升,主要是因为它能够在多种场景下移除非常耗时的对象分配。具体可以参考这篇文章以及尝试这个例子。更好的内联以及更积极的优化能够给复杂的、长时间运行的程序提供更好的帮助,参考例子Stream APIs example。
GraalVM在性能方面的差异和程度取决于具体的工作情况,我们非常感兴趣能够获取到各种各样的基准测试结果来帮助我们使得GraalVM变得更快。
使得你的程序更具扩展性
GraalVM能够基于java程序的上下文运行JavaScript, R, Python, 或者 Ruby程序,同时它可以将java的数据结构暴露给这些语言,并且提供安全的沙盒机制。这种集成是和语言无关的,例如集成了JavaScript同样可以在之后集成另外的基于GraalVM的语言。代理机制则可以从java数据结构中模拟动态对象并将其暴露给嵌入式的脚本中去。具体可以参考如何将你的基于JVM的应用程序通过GraalVM变得更具扩展性
创建本地镜像
在java虚拟机中运行你的程序会有启动以及轨迹的额外开销。GraalVM则可以为已经存在的基于JVM的程序创建一个本地镜像。镜像生成过程采用静态分析方法来发现java主方法中可达的代码,然后执行完整的提前(AOT)编译。结果产生的二进制代码以机器码的形式涵盖了整个程序,以便能够立即执行。它能够同时连接其他的本地程序,并且能够可选择的包含GraalVM编译器作为及时(JIT)编译的补充,以此来高效的运行任何基于GraalVM的语言。另外,可以使用之前在应用程序运行中收集的配置文件引导优化来构建本地镜像,可以参考例子:如何构建本地镜像
对于Node.js
GraalVM可以在Node.js的上下文中运行,替换了V8来执行JavaScript脚本程序。这样做的好处在于可以让多语言应用程序(比如采用java,R,或者Python库)使用更大的堆内存配置,使用java的垃圾收集器来运行Node.js程序。同时使用GraalVM的互操作性来在C/C++中定义数据结构并且在JavaScript中使用这些数据结构。
重复利用Java、R或者Python中的类库
GraalVM可以在Node.js中直接使用Java的类库或者框架(例如Spark或者Flink),同时可以在JavaScript程序里面直接使用例如R或者Python来做数据科学计算或者绘制。参考文章:多语言应用程序示例
运行于大的堆中
标准的Node.js发行版中包含的V8 JavaScript引擎针对浏览器的配置进行了调整,以达到在小堆场景中能够高效工作的目的。我们能够确保使用JVM中的堆管理来运行Node.js,使得能够采用大堆配置以及设置合适的Java垃圾回收机制。在带压缩的32位指针下,可以配置32G的最大堆,在64位的指针下则配置的最大堆可以达到TB级别。
在C/C++中定义数据结构
GraalVM允许C/C++编写的本地代码混合JavaScript代码,本地数据结构可以被直接访问并且可以无视任何边界条件。这对于一部分代码是以C的数据结构管理并且分配,而另一部分代码是以Node.js编写而言,无疑是可以高效的。具体参考
对于Ruby、R以及Python
GraalVM对于Ruby、R以及Python的支持仍然是处于试验性的。我们活跃工作于对这些语言的稳定性以及全模块支持。此时此刻,我们可以运行一些简单的Ruby和R程序,但是我们还不能提供像Java以及Node.js那样全方位的支持。我们的Python支持还处于起步阶段,只有很少一部分实例。
除了一些显而易见的好处(例如语言的互操作性),GraalVM能够对这些语言有10倍以上的性能提升。我们很高兴能够帮助Ruby和R的应用程序能够在GraalVM下工作,但是我们不能保证这些语言能够达到开箱即用的能力。
对于Oracle以及MySQL数据库
GraalVM是带有嵌入性以及适用于数据库的设计的,我们提供了对于Oracle和MySQL的实验性的集成工作,并且期待GraalVM能够持续集成到其他的环境中。
运行于Oracle
我们的Oracle数据库多语言引擎可以参考这边,当前我们可以执行JavaScript程序,并且可以通过使用browserify来执行Node.js模块。
运行于MySQL
我们同时也提供了一个MySQL的多语言引擎插件,它能够像Oracle数据库引擎一样支持JavaScript,我们将尽快为这个插件提供二进制构建。
对于你自己的平台
我们鼓励使用GraalVM嵌入式的开发方案,类似于集成到Oracle数据库、MySQL、OpenJDK以及Node.js中。和我们合作伙伴的一起研究,我们已经将嵌入式的思想暴露到了Spark以及Flink中去,如何将GraalVM嵌入到你的基于JVM的程序中去,可以参考这篇文章
对于你自己开发的语言和工具
GraalVM是一个开放的生态系统,我们热情邀请第三方系统将他们自己的语言以及工具加入进来。
实现你自己的语言
Truffle语言开发框架使得在GraalVM上面执行开发语言变得很高效。它能够从翻译中自动推导高性能的代码,从而简化了语言的实现。详情请见以下的论文
使用GraalVM去实现你自己的语言不仅仅能够提供高效率,更重要的是,他能够将你的语言和GraalVM生态环境联系起来,使得你可以使用它们提供的工具,而且可以使你的语言嵌入到GraalVM上下文里面运行。
我们开发了一种“示范行语言”——"SimpleLanguage" 用来展示使用GraalVM实现的框架,可以参考这篇文章来实现你自己的语言。
创建语言无关型工具
GraalVM提供一种框架用来实现语言无关型工具(比如调试器、解析器或者其他的检测器)。GraalVM提供了一种标准化的方式来表达和运行程序代码,支持跨语言研究和开发工具,然后可以达到一次开发,应用于任何语言。
原文请见链接:https://www.graalvm.org/docs/why-graal/