学习使用Whally GraalVM!
介紹
在Truffle在神圣的Graal中服務:Graal和Truffle在JVM上進行多語種語言解釋的帖子中,我們得到了簡短的介紹,并對Graal,Truffle及其周圍的一些概念進行了深入研究。 但是,如果不深入研究實用性,那么任何技術都不會很有趣,否則它就像理論物理學或純數學一樣-對某些人來說是抽象的,對其他人來說很無聊(對不起,最后一部分只是我的抱怨)。
在這篇文章中,我們將通過安裝GraalVM ,比較SDK的差異以及一些示例來說明如何在GraalVM上編譯和運行不同的語言,以及如何在GraalVM中運行它們,來研究GraalVM。相同的上下文,最后是本地語言(性能更高)。
GraalVM與我們從任何供應商處下載的任何Java SDK(JDK)相似,除了它具有JVMCI:Java級JVM編譯器接口支持,并且Graal是默認的JIT編譯器。 它不僅可以執行Java代碼,還可以執行JS,Ruby,Python和R等語言。它還可以為Java程序和其他支持的語言構建提前(AOT)編譯的可執行文件(本機映像)或共享庫。 盡管我們不會遍歷所有語言,但只會選擇其中的幾種。
只是讓您知道,所有命令和操作都是在Ubuntu 16.04操作系統環境上執行的(應該在MacOSX上進行較小的改動,在Windows上需要更多的更改–很高興收到有關差異的反饋,將與他們一起更新帖子)。
實際動手
我們可以通過多種方式使用GraalVM ,既可以自行構建它,也可以從供應商網站下載預構建的版本:
- 建立在我們自己的基礎上:一些克隆和其他魔術(我們稍后會看到)
- 下載現成的JVM: OTN下載站點
- 將自定義JIT連接到具有JVMCI支持的現有JDK(我們將在后面看到)
由于我們使用的是Linux環境,因此最好下載基于JDK8 (> 500MB文件,需要接受許可,需要在OTN 上登錄)的GraalVM的Linux(預覽版)版本。 https://login.oracle.com/mysso/signon.jsp )并安裝。
解壓縮檔案后,按照下載頁面上的安裝信息進行操作,執行以下命令后,您將找到一個名為graalvm-0.30的文件夾(在撰寫本文時)。
$ tar -xvzf graalvm-0.30-linux-amd64-jdk8.tar.gz鷹眼:比較SDK
我們將快速檢查SDK的內容以熟悉它們,因此讓我們檢查GraalVM SDK文件夾的內容:
$ cd graalvm-0.30 $ ls
與傳統的Java SDK文件夾(即JDK 1.8.0_44)相比,它看起來很熟悉并且具有相似之處:
$ cd /usr/lib/jdk1.8.0_44 $ ls
除了我們還有很多其他要學習的工件,即VM上支持的語言的啟動器,例如FastR,JS(GraalJS),NodeJS(GraalNodeJS),Python,Ruby和Sulong (C / C ++,Fortran) 。
比較GraalVM SDK和說JDK 1.8.0_44 SDK之間的bin文件夾,我們可以看到那里有一些其他文件:
(使用諸如meld或diff類的工具來比較目錄)
同樣,我們可以看到jre文件夾有一些有趣的差異,盡管其語義與傳統的Java SDK相似。 列表中一些有趣的項目是Rscript , lli和ployglot 。
現在,我們還沒有從字面上比較這兩個SDK來標記彼此之間不同或缺失的元素,但是上面的內容使我們對預先使用其提供的功能提供了一個了解-該SDK具有他們將其放入了examples文件夾。
$ tree -L 1
(使用tree命令– sudo apt-get tree可以看到以上內容,在MacOSX和Windows上可用)
每個子文件夾都包含GraalVM支持的各種語言的示例,包括我們還將介紹的embed和native-image 。
令人興奮的部分:動手使用示例
讓我們開始討論,但是在執行任何代碼并查看示例做什么之前,我們應該將graalvm-0.30移動到其他Java SDK所在的位置,在/ usr/lib/jvm/進行設置,并設置環境變量調用GRAAL_HOME指向它:
$ sudo mv -f graalvm-0.30 /usr/lib/jvm $ export GRAAL_HOME=/usr/lib/jvm/graalvm-0.30 $ echo "export GRAAL_HOME=/usr/lib/jvm/graalvm-0.30" >> ~/.bashrc $ cd examplesR語言
讓我們選擇R并運行一些R腳本文件:
$ cd R $ $GRAAL_HOME/bin/Rscript --help # to get to see the usage text注意我們正在運行Rscript而不是R ,兩者都可以運行R腳本,后面是R REPL。
使用Rscript運行hello_world.R :
$ $GRAAL_HOME/bin/Rscript hello_world.R [1] "Hello world!"JavaScript
接下來,我們嘗試一些Javascript :
$ cd ../js/ $ $GRAAL_HOME/bin/js --help # to get to see the usage使用js運行hello_world.js :
$ $GRAAL_HOME/bin/js hello_world.js Hello world!嵌入
現在讓我們嘗試一些不同的方法,如果您希望在JVM上運行用多種語言編寫的代碼,這些代碼都駐留在同一個源文件中,這以前從未做過,這就是embed的意思。
$ cd ../embed我們可以使用org.graalvm.polyglot.context類來實現。 這是HelloPolyglotWorld.java的代碼片段:
import org.graalvm.polyglot.*;public class HelloPolyglotWorld {public static void main(String[] args) throws Exception {System.out.println("Hello polyglot world Java!");Context context = Context.create();context.eval("js", "print('Hello polyglot world JavaScript!');");context.eval("ruby", "puts 'Hello polyglot world Ruby!'");context.eval("R", "print('Hello polyglot world R!');");context.eval("python", "print('Hello polyglot world Python!');");} }使用下面的代碼進行編譯以創建一個.class文件:
$ $GRAAL_HOME/bin/javac HelloPolyglotWorld.java并使用以下命令運行它以查看其工作原理:
$ $GRAAL_HOME/bin/java HelloPolyglotWorld Hello polyglot world Java! Hello polyglot world JavaScript! Hello polyglot world Ruby! [1] "Hello polyglot world R!" Hello polyglot world Python!在語言之間進行切換并打印“ Hello多種語言世界……”時,您可能已經注意到執行過程有些遲鈍。 消息,希望我們能夠了解為什么會發生這種情況,甚至可以解決它。
本機圖像
GraalVM SDK的本機映像功能有助于縮短 Java應用程序的啟動時間 ,并減小其占用空間 。 有效地將其在JVM(在任何平臺上)上運行的字節碼轉換為特定OS /平臺的本機代碼-這就是性能的來源。 它使用積極的提前(aot)優化來獲得良好的性能。
讓我們看看它是如何工作的。
$ cd ../native-image讓我們從此文件夾中的HelloWorld.java中提取Java代碼段:
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }編譯成字節碼:
$ $GRAAL_HOME/bin/javac HelloWorld.java將字節碼(HelloWorld.class)編譯為本機代碼:
$ $GRAAL_HOME/bin/native-image HelloWorldclasslist: 740.68 ms(cap): 1,042.00 mssetup: 1,748.77 ms(typeflow): 3,350.82 ms(objects): 1,258.85 ms(features): 0.99 msanalysis: 4,702.01 msuniverse: 288.79 ms(parse): 741.91 ms(inline): 634.63 ms(compile): 6,155.80 mscompile: 7,847.51 msimage: 1,113.19 mswrite: 241.73 ms[total]: 16,746.19 ms看一下文件夾,我們可以看到Hello World源代碼和已編譯的工件:
3.8M -rwxrwxr-x 1 xxxxx xxxxx 3.8M Dec 12 15:48 helloworld12K -rw-rw-r-- 1 xxxxx xxxxx 427 Dec 12 15:47 HelloWorld.class12K -rw-rw-r-- 1 xxxxx xxxxx 127 Dec 12 13:59 HelloWorld.java第一個文件helloworld是本機二進制文件,它使用native-image命令在我們對其進行編譯的平臺上運行,該命令可以在JVM的幫助下直接執行:
$ helloworld Hello, World!即使我們獲得了性能,但我們可能會失去在JVM上以字節碼形式運行的其他功能-選擇哪種路由完全取決于用例和重要性為了我們。
總結一下!
這需要進行總結,在命令行上有很多閱讀和嘗試的經驗,但是值得花時間探索有趣的GraalVM。
總而言之,我們著手從Oracle Lab網站下載GraalVM,將其解壓縮,查看各種文件夾,并將其與我們傳統的Java SDK進行比較,并注意到并指出了差異。
我們進一步查看了為各種Graal支持的語言提供的示例,并挑選了一些功能,這些功能使我們對GraalVM可以提供的功能有所了解。 盡管我們可以在其上運行傳統的Java應用程序,但現在我們也有機會在同一源文件或同一項目中編寫以多種支持的語言表示的應用程序。 這也使我們能夠在以不同語言編寫的應用程序的不同方面之間進行無縫互操作 。 甚至可以針對本機環境重新編譯我們現有的應用程序( native-image ),以提高性能并減少占用空間。
翻譯自: https://www.javacodegeeks.com/2017/12/learning-use-wholly-graalvm.html
總結
以上是生活随笔為你收集整理的学习使用Whally GraalVM!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中update_Java 7 U
- 下一篇: 擂怎么组词 擂的组词有哪些