GraalVMってなんぞや (original) (raw)
この広告は、90日以上更新していないブログに表示しています。
名前は聞くけどよくわかってないGraalVM
について、自分なりに整理してみます
公式情報を見てみる
とりあえず、まず公式情報。
トップで謳われているのは
という話ですね。この辺が大きい特徴なのかな。
もうちょっと、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枚目)
GraalVMはこう
(画像はこちらの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コンパイルのメリットは得られなくなる。また、リフレクションや動的プロキシを使う場合には追加の作業が必要になるようです。
まとめ
複数の言語をまたいで、それぞれのライブラリなんかの資産を活用できるっていうのはすごく便利そうなので、動かしてみたいと思いました。(小学生並みの感想)
今回ほとんど触れられなかった速度に関しては、別に速くない、むしろ遅いっていう話もあるようだけど、その辺は今後に期待みたいな感じですかね。
参考文献
Javaの新JITコンパイラ、Graalを解説 - InfoQJavaの新JITコンパイラ、Graalを解説