全棧虛擬機GraalVM初體驗
官方介紹
近日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也許會是一個非常完美的產品。


※HTTP協議冷知識大全
※鮮為人知的HTTP協議頭欄位詳解大全
TAG:碼洞 |