GraalVMが1.0.0 RC1を出し、公式サイトを公開しました!
日本の技術ブログメディアPublickeyさんも取り上げておられます。
そのこともあって、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を実現できているのです。
Graalと別で、言語実装用フレームワークであるASTインタプリタTruffleがあります。GraalはTruffleのASTを解釈し、Polyglotであっても高いパフォーマンスを出すことができます。そのため、GraalVM上の各言語はTruffleを使って実装されています。
JavaScriptやR、RubyはGraal.jsやFastR、TruffleRubyという名前でTruffleを使った実装があります。
FastRのdescriptionに"An alternative implementation of the R language, based on the Truffle framework."とあるとおりです。
現時点ではJavaScriptのみが公式に利用できる言語で、RやRuby、Pythonなどはexperimentalです。
私もTruffleを使って実際に言語を実装しました!四則演算するだけの単純な言語ですが…Truffleはまだドキュメントがあまりなく、Javadocと他の言語実装を見るしかありません。
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のソースコードを読んで、このブログに書き残しています。
今回はここまで。