全棧虛擬機器GraalVM初體驗

老錢發表於2018-04-19

官方介紹

近日Oracle開源了一個實驗性的產品GraalVM,官方稱之為Universal GraalVM。它打通了不同語言之間的鴻溝,讓我們可以進行混合式多語言程式設計。 在GraalVM之上,我們可以編寫Java、Python、Ruby、R、Scala、Kotlin,甚至是C、C++語言。

全棧虛擬機器GraalVM初體驗

你可能會當心不同語言之間的互操作會不會帶來效能上的問題。GraalVM說不會,你可以隨意在多種不同語言之間竄來竄去,效能都不是問題。它完全不同於JVM裡面的JRuby、Jython這些library。

全棧虛擬機器GraalVM初體驗

看到這裡,你須明白,GraalVM可能不止是一個玩具,它能真得跑起來大型應用。

圖中的例子同時用了NodeJS、Java和R語言,拿node平臺的express框架跑起了一個簡單的web伺服器。

GraalVM支援映象加速,類似於Android的Ahead-Of-Time編譯,將程式編譯為原生的二進位制程式,加速程式啟動過程。

全棧虛擬機器GraalVM初體驗

我們看到這效能至少提速了一個數量級。Spring啟動蝸牛慢的問題有可能首先被GraalVM解決。

GraalVM可以內建到不同的執行環境。目前已經可以內建到Node、Java、Oracle和MySQL這幾個產品中。

全棧虛擬機器GraalVM初體驗

下載安裝

接下來我們親自體驗一下GraalVM的神奇魅力。

首先進入下載頁面,OMG,竟然同時提供了社群版和企業版,看來GraalVM真不止是個玩具。

糟糕,社群版目前不支援mac,還得在龜慢的github上下載。

企業版支援mac,還好,可以試用,但是下載要註冊Oracle賬號,國外的網站訪問真是龜慢。耐心!耐心!耐心!

填寫了一番冗長的登錄檔單後,總算可以下載了,又是龜速啊。

全棧虛擬機器GraalVM初體驗

改用迅雷,迅雷快,也就快了一小會,迅速從500k/s降低到50k/s,又回到了100k/s。還是喝杯咖啡先。

全棧虛擬機器GraalVM初體驗

總算下完了,大概花了1個小時。

全棧虛擬機器GraalVM初體驗

全棧虛擬機器GraalVM初體驗

全棧虛擬機器GraalVM初體驗

圖中的紫色命令是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進行安裝的

全棧虛擬機器GraalVM初體驗

因為小編此時無法翻牆,所以只好放棄ruby和python的安裝了。

版本資訊

全棧虛擬機器GraalVM初體驗

可以看到這些命令的版本資訊裡除了node之外都攜帶了Graal單詞。

執行

全棧虛擬機器GraalVM初體驗

全棧虛擬機器GraalVM初體驗

使用native-image進行預編譯之後會生成一個二進位制檔案,然後對比前後執行時間發現預編譯前後執行效能明顯提升。native-image耗時較長,因為要做大量的程式碼靜態分析,大約耗時1分鐘。

全棧虛擬機器GraalVM初體驗

C語言需要先編譯成llvm的位元組碼程式hello.bc,然後才能讓lli命令執行。

全棧虛擬機器GraalVM初體驗

javascript直譯器,全域性物件console、Math、Date都有了。

全棧虛擬機器GraalVM初體驗

全棧虛擬機器GraalVM初體驗

不可思議,npm可以直接安裝第三方包,使用GraalVM提供的node能正常執行。npm也是GraalVM內建的程式。

解決了哪些痛點

GraalVM的混合式多語言程式設計可以解決開發者的以下常見問題

  1. 那個庫我這個語言沒有,我TM得自己擼一個
  2. 那個語言最適合解決我這個問題,但是我這個環境下跑不起來
  3. 這個問題已經被我的語言解決了,但是我的語言跑起來太慢了

通過使用Polyglot API,GraalVM要給開發者帶來真正的語言級自由。

Polyglot工作原理

GraalVM提供了一種在不同語言之間可以無縫傳值的方法,而不需要像其它虛擬機器一樣進行序列化和反序列化。這樣就保證了跨語言也能繼續保持高效能。

GraalVM開發了「跨語言互操作協議」,它是一種特殊的介面協議,每種執行在GraalVM之上的語言都要實現這種協議,這樣就能保證跨語言的互操作性。 語言和語言之間無須瞭解對方就可以高效傳值。該協議還在不斷改進中,未來會支援更多特性。

全棧虛擬機器GraalVM初體驗

弱化主語言

GraalVM開發了一個實驗性的啟動器「polyglot」。在polyglot裡面不存在主語言的概念,每種語言都是平等的,可以使用polyglot執行任意語言編寫的程式,而不需要前面的每種語言單獨一個啟動器。polyglot會通過檔案的副檔名來自動分類語言。

全棧虛擬機器GraalVM初體驗

Shell

GraalVM還開發了一個動態語言的Shell,該Shell預設使用js語言,可以使用命令切換到任意其它語言進行解釋操作。

全棧虛擬機器GraalVM初體驗

最後

不幸的是,GraalVM是Oracle的產品,它要是能像Google這樣節操多點,GraalVM也許會是一個非常完美的產品。

關注公眾號「碼洞」,讓我們一起來進一步深入討論GraalVM。

相關文章