Oracle Code One 2019速報レポート

第2回 Oracleの汎用仮想マシン「GraalVM」の現状と課題[c1jp]

この記事を読むのに必要な時間:およそ 2 分

2019年9月16~19日にかけての4日間,米サンフランシスコのMoscone CenterにおいてOracle主催の技術カンファレンス「Oracle Code One 2019」が開催されました。Oracle Code Oneは2年前までは「JavaOne」の名称で開催されていたもので,Javaを中心とした開発者向けのセッションやブース展示,交流会などが行われる年次イベントです。

今年のCode Oneで話題の中心となっていたのは,2018年にOracleがリリースしたGraalVMです。GraalVMは,Java仮想マシン(以下,JVM)およびJIT(Just-in-Time)/AOT(Ahead-of-Time)コンパイラの技術を利用して作成された多言語対応の汎用仮想マシンです。昨年のCode Oneレポートでも【Oracle Code Oneレポート】Oracleが開発中の仮想マシン「GraalVM」で何ができるかとしてその活用方法や具体的な事例などを紹介しましたが,それから1年経ち,いまやJavaの未来を左右すると言えるほどまでにその存在感を増してきています。

Community EditionとEnterprise Edition

GraalVMはOracleのプロダクトであり,Community Edition(CE)とEnterprise Edition(EE)の2種類が用意されています。CEの方はGitHubにソースコードが公開されており,無償で利用することができます。EEの方は有償ですが,CEに比べて高性能でメモリフットプリントが小さいなどといった強みがあるほか,GraalVMチームによる直接のサポートも提供されます。

なお,Oracle Cloud Infrastructure(OCI)のユーザはGraalVM EEを追加料金無しで利用できます。これには,先日スタートしたOCIの一部機能を無償で利用できるOracle Cloud Free Tierのユーザも含まれるとのことです。

GraalVMに期待されているおもな役割

GraalVMが何をするためのツールなのかを一言で説明するのは少し大変です。昨年のレポートでも説明しているように,GraalVM自身は複数の技術要素を組み合わせて構成されており,実にさまざまな活用方法が考えられるからです。GraalVMのプロジェクトリードを務めるOracleのThomas Wuerthinger氏は,プロジェクトのゴールとして次の4つの要素を挙げています。

  1. あらゆる言語のための高性能な抽象化層を提供する
  2. JVMベース言語用の低フットプリントなAhead-of-Timeモードを実現する
  3. 言語の相互運用性を高める多言語ツールを提供する
  4. プログラムをネイティブ環境にシンプルに組み込めるようにする

GraalVM Project Leadの
Thomas Wuerthinger氏

GraalVM Project LeadのThomas Wuerthinger氏

もう少し噛み砕いて説明すると,現在GraalVMに期待されているおもな役割は,大きく3つに分けることができます。

1つは高性能なJITコンパイラを持つ多言語対応の実行環境です。GraalVMには「Truffle」と呼ばれる任意のプログラミング言語のインタプリタを実装するためのフレームワークが含まれており,これによって,JavaやJVM言語(ScalaやKotlinのようなもともとJVMで動作するように作られた言語)以外の言語も,JVM上で動作するように実装できます。現在,Truffleを利用してJavaScriptやRubyといった主要な言語のインタプリタの実装が進められているところです。

JITコンパイラは,JVM標準のHotSpotに代わって,⁠Graal」と呼ばれる独自のJITコンパイラが搭載されています。GraalはTruffleの生成するASTを高いパフォーマンスで実行できるように設計されているため,この2つを組み合わせることで,理想的にはあらゆる言語を高性能なJIT環境上で動かすことができるというわけです。

オープンソースで開発されているGraalVM関連ツールのコード量

オープンソースで開発されているGraalVM関連ツールのコード量

GraalVMに求められる2つ目の大きな役割が,複数のプログラミング言語を容易に相互運用できるようにすることです。GraalVMでは,Javaプログラム内で他の言語のコードを実行したり,逆に他の言語からJavaのオブジェクトを呼び出したりすることができるライブラリが提供されます。これによって,さまざまな言語の良い部分を組み合わせた実装を考えることができます。

JavaプログラムからJavaScriptコードを実行する例

JavaプログラムからJavaScriptコードを実行する例

JavaScriptからJavaオブジェクトの呼び出しやRのコードの実行を行う例

JavaScriptからJavaオブジェクトの呼び出しやRのコードの実行を行う例

3つ目に求められているのが,Javaプログラムのネイティブ実行ファイルの作成ツールとしての役割です。GraalVMには,Javaのプログラムを事前に特定の環境用のネイティブバイナリにコンパイルしておく,ネイティブイメージ作成ツールが用意されています。通常のJavaプログラムは,ソースコードからコンパイルして生成されたJavaバイトコードを実行時にJVMが読み込んで処理します。

これに対してネイティブイメージは,Javaバイトコードではなく実行可能なバイナリにコンパイルされたファイルになります。GraalVMのネイティブイメージはJVMがなくても実行でき,Javaクラスをロードして初期化する必要もないため,極めて高速に起動することができます。ネイティブイメージは,特にスタンドアロン型のアプリケーションを提供する場合や,マイクロサービスのようにインスタンスの起動と停止を頻繁に繰り返すような用途での活用が期待されています。

GraalVM対応フレームワークの起動時間の比較

GraalVM対応フレームワークの起動時間の比較

GraalVM対応フレームワークのメモリフットプリントの比較

GraalVM対応フレームワークのメモリフットプリントの比較

著者プロフィール

杉山貴章(すぎやまたかあき)

ONGS Inc.所属のプログラマ兼テクニカルライター。雑誌,書籍,Webメディアで多数の著作をもつ。

著書

バックナンバー

Oracle Code One 2019速報レポート