共计 3029 个字符,预计需要花费 8 分钟才能阅读完成。
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 提供了一种表达和运行程序代码的标准化方法,从而可以进行跨语言研究和开发工具,这些工具一旦开发,便可以应用于任何语言。