GraalVM 入门

zeo 2020年05月27日 1,119次浏览

GraalVM提供了一个全面的生态系统,可支持多种语言(Java和其他基于JVM的语言,JavaScript,Ruby,Python,R,WebAssembly,C / C ++和其他基于LLVM的语言)并在不同的部署方案中运行它们(OpenJDK, Node.js,Oracle数据库或独立)。该页面概述了GraalVM可以为您的应用程序带来不同的方案。此页面上可能会缺少的一些通用GraalVM功能在GraalVM十大要做的事情博客文章中进行了全面总结和披露。

对于Java程序

对于现有的Java应用程序,GraalVM可以通过更快地运行它们,通过脚本语言提供可扩展性或创建提前编译的本机映像来提供好处。

更快地运行Java

GraalVM可以在OpenJDK的上下文中运行,从而通过新的即时编译技术使Java应用程序运行得更快。GraalVM负责将Java字节码编译为机器代码。特别是对于其他基于JVM的语言(例如Scala),此配置可以实现好处,例如在生产环境中运行GraalVM的经历。

GraalVM的编译器由于能够在许多情况下删除昂贵的对象分配而为高度抽象的程序提供了性能优势。您可以在此研究论文中找到详细信息并尝试示例。更好的内联和更积极的投机优化可以为复杂且长期运行的应用程序带来更多好处,请参见Stream API示例。

GraalVM在性能方面是否有所不同,当然取决于具体的工作量。我们有兴趣获得任何基准测试结果,这些结果可以帮助我们更快地实现GraalVM。

使您的应用程序可扩展

GraalVM支持在Java应用程序的上下文中运行JavaScript,R,Python,Ruby,LLVM IR和Web程序集。它提供了使用细粒度的主机访问过滤器将Java数据结构公开给那些语言的功能。集成是与语言无关的,即,JavaScript的集成也可以在以后用于执行任何其他基于GraalVM的语言。代理机制允许从Java数据结构中模拟动态对象,并将它们公开给嵌入式脚本。看看说明如何使您的基于JVM的应用程序扩展与GraalVM。

创建本机映像

在Java VM中运行应用程序会带来启动和占用成本的问题。GraalVM具有为现有的基于JVM的应用程序创建本机映像的功能。镜像生成过程使用静态分析来查找主要Java方法可访问的任何代码,然后执行完整的提前(AOT)编译。生成的本机二进制文件以机器代码形式包含整个程序,以便立即执行。它可以与其他本机程序链接,还可以选择包括GraalVM编译器,以提供互补的即时(JIT)编译支持,从而以高性能运行任何基于GraalVM的语言。为了获得更高的性能,可以使用应用程序的先前运行中收集的配置文件引导的优化来构建本机映像。在此处查看如何构建本地镜像的示例。

对于Node.js程序

通过用GraalVM替换V8来执行JavaScript,GraalVM可以在Node.js上下文中运行。这样做的主要好处是可以启用多语言应用程序(例如,使用Java,R或Python库),以大型堆配置和Java的垃圾收集器运行Node.js,或使用GraalVM的互操作性在C / C ++和Java中定义数据结构。从JavaScript使用它们。

重用Java,R或Python中的库

GraalVM支持直接从Node.js使用现有的Java库或Java框架(例如Spark或Flink)。此外,例如,可以将R或Python用于数据科学或直接从JavaScript应用程序进行绘图。在此处查找多语言应用程序的示例。

大堆运行

标准Node.js发行版中包含的V8 JavaScript引擎针对浏览器配置进行了调整,旨在在小堆场景中有效地工作。我们支持通过JVM的堆管理运行Node.js,从而为大型堆配置和适当的垃圾收集设置打开了能力。使用压缩的32位指针时,最大可配置堆大小为32 Gb,并且64位指针配置中支持TB的堆。

在C / C ++中定义数据结构

GraalVM允许本机代码(例如,用C / C ++编写)和JavaScript的有效组合。可以直接访问本机数据结构,并且编译器可以内联跨越任何边界。这在使用C管理和分配有效数据结构而将其他应用程序部分编写在Node.js中的情况下可能是有益的。在参考手册中找到这种情况的示例。

对于Ruby,R,Python或WebAssembly

Ruby,R,Python,WebAssembly 在GraalVM生态系统中处于试验阶段,目前不建议在生产中使用,但我们正在积极致力于这些语言的所有模块的稳定性和支持。目前,我们可以运行Ruby,R和Python的简单应用程序,但是我们没有为Java和Node.js应用程序提供完全相同的兼容性。WebAssembly当前实现WebAssembly MVP(最小可行产品)规范,并且是GraalVM环境中最年轻的语言。

除了标准的GraalVM优势(如语言互操作性(例如,从那些应用程序中使用Java或JavaScript))之外,GraalVM还可将这些语言的速度提高10倍或更多。我们很乐意协助使现有Ruby和R应用程序与GraalVM一起使用,但我们尚不能保证这些语言的现成兼容性。

在Oracle数据库中运行

GraalVM专为可嵌入性而设计,可以在数据库中执行。我们的Oracle数据库多语言引擎(MLE)的原型在 此处提供。它允许Oracle数据库用户运行JavaScript,使用browserify执行Node.js模块,并使用Python编写扩展。

对于微服务框架

当前作为早期采用者技术提供的GraalVM本机映像可与许多不同的Java微服务框架一起使用。几个项目已经接受了该技术作为其应用程序的平台:Quarkus,Micronaut和Helidon。对于这些框架,与在HotSpot上运行相比,GraalVM本机映像显着降低了运行时内存需求。我们相信GraalVM本机映像技术可以成为部署云本机应用程序的最佳方法。

微服务图

微服务图

为您的平台

我们鼓励开发类似于Oracle数据库,OpenJDK或Node.js中我们自己的集成的GraalVM嵌入。我们已经与研究合作伙伴一起探索了嵌入Spark或Flink的想法。找到如何在现有的基于JVM的应用程序或本地应用程序中嵌入GraalVM的描述在这里。

适用于您的语言和工具

GraalVM是一个开放的生态系统,我们邀请第三方系统通过连接自己的编程语言,工具或平台来参与。

实施自己的语言

松露语言实现框架允许在GraalVM上有效地运行编程语言。它通过自动从解释器派生高性能代码来简化语言实现。您可以在本研究论文中找到有关此方法的详细信息。

使用GraalVM实现您自己的语言不仅会给您带来高性能。更重要的是,它使您的语言可以与GraalVM生态系统提供的丰富工具连接。而且,它使您的语言可以在任何GraalVM嵌入的上下文中运行。

我们开发了一种名为“ SimpleLanguage”的演示语言,以展示GraalVM语言实现框架的使用。了解如何开始实施一种语言。

创建不可知的语言工具

GraalVM提供了一个框架,可用于创建与语言无关的工具,例如调试器,分析器或其他工具。GraalVM提供了一种表达和运行程序代码的标准化方法,从而可以进行跨语言研究和开发工具,这些工具一旦开发,便可以应用于任何语言。