【翻譯】GraalVM(二):為什么要選擇GraalVM

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/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 作為一個(gè)在Sun微系統(tǒng)公司Java SE團(tuán)隊(duì)工作了十多年的人,難道不應(yīng)該是體內(nèi)流淌著Java字節(jié)碼的血、只要一息尚...
    Java架構(gòu)學(xué)習(xí)者閱讀 2,628評(píng)論 4 17
  • TITLE: 編程語(yǔ)言亂燉 碼農(nóng)最大的煩惱——編程語(yǔ)言太多。不是我不學(xué)習(xí),這世界變化快! 有時(shí)候還是蠻懷念十幾、二...
    碼園老農(nóng)閱讀 5,602評(píng)論 2 35
  • 黑夜里傳來(lái)一聲低低的驚叫:啊,“欲練神功,必先自宮?!痹啦蝗簝擅忌铛?,一張剛正不阿的臉龐在微微閃動(dòng)的燭光下陰晴不定...
    青顏_2c0a閱讀 393評(píng)論 3 2
  • 一般網(wǎng)頁(yè)(沒(méi)有進(jìn)行任何設(shè)置)默認(rèn)跳轉(zhuǎn)到新窗口。我們?cè)谠O(shè)置跳轉(zhuǎn)時(shí),都會(huì)考慮跳轉(zhuǎn)到當(dāng)前頁(yè)面,亦或是跳轉(zhuǎn)到新頁(yè)面。為此我...
    Wanlly閱讀 5,937評(píng)論 0 0
  • 3月16號(hào) 星期六 天氣晴 親子日記第十三天 由于昨天的雨,今天的天氣涼颼颼的,小棉襖又穿起來(lái)了。 ...
    syl飄雪閱讀 84評(píng)論 0 0

友情鏈接更多精彩內(nèi)容