GraalVMってなんぞや

名前は聞くけどよくわかってないGraalVMについて、自分なりに整理してみます

公式情報を見てみる

とりあえず、まず公式情報。

GraalVM

f:id:fuji-tak:20200601001755p:plain

トップで謳われているのは

  • アプリケーションのスループットを増して、レイテンシは減るよ
  • アプリケーションを、必要なものが揃った(完パケの)ネイティブバイナリーにコンパイルするよ
  • 複数の言語やライブラリをシームレスに扱えるよ

という話ですね。この辺が大きい特徴なのかな。

f:id:fuji-tak:20200601004441p:plain

もうちょっと、Key Featuresも見てみると、さっきと大きく変わらないけど、AOTコンパイルはさっきは無かったワードなのかな。

この先の、詳細な英語ドキュメントを初心者のうちから読むパワーはなかったので、雰囲気だけ抑えて、これ以降はいろんな日本語記事を見て理解したことをまとめます。

特徴

GraalVMの2つの特徴について。

  • Polyglot
  • Native
Polyglot

多言語を混ぜて使えるよ、という話。

Java, JavaScript (Node.js), Ruby, Python, C++, R あたりが使える。

んで、JavaからJavaScriptのコードを参照、みたいなことができる。すごい。

公式のデモはこちら

Native

Key FeaturesにあったAOTコンパイル(Ahead-Of-Time, 事前コンパイル)によって、ネイティブで動作する、スタンドアローンなバイナリを作ることができます。

なおAOTコンパイル自体はJava9から導入されたもので、別にGraalVMの専売特許ではない。

いわゆる普通のコンパイルは、JITコンパイル(Just-In-Time, 実行時コンパイル)。GraalVMはJITコンパイルもできます。

バイナリのもうちょっと詳しい話は後述。

中核技術

GraalVMは、普通のJVMの発展版のようなもので、普通のJVMにできることは全部できる(はず)。

普通のJVMとは違う、GraalVMの中核技術には以下の3つが挙げられます。

  • Graal
  • Truffle
  • GraalVM Native Image
Graal

普通のJVMがこんな感じになっているのに対して

用語の説明 10
HotSpot VM
Compiler Interface
C1 (Client) C2 (Server)
• HotSpotVM
C++
← JIT Compiler
階層型コンパイラ
実行中にC1/C2両方使う

(画像はこちらの10枚目)

GraalVMはこう

用語の説明 12
HotSpot VM
Compiler Interface
C1 (Client) Graal
• Graal
–Javaで書かれたJITコンパイラ
C++
← JIT Compiler
C2の代わりにGraalを
JVMCI...

(画像はこちらの12枚目)

HotSpot VMをベースにしているのは同じで、C2コンパイラGraalに置き換わっています。

Graal ≠ GraalVM で、Graal自体は、Java製のJITコンパイラのこと。Java10以降のOpenJDKで使えるらしい。(JEP 317

Truffle

Truffleは言語実装用のフレームワーク

この人のおかげで、GraalVMは複数の言語を動かすことができる。また、独自言語の実装もできる。

GraalVM Native Image

Nativeの項でも書いたとおり、GraalVMはネイティブで動作するバイナリ(Native Image)を作ることができます。

それの何が嬉しいかというと、Native Imageは仮想マシン上(JITコンパイル)ではなくネイティブで動くので、「起動が早くなる」「JVM言語のメモリ使用量が減る」などのメリットがあります。

逆に、OSの差異を吸収してくれるなどのJITコンパイルのメリットは得られなくなる。また、リフレクションや動的プロキシを使う場合には追加の作業が必要になるようです。

まとめ

複数の言語をまたいで、それぞれのライブラリなんかの資産を活用できるっていうのはすごく便利そうなので、動かしてみたいと思いました。(小学生並みの感想)

今回ほとんど触れられなかった速度に関しては、別に速くない、むしろ遅いっていう話もあるようだけど、その辺は今後に期待みたいな感じですかね。

参考文献

tech.uzabase.com

www.slideshare.net

www.slideshare.net

nowokay.hatenablog.com

www.publickey1.jp

Javaの新JITコンパイラ、Graalを解説 - InfoQ Javaの新JITコンパイラ、Graalを解説