GraalVM提供了一個(gè)全面的生態(tài)系統(tǒng),支持大量的語(yǔ)言集合包括(Java以及其他基于JVM的語(yǔ)言、JavaScript, Ruby, Python, R, 以及 C/C++ 還有其他基于LLVM的語(yǔ)言),同時(shí)還能支持在不同的部署場(chǎng)景下運(yùn)行(包括OpenJDK、Node.js、MySQL、Oracle Database,或者其他獨(dú)立場(chǎng)景)。本篇文章提供了概述,簡(jiǎn)要說(shuō)明對(duì)于不同場(chǎng)景下GraalVM能夠?yàn)槟愕膽?yīng)用程序帶來(lái)的不同特性。一些多樣性的功能可能并不會(huì)展示在這篇文章中,有興趣的可以參考下面這篇文章:前10件GraalVM能夠?yàn)槟阕龅氖虑?/a>
對(duì)于Java
對(duì)于已有的java程序,GraalVM能夠使它們運(yùn)行得更快,通過(guò)腳本語(yǔ)言提供擴(kuò)展性功能以及創(chuàng)建提前編譯的本地鏡像
使java運(yùn)行得更快
GraalVM能夠通過(guò)一種新的及時(shí)編譯技術(shù)在OpenJDK的上下文中運(yùn)行,使得java程序能夠運(yùn)行的更快。GraalVM接手了java字節(jié)碼到機(jī)器碼的編譯工作。特別是對(duì)于那種基于JVM的語(yǔ)言,比如Scala,這樣的配置可以收到更好的效果,比如Twitter在生產(chǎn)環(huán)境中的使用經(jīng)驗(yàn)總結(jié):Twitter在生產(chǎn)環(huán)境中運(yùn)行GraalVM
GraalVM的編譯器對(duì)于高度抽象的程序能夠有顯著的性能提升,主要是因?yàn)樗軌蛟诙喾N場(chǎng)景下移除非常耗時(shí)的對(duì)象分配。具體可以參考這篇文章以及嘗試這個(gè)例子。更好的內(nèi)聯(lián)以及更積極的優(yōu)化能夠給復(fù)雜的、長(zhǎng)時(shí)間運(yùn)行的程序提供更好的幫助,參考例子Stream APIs example。
GraalVM在性能方面的差異和程度取決于具體的工作情況,我們非常感興趣能夠獲取到各種各樣的基準(zhǔn)測(cè)試結(jié)果來(lái)幫助我們使得GraalVM變得更快。
使得你的程序更具擴(kuò)展性
GraalVM能夠基于java程序的上下文運(yùn)行JavaScript, R, Python, 或者 Ruby程序,同時(shí)它可以將java的數(shù)據(jù)結(jié)構(gòu)暴露給這些語(yǔ)言,并且提供安全的沙盒機(jī)制。這種集成是和語(yǔ)言無(wú)關(guān)的,例如集成了JavaScript同樣可以在之后集成另外的基于GraalVM的語(yǔ)言。代理機(jī)制則可以從java數(shù)據(jù)結(jié)構(gòu)中模擬動(dòng)態(tài)對(duì)象并將其暴露給嵌入式的腳本中去。具體可以參考如何將你的基于JVM的應(yīng)用程序通過(guò)GraalVM變得更具擴(kuò)展性
創(chuàng)建本地鏡像
在java虛擬機(jī)中運(yùn)行你的程序會(huì)有啟動(dòng)以及軌跡的額外開(kāi)銷。GraalVM則可以為已經(jīng)存在的基于JVM的程序創(chuàng)建一個(gè)本地鏡像。鏡像生成過(guò)程采用靜態(tài)分析方法來(lái)發(fā)現(xiàn)java主方法中可達(dá)的代碼,然后執(zhí)行完整的提前(AOT)編譯。結(jié)果產(chǎn)生的二進(jìn)制代碼以機(jī)器碼的形式涵蓋了整個(gè)程序,以便能夠立即執(zhí)行。它能夠同時(shí)連接其他的本地程序,并且能夠可選擇的包含GraalVM編譯器作為及時(shí)(JIT)編譯的補(bǔ)充,以此來(lái)高效的運(yùn)行任何基于GraalVM的語(yǔ)言。另外,可以使用之前在應(yīng)用程序運(yùn)行中收集的配置文件引導(dǎo)優(yōu)化來(lái)構(gòu)建本地鏡像,可以參考例子:如何構(gòu)建本地鏡像
對(duì)于Node.js
GraalVM可以在Node.js的上下文中運(yùn)行,替換了V8來(lái)執(zhí)行JavaScript腳本程序。這樣做的好處在于可以讓多語(yǔ)言應(yīng)用程序(比如采用java,R,或者Python庫(kù))使用更大的堆內(nèi)存配置,使用java的垃圾收集器來(lái)運(yùn)行Node.js程序。同時(shí)使用GraalVM的互操作性來(lái)在C/C++中定義數(shù)據(jù)結(jié)構(gòu)并且在JavaScript中使用這些數(shù)據(jù)結(jié)構(gòu)。
重復(fù)利用Java、R或者Python中的類庫(kù)
GraalVM可以在Node.js中直接使用Java的類庫(kù)或者框架(例如Spark或者Flink),同時(shí)可以在JavaScript程序里面直接使用例如R或者Python來(lái)做數(shù)據(jù)科學(xué)計(jì)算或者繪制。參考文章:多語(yǔ)言應(yīng)用程序示例
運(yùn)行于大的堆中
標(biāo)準(zhǔn)的Node.js發(fā)行版中包含的V8 JavaScript引擎針對(duì)瀏覽器的配置進(jìn)行了調(diào)整,以達(dá)到在小堆場(chǎng)景中能夠高效工作的目的。我們能夠確保使用JVM中的堆管理來(lái)運(yùn)行Node.js,使得能夠采用大堆配置以及設(shè)置合適的Java垃圾回收機(jī)制。在帶壓縮的32位指針下,可以配置32G的最大堆,在64位的指針下則配置的最大堆可以達(dá)到TB級(jí)別。
在C/C++中定義數(shù)據(jù)結(jié)構(gòu)
GraalVM允許C/C++編寫(xiě)的本地代碼混合JavaScript代碼,本地?cái)?shù)據(jù)結(jié)構(gòu)可以被直接訪問(wèn)并且可以無(wú)視任何邊界條件。這對(duì)于一部分代碼是以C的數(shù)據(jù)結(jié)構(gòu)管理并且分配,而另一部分代碼是以Node.js編寫(xiě)而言,無(wú)疑是可以高效的。具體參考
對(duì)于Ruby、R以及Python
GraalVM對(duì)于Ruby、R以及Python的支持仍然是處于試驗(yàn)性的。我們活躍工作于對(duì)這些語(yǔ)言的穩(wěn)定性以及全模塊支持。此時(shí)此刻,我們可以運(yùn)行一些簡(jiǎn)單的Ruby和R程序,但是我們還不能提供像Java以及Node.js那樣全方位的支持。我們的Python支持還處于起步階段,只有很少一部分實(shí)例。
除了一些顯而易見(jiàn)的好處(例如語(yǔ)言的互操作性),GraalVM能夠?qū)@些語(yǔ)言有10倍以上的性能提升。我們很高興能夠幫助Ruby和R的應(yīng)用程序能夠在GraalVM下工作,但是我們不能保證這些語(yǔ)言能夠達(dá)到開(kāi)箱即用的能力。
對(duì)于Oracle以及MySQL數(shù)據(jù)庫(kù)
GraalVM是帶有嵌入性以及適用于數(shù)據(jù)庫(kù)的設(shè)計(jì)的,我們提供了對(duì)于Oracle和MySQL的實(shí)驗(yàn)性的集成工作,并且期待GraalVM能夠持續(xù)集成到其他的環(huán)境中。
運(yùn)行于Oracle
我們的Oracle數(shù)據(jù)庫(kù)多語(yǔ)言引擎可以參考這邊,當(dāng)前我們可以執(zhí)行JavaScript程序,并且可以通過(guò)使用browserify來(lái)執(zhí)行Node.js模塊。
運(yùn)行于MySQL
我們同時(shí)也提供了一個(gè)MySQL的多語(yǔ)言引擎插件,它能夠像Oracle數(shù)據(jù)庫(kù)引擎一樣支持JavaScript,我們將盡快為這個(gè)插件提供二進(jìn)制構(gòu)建。
對(duì)于你自己的平臺(tái)
我們鼓勵(lì)使用GraalVM嵌入式的開(kāi)發(fā)方案,類似于集成到Oracle數(shù)據(jù)庫(kù)、MySQL、OpenJDK以及Node.js中。和我們合作伙伴的一起研究,我們已經(jīng)將嵌入式的思想暴露到了Spark以及Flink中去,如何將GraalVM嵌入到你的基于JVM的程序中去,可以參考這篇文章
對(duì)于你自己開(kāi)發(fā)的語(yǔ)言和工具
GraalVM是一個(gè)開(kāi)放的生態(tài)系統(tǒng),我們熱情邀請(qǐng)第三方系統(tǒng)將他們自己的語(yǔ)言以及工具加入進(jìn)來(lái)。
實(shí)現(xiàn)你自己的語(yǔ)言
Truffle語(yǔ)言開(kāi)發(fā)框架使得在GraalVM上面執(zhí)行開(kāi)發(fā)語(yǔ)言變得很高效。它能夠從翻譯中自動(dòng)推導(dǎo)高性能的代碼,從而簡(jiǎn)化了語(yǔ)言的實(shí)現(xiàn)。詳情請(qǐng)見(jiàn)以下的論文
使用GraalVM去實(shí)現(xiàn)你自己的語(yǔ)言不僅僅能夠提供高效率,更重要的是,他能夠?qū)⒛愕恼Z(yǔ)言和GraalVM生態(tài)環(huán)境聯(lián)系起來(lái),使得你可以使用它們提供的工具,而且可以使你的語(yǔ)言嵌入到GraalVM上下文里面運(yùn)行。
我們開(kāi)發(fā)了一種“示范行語(yǔ)言”——"SimpleLanguage" 用來(lái)展示使用GraalVM實(shí)現(xiàn)的框架,可以參考這篇文章來(lái)實(shí)現(xiàn)你自己的語(yǔ)言。
創(chuàng)建語(yǔ)言無(wú)關(guān)型工具
GraalVM提供一種框架用來(lái)實(shí)現(xiàn)語(yǔ)言無(wú)關(guān)型工具(比如調(diào)試器、解析器或者其他的檢測(cè)器)。GraalVM提供了一種標(biāo)準(zhǔn)化的方式來(lái)表達(dá)和運(yùn)行程序代碼,支持跨語(yǔ)言研究和開(kāi)發(fā)工具,然后可以達(dá)到一次開(kāi)發(fā),應(yīng)用于任何語(yǔ)言。
原文請(qǐng)見(jiàn)鏈接:https://www.graalvm.org/docs/why-graal/