初探Oracle全棧虛擬機---GraalVM


官方說明:

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版本包含語言解釋器:

  • 基於JVM的語言,如Java,Scala,Groovy或Kotlin
  • JavaScript(包括node.js)
  • 編譯為LLVM bitcode的語言,如C,C ++或Rust
  • Ruby,R和Python的實驗版本

GraalVM包括以下組件:

  • Graal:一種動態即時(JIT)編譯器,通過獨特的代碼分析和優化方法提高應用程序的效率和速度。
  • Graal Polyglot API:用於在共享運行時中組合編程語言的API。這些API允許您根據需要匹配編程語言,並使用更少的資源為您提供更好的性能。
  • Graal SDK:一組用於嵌入Graal語言和配置本機映像的API。
  • Oracle HotSpot Java虛擬機(JVM):基於JVM的語言和支持的客戶編程語言的運行時環境。

ShowTime:

  配置篇:

  看完了激動人心的介紹之后,我果斷選擇了前去嘗試。作為一個重度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

   出現如下界面,即為配置成功。

  操作篇:

  做完了,虛擬機的配置,接下來就是針對基礎代碼的測試了。

  java代碼:

  執行新增命令,打開一個文件。

  

  這是我編寫的基礎代碼

  

  然后用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會通過文件的擴展名來自動分類語言。

    

   結束語:

    從開始學習,到環境搭建和測試,確實遇到了很多坑,但是,也正因為這些坑,讓我有所收獲,確實學到了很多。這個東西,總體來說,還是不錯的。后續我會嘗試將項目打包上去進行測試。

    

 

  參考資料:

  https://github.com/oracle/graal/issues/343    GraalVM官方github issues

  https://www.graalvm.org/docs/        GraalVm官方文檔

  https://juejin.im/post/5ad7372f6fb9a045e511b0a4     全棧虛擬機GraalVM初體驗




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM