GraalVM是一个生态系统和共享运行时,不仅提供基于JVM的语言(如Java,Scala,Groovy和Kotlin)的性能优势,还提供其他编程语言(如JavaScript,Ruby,Python和R)的性能优势。此外,它还支持通过LLVM前端在JVM上执行本机代码。GraalVM 1.0基于JDK 8。
上图说明了GraalVM作为开放式生态系统的体系结构。
虚拟化层代表GraalVM提供的编程语言。客户编程语言(即JavaScript,Ruby,R,Python和LLVM bitcode)在与基于主机JVM的应用程序相同的运行时中的执行现在是脚踏实地的。宿主语言和客户语言可以直接相互操作,并在同一存储空间中来回传递数据。
底部展示了适用范围。GraalVM既可以独立运行,也可以作为OpenJDK或node.js平台的一部分进行嵌入,甚至可以嵌入MySQL或Oracle RDBMS等数据库中。
GraalVM 1.0版本包含语言解释器:
GraalVM包括以下组件:
看完了激动人心的介绍之后,我果断选择了前去尝试。作为一个重度java患者,对于Oracle的东西还是比较有兴趣的。下面是他的官网,长这个样子,总体来说,UI设计师还是不错的。至少我喜欢这个风格。
我们继续顺着首页向下看。官网以一段Node代码,向我们展示了,GraalVM的优越性,我们可以很明显的发现,在这段代码中我们兼容了3种不同的语言。为我们提供了极大的便利性。
接下来,我们介绍下,java方面的优化,GraalVM允许您提前将程序编译为本机可执行文件。生成的程序不在Java HotSpot VM上运行,而是使用必要的组件,如内存管理,来自虚拟机的不同实现的线程调度,称为Substrate VM。Substrate VM是用Java编写的,并编译成本机可执行文件。与Java VM相比,生成的程序具有更快的启动时间和更低的运行时内存开销。
这张图中我们,很明显的看到,java的编译时间被缩短了,14倍。当然这是它官方提供的数据。一切以我之后的测试数据为准。
说了这么多,越说越激动,我迫不及待的下载了,这个东西了。去了趟官网。这家伙提供了社区版和企业版,我第一次尝试的是社区版,然后很不负众望的失败了。后面我果断百度了下,度娘也不是万能了,大多数“玩家”用的都是Mac这让我很头疼。不过索性我在官方的文档上面找到了解决方法。
在官网注册账号成功之后,会自动下载,然后我把它拖到了,我的虚拟机中。
然后执行如下操作:
1.随意选择一个文件夹,执行解压命令,会看到一堆解压的数据。如果桌面上出现图三的文件夹则标志着成功。
图三
2.接下来为这个虚拟机配置运行环境,因为我是linux的系统,所以我就选择了第一行的配置项目。格式如下:
export PATH=/path/to/graalvm/bin:$PATH
在我的机器上配置出来的效果是:
其中:/home/gjt/Desktop/graalvm-ee-1.0.0-rc4/bin是我的安装路径。
export PATH=/home/gjt/Desktop/graalvm-ee-1.0.0-rc4/bin:$PATH
出现如下界面,即为配置成功。
做完了,虚拟机的配置,接下来就是针对基础代码的测试了。
执行新增命令,打开一个文件。
这是我编写的基础代码
然后用javac编译,然后java编译执行:
之后我们尝试官网的native-image方式运行,发现了错误,
无奈,鉴于网上的参考资料很少,我选择了去官方的git上issue寻找答案。
果然还是有同道中人的,这是Oracle官方人员给出的修复答案。
我决定抱着试一试的心态,开始了尝试。
再次执行编译。
最终我还是成功的编译了这个HelloWord文件,
接下来最激动人心的时刻到了。
图一是经过native-image过后的启动时间。
图一
图二是传统java启动时间。
图二
速度得到了明显的提升。
我们可以看到经过镜像加速之后的代码速度得到了明显提升。
官方的解释是:GraalVM可以将Java字节码编译为本机映像,以实现更快的启动速度和更小的应用程序占用空间。所以,本机映像比直接在JVM上运行相同代码要快得多:
测试完java代码之后我们测试一波js代码,很明显基本的js语法都已经支持了。
再来一波Node代码,
测试代码:
var http = require('http'); http.createServer(function (request, response) { // 发送 HTTP 头部 // HTTP 状态值: 200 : OK // 内容类型: text/plain response.writeHead(200, {'Content-Type': 'text/plain'}); // 发送响应数据 "Hello World" response.end('Hello World\n'); }).listen(8080); // 终端打印如下信息 console.log('Server running at http://127.0.0.1:8080/');
最后,我们尝试一下它的其他特性:
在下面这段代码中,我同时使用了js的语法。
这就不得不提一下Polyglot。
Polyglot工作原理
GraalVM允许您使用无缝方式编写多语言应用程序,以便将值从一种语言传递到另一种语言。使用GraalVM时,不需要像其他多语言系统一样进行复制或编组。这使您可以在跨越语言边界时实现高性能。大多数情况下,完全没有语言边界的额外费用。
开发人员通常不得不做出令人不舒服的妥协,要求他们用其他语言重写他们的软件。例如:
使用GraalVM,我们的目标是允许开发人员自由选择适合手头任务的语言而不会妥协。
为了提供外语多语言值,我们开发了所谓的多语言互操作性协议。该互操作性协议由一组标准化消息组成,每个Graal语言实现并用于外部多语言值。该协议允许GraalVM支持任何语言组合之间的互操作性,而无需彼此了解。我们计划逐步改进协议,以便随着时间的推移支持越来越多的功能。
有关详细信息,我们建议您阅读:
详情参考:https://www.graalvm.org/docs/reference-manual/polyglot/
弱化主语言
GraalVM开发了一个实验性的启动器「polyglot」。在polyglot里面不存在主语言的概念,每种语言都是平等的,可以使用polyglot运行任意语言编写的程序,而不需要前面的每种语言单独一个启动器。polyglot会通过文件的扩展名来自动分类语言。
从开始学习,到环境搭建和测试,确实遇到了很多坑,但是,也正因为这些坑,让我有所收获,确实学到了很多。这个东西,总体来说,还是不错的。后续我会尝试将项目打包上去进行测试。