V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codehole
V2EX  ›  程序员

全栈虚拟机 GraalVM 初体验

  •  
  •   codehole ·
    pyloque · 2018-04-19 08:29:48 +08:00 · 957 次点击
    这是一个创建于 2171 天前的主题,其中的信息可能已经有所发展或是发生改变。

    官方介绍

    近日 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 提供的比较特殊的命令

    1. js 运行在 GraalVM 之上的 javascript 命令行
    2. node 跟普通的 node 一样,区别是运行在 GraalVM 之上
    3. java 跟普通的 java 一样,区别是运行在 GraalVM 之上
    4. lli 运行在 GraalVM 之上的 llvm 字节码执行器,C 和 C++代码会编译成 llvm 字节码,然后通过它来运行
    5. native-image 预编译程序文件生成快速二进制文件,用于加速启动程序
    6. 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 的混合式多语言编程可以解决开发者的以下常见问题

    1. 那个库我这个语言没有,我 TM 得自己撸一个
    2. 那个语言最适合解决我这个问题,但是我这个环境下跑不起来
    3. 这个问题已经被我的语言解决了,但是我的语言跑起来太慢了

    通过使用 Polyglot API,GraalVM 要给开发者带来真正的语言级自由。

    Polyglot 工作原理

    GraalVM 提供了一种在不同语言之间可以无缝传值的方法,而不需要像其它虚拟机一样进行序列化和反序列化。这样就保证了跨语言也能继续保持高性能。

    GraalVM 开发了「跨语言互操作协议」,它是一种特殊的接口协议,每种运行在 GraalVM 之上的语言都要实现这种协议,这样就能保证跨语言的互操作性。 语言和语言之间无须了解对方就可以高效传值。该协议还在不断改进中,未来会支持更多特性。

    弱化主语言

    GraalVM 开发了一个实验性的启动器「 polyglot 」。在 polyglot 里面不存在主语言的概念,每种语言都是平等的,可以使用 polyglot 运行任意语言编写的程序,而不需要前面的每种语言单独一个启动器。polyglot 会通过文件的扩展名来自动分类语言。

    Shell

    GraalVM 还开发了一个动态语言的 Shell,该 Shell 默认使用 js 语言,可以使用命令切换到任意其它语言进行解释操作。

    最后

    不幸的是,GraalVM 是 Oracle 的产品,它要是能像 Google 这样节操多点,GraalVM 也许会是一个非常完美的产品。

    关注公众号「码洞」,让我们一起来进一步深入讨论 GraalVM。

    cchange
        1
    cchange  
       2018-04-19 08:34:48 +08:00 via iPhone
    虚拟化是不可阻挡的趋势啊
    whileFalse
        2
    whileFalse  
       2018-04-19 08:44:53 +08:00
    超赞啊。
    我喜欢那个“跨语言互操作协议”,
    我觉得日后可以发展成,互操作的的对象不在本地虚拟机中,也就是用多个机器部署单个应用程序。
    wlwood
        3
    wlwood  
       2018-04-19 09:40:53 +08:00
    从此以后,php 再也不是世界最好的语言?
    JoeoooLAI
        4
    JoeoooLAI  
       2018-04-19 10:16:41 +08:00
    也是牛 X......观望一下
    stanjia
        5
    stanjia  
       2018-04-19 13:02:30 +08:00
    很棒,很激动人心
    zhujian198
        6
    zhujian198  
       2018-04-19 13:24:31 +08:00
    据说这家公司 90%的部门是法务人员,附带 10%数据库部门, 你们怕被告吗?
    iFlicker
        7
    iFlicker  
       2018-04-19 16:02:39 +08:00
    虽然很棒!
    但是!
    不敢用 不敢用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5285 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 09:13 · PVG 17:13 · LAX 02:13 · JFK 05:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.