Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

詳説GraalVM(1) イントロダクション

GraalVMが1.0.0 RC1を出し、公式サイトを公開しました!

http://www.graalvm.org/

日本の技術ブログメディアPublickeyさんも取り上げておられます。

www.publickey1.jp

そのこともあって、Graalで検索しこのブログへたどり着いた方も多かったです。私は1年ほど前、0.23の頃からGraalVMとGraal(両者の違いは後述)を触ってきました(単に触っているだけの1ファンです)。おそらく熱狂的なファンの方で、JavaOneではGraalとあるものは全セッション入りましたし、YouTubeにある世界の技術カンファレンス動画でGraalに関するものはおそらくすべて見ています。

なので自己満足がてらGraalVMについて書いていきます。

GraalVMって何なの?

端的に言うと"Polyglot VM"です。Polyglotとは多言語を意味します。多言語用の仮想マシンと捉えてもらえばよいでしょう。

JavaのJVMも、JavaだけでなくJavaバイトコードを出力する言語を実行できました。ScalaやKotlinなどです。GraalVMはJava/Scala/KotlinなどJVM言語だけではなく、たとえばJavaScriptやR、Rubyといった言語を実行できます。各言語の実装があるのです。

そして、単にそれぞれの言語を実行できるだけではなく、ある言語のコードの中に、別の言語のコードを書いて実行できます。

var array = Polyglot.eval("ruby", "[1,2,42,4]")
console.log(array[2]);

このコードにはRubyの配列を使っており、それをevalしてJavaScriptの変数に代入しています。 polyglot.jsに保存したとして、これをGraalVMに実行させます。言語を混ぜる場合は--jvm --polyglotをつけます。

$ js --polyglot --jvm polyglot.js
42

GraalVM上の言語実装には、他言語と相互運用するための"Polyglot API"が含まれます。

まとめ

GraaVMはPolyglot VMである。

Graalで調べるとJITコンパイラだって出てくるけど?

はい、そうです。JITコンパイラです。GraalVMとGraalは違います。GraalはJavaで書かれたJITコンパイラです。混同しやすい理由は、GraalVMはJITコンパイラに(OpenJDKのC2ではなく)Graalを使っています。と言うよりも、Graalを使っているからPolyglotを実現できているのです。

https://image.slidesharecdn.com/kanjavajavaone2017-171028160905/95/jvmgraalopenj9-14-638.jpg?cb=1509231437

Graalと別で、言語実装用フレームワークであるASTインタプリタTruffleがあります。GraalはTruffleのASTを解釈し、Polyglotであっても高いパフォーマンスを出すことができます。そのため、GraalVM上の各言語はTruffleを使って実装されています。

https://image.slidesharecdn.com/kanjavajavaone2017-171028160905/95/jvmgraalopenj9-20-638.jpg?cb=1509231437

JavaScriptやR、RubyはGraal.jsやFastR、TruffleRubyという名前でTruffleを使った実装があります。

github.com

github.com

FastRのdescriptionに"An alternative implementation of the R language, based on the Truffle framework."とあるとおりです。

現時点ではJavaScriptのみが公式に利用できる言語で、RやRuby、Pythonなどはexperimentalです。

私もTruffleを使って実際に言語を実装しました!四則演算するだけの単純な言語ですが…Truffleはまだドキュメントがあまりなく、Javadocと他の言語実装を見るしかありません。

github.com

Graalの話に戻りますが、Graal自体はGraalVMと別です。実際、Java 9からGraalは入っています。Java 9にAOTコンパイル機能があります(JEP 295: Ahead-of-Time Compilation)が、AOT用のコンパイラはGraalです。GraalはJITコンパイラですが、AOTもJITもマシンコードを出しますので。GraalVMもnative-imageを作る機能があります。これはまたの機会に。Java 10では実験的機能ではありますが、オプションでJITコンパイラをGraalにすることができます(JEP 317: Experimental Java-Based JIT Compiler)。

まとめ

GraalVMとGraalは異なる。GraalはJava製JITコンパイラである。Graal上のフレームワークTruffleで言語を実装できる。

GraalVMに関する私の活動について

私はGraalVMの中でもGraalとTruffleに興味を持っています。Graalのソースコードを読んで、このブログに書き残しています。

www.sakatakoichi.com

このエントリで使っているスライドの画像は私の発表資料です。

www.slideshare.net

今回はここまで。