GraalVM 21.0提供執行Java程式碼的第三種方式:Espresso通過Truffle框架執行Java程式碼 - graalvm

發表於2021-01-21

到目前為止,GraalVM提供了兩種執行Java程式的方法:將Java HotSpot VM與GraalVM JIT(即時)編譯器一起使用,以及第二種方法:使用GraalVM Native Image編譯為本機可執行檔案。

今天,我們很高興地宣佈一種在GraalVM上執行Java的新方法(第三種方法)。GraalVM 21.0引入了一個名為的新可安裝元件,espresso該元件提供了用Java編寫的JVM實現。

Espresso可以通過Truffle框架執行Java程式碼,從而將Java提升到GraalVM支援的其他語言級別。

在我們即將釋出的每個21.x版本中,預期效能(預熱和峰值效能)都會迅速提高。

現在讓我們更詳細地瞭解什麼是Truffle上的Java,探索一些可以幫助您的顯著用例,並嘗試將專案放入更大的GraalVM和Java生態系統中。

 

Truffle上的Java是使用Truffle語言實現框架實現的JVM。它提供了Java虛擬機器的所有核心元件:

  • 位元組碼直譯器
  • 位元組碼驗證器
  • 單遍.class檔案解析器
  • 簡單物件模型
  • Java中的Java本機介面(JNI)實現
  • Java虛擬機器實現
  • Java除錯線協議(JDWP)

此實現的一個非常重要的細節是它是用Java實現的。Truffle上的Java是Java上的Java!自我託管是Java虛擬機器研發的聖盃。

Truffle上的Java可用於基於Java 8和Java 11的GraalVM發行版,因此從技術上講,您可以將其用作您選擇的JVM的替代品。Truffle上的Java目前仍處於試驗階段,還不是很快,所以今天不建議在生產工作負載上使用Java ,但是讓我們探索一下在Truffle上使用Java執行應用程式可以得到什麼。

 

Java on Java

Truffle上的Java是用Java實現的。這是一個虛擬機器實現,因此,為了實際執行Java程式碼,需要訪問類庫以及JDK提供的本機庫和方法。Truffle上的Java重用了GraalVM發行版中的JAR和本機庫。

用Java實現並能夠執行Java使得Truffle上的Java具有非常有趣的特性:它可以自行執行。的確,Truffle上的Java是一個元迴圈VM,它可以在多個層次上執行(儘管每次執行的速度越來越慢)。

成為Java程式有許多優點。其中之一是可以使用本機映像編譯為本機可執行檔案的能力

另一個優點是該程式碼是Java開發人員很好的,熟悉的並且可以理解的程式碼。考慮轉到GitHub儲存庫並檢視其原始碼。您的日常工具都可以使用它,IDE支援它,您可以像瀏覽其他Java依賴一樣探索程式碼庫。這種透明性和熟悉性應該使Truffle上的Java能夠快速有效地變得更好。

 

在Java8中嵌入執行Java11

Truffle上的Java是實際的JVM,它也是一個Java程式,這意味著您可以在另一個Java程式中執行它。這為將應用程式中的不同元件分隔開了非常有趣的途徑。例如,如果將Truffle上的Java指向JDK11發行版,則它可以執行Java11。訪問Java 8時,它將變為Java8。當兩個發行版都可用時,可以在Java 8的上下文中在Truffle上執行Java。應用程式並使用它來執行Java 11位元組程式碼,反之亦然。如果有一個僅適用於Java 8的庫,則可以在同一Java流程中的相容JDK 8中,通過一些程式設計工作來建立互操作性,從而遷移到較新的基本JDK並仍然執行該特定庫。

 

混合AOT和JIT

由於Truffle上的Java,Truffle,GraalVM編譯器以及在Truffle上有效執行Java的所有其他必要元件都是用Java編寫的,因此可以使用在Truffle上執行Java的基礎結構來構建本機映像可執行檔案。

這意味著您可以使用Java應用程式,在其中構建JVM,然後在JVM上或作為本機映像執行該應用程式。

Java on Truffle可以將JIT編譯器和動態Java執行時帶到預先編譯的二進位制檔案中。

我們準備了一個示例應用程式來說明此概念。有一個JShell實現示例,該示例採用一個普通的JShell應用程式,該應用程式由兩個獨立的部分組成:前端CLI應用程式和後端計算引擎,並用Truffle實現中的Java替換後者。

實際上,通過載入它們,可以非常巧妙地重用原始實現中的所有類。因此,示例應用程式的原始部分是“膠水”程式碼,該程式碼將主機Java部分連線到應用程式的Truffle上的Java部分。

該示例可以作為本機可執行檔案進行編譯,由於本機可執行檔案的效能特點,它可以以比正常JShell更快的速度啟動一個不錯的二進位制檔案,並且仍然可以執行我們扔給它的Java程式碼。

對於無法利用本機映像效能改進的應用程式而言,將AOT和JIT混合是一個有趣的選擇,因為它們的功能取決於動態程式碼,而動態程式碼不適用於本機映像。

 

高階類重新定義

Truffle上的Java比HotSpot更強大的另一個非常酷的功能是增強的熱交換功能-在除錯會話期間在執行時更改類。

從GraalVM 21.0開始,支援以下更改:

  1. 新增和刪​​除方法
  2. 新增和刪​​除建構函式
  3. 從介面新增和刪除方法
  4. 更改方法的訪問修飾符
  5. 更改建構函式的訪問修飾符
  6. Lambdas的更改
  7. 新增新的匿名內部類
  8. 刪除匿名內部類

使熱插拔更加強大的是對類欄位進行更改的能力。它正在開發中,並將在以後的版本中新增。

 

嘗試使用

在Truffle上嘗試Java非常簡單。它可以作為可通過gu命令安裝到基本GraalVM發行版中的元件使用。

gu install espresso 
gu install -L espresso-installable.jar#如果手動下載

安裝完成後,您可以在Truffle上的Java上執行您喜歡的應用程式,您只需傳遞-truffle給java命令即可。

java -truffle -jar myApp.jar

在Truffle上下載Java並嘗試一下!有一些示例應用程式,其說明說明了Truffle上Java的特定功能。

 

相關文章