官方介绍
近日 Oracle 开源了一个实验性的产品 GraalVM,官方称之为 Universal GraalVM。它打通了不同语言之间的鸿沟,让我们可以进行混合式多语言编程。 在 GraalVM 之上,我们可以编写 Java、Python、Ruby、R、Scala、Kotlin,甚至是 C、C++语言。
你可能会当心不同语言之间的互操作会不会带来性能上的问题。GraalVM 说不会,你可以随意在多种不同语言之间窜来窜去,性能都不是问题。它完全不同于 JVM 里面的 JRuby、Jython 这些 library。
看到这里,你须明白,GraalVM 可能不止是一个玩具,它能真得跑起来大型应用。
图中的例子同时用了 NodeJS、Java 和 R 语言,拿 node 平台的 express 框架跑起了一个简单的 web 服务器。
GraalVM 支持镜像加速,类似于 Android 的 Ahead-Of-Time 编译,将程序编译为原生的二进制程序,加速程序启动过程。
我们看到这性能至少提速了一个数量级。Spring 启动蜗牛慢的问题有可能首先被 GraalVM 解决。
GraalVM 可以内置到不同的运行环境。目前已经可以内置到 Node、Java、Oracle 和 MySQL 这几个产品中。
下载安装
接下来我们亲自体验一下 GraalVM 的神奇魅力。
首先进入下载页面,OMG,竟然同时提供了社区版和企业版,看来 GraalVM 真不止是个玩具。
糟糕,社区版目前不支持 mac,还得在龟慢的 github 上下载。
企业版支持 mac,还好,可以试用,但是下载要注册 Oracle 账号,国外的网站访问真是龟慢。耐心!耐心!耐心!
填写了一番冗长的注册表单后,总算可以下载了,又是龟速啊。
改用迅雷,迅雷快,也就快了一小会,迅速从 500k/s 降低到 50k/s,又回到了 100k/s。还是喝杯咖啡先。
总算下完了,大概花了 1 个小时。
图中的紫色命令是 GraalVM 提供的比较特殊的命令
- js 运行在 GraalVM 之上的 javascript 命令行
- node 跟普通的 node 一样,区别是运行在 GraalVM 之上
- java 跟普通的 java 一样,区别是运行在 GraalVM 之上
- lli 运行在 GraalVM 之上的 llvm 字节码执行器,C 和 C++代码会编译成 llvm 字节码,然后通过它来运行
- native-image 预编译程序文件生成快速二进制文件,用于加速启动程序
- gu 其它的语言像 Python、Ruby 和 R 的支持都是通过 gu 进行安装的
因为小编此时无法翻墙,所以只好放弃 ruby 和 python 的安装了。
版本信息
可以看到这些命令的版本信息里除了 node 之外都携带了 Graal 单词。
运行
使用 native-image 进行预编译之后会生成一个二进制文件,然后对比前后运行时间发现预编译前后执行性能明显提升。native-image 耗时较长,因为要做大量的代码静态分析,大约耗时 1 分钟。
C 语言需要先编译成 llvm 的字节码程序 hello.bc ,然后才能让 lli 命令执行。
javascript 解释器,全局对象 console、Math、Date 都有了。
不可思议,npm 可以直接安装第三方包,使用 GraalVM 提供的 node 能正常运行。npm 也是 GraalVM 内置的程序。
解决了哪些痛点
GraalVM 的混合式多语言编程可以解决开发者的以下常见问题
- 那个库我这个语言没有,我 TM 得自己撸一个
- 那个语言最适合解决我这个问题,但是我这个环境下跑不起来
- 这个问题已经被我的语言解决了,但是我的语言跑起来太慢了
通过使用 Polyglot API,GraalVM 要给开发者带来真正的语言级自由。
Polyglot 工作原理
GraalVM 提供了一种在不同语言之间可以无缝传值的方法,而不需要像其它虚拟机一样进行序列化和反序列化。这样就保证了跨语言也能继续保持高性能。
GraalVM 开发了「跨语言互操作协议」,它是一种特殊的接口协议,每种运行在 GraalVM 之上的语言都要实现这种协议,这样就能保证跨语言的互操作性。 语言和语言之间无须了解对方就可以高效传值。该协议还在不断改进中,未来会支持更多特性。
弱化主语言
GraalVM 开发了一个实验性的启动器「 polyglot 」。在 polyglot 里面不存在主语言的概念,每种语言都是平等的,可以使用 polyglot 运行任意语言编写的程序,而不需要前面的每种语言单独一个启动器。polyglot 会通过文件的扩展名来自动分类语言。
Shell
GraalVM 还开发了一个动态语言的 Shell,该 Shell 默认使用 js 语言,可以使用命令切换到任意其它语言进行解释操作。
最后
不幸的是,GraalVM 是 Oracle 的产品,它要是能像 Google 这样节操多点,GraalVM 也许会是一个非常完美的产品。
关注公众号「码洞」,让我们一起来进一步深入讨论 GraalVM。