GraalVMの概要
GraalVMは、Javaおよび他のJVM言語で記述されたアプリケーションの実行を高速化すると同時に、JavaScript、Ruby、Pythonおよび他の多くの一般的な言語をサポートするように設計された高パフォーマンスのJDKディストリビューションです。GraalVMのポリグロット機能により、複数のプログラミング言語を単一のアプリケーションに混在させながら、外部言語のコール・コストをなくすことができます。
このページでは、GraalVMとそのランタイム・モードのアーキテクチャの概要、サポートされているプラットフォーム、使用可能なディストリビューション、コア機能と追加機能、および様々な機能のサポート・レベルを示します。
GraalVMのアーキテクチャ
GraalVMは、Javaで記述された高度なJust-in-Time (JIT)最適化コンパイラをHotSpot Java仮想マシンに追加します。
GraalVMの言語実装フレームワーク(Truffle)では、JavaおよびJVMベースの言語の実行に加えて、JavaScript、Ruby、Pythonおよび他の多くの一般的な言語をJVMで実行できるようになります。GraalVM Truffleを使用すると、Javaと他のサポートされている言語は、直接相互運用し、同じメモリー領域でデータをやり取りできます。
ランタイム・モード
GraalVMのランタイム環境としての独自性は、JVMランタイム・モード、ネイティブ・イメージ、Java on Truffleなどの複数の操作モードを提供していることにあります(同じJavaアプリケーションをいずれでも実行できます)。
JVMランタイム・モード
HotSpot JVMでプログラムを実行するとき、GraalVMはデフォルトでGraalVMコンパイラを最上位層のJITコンパイラとして設定します。実行時に、アプリケーションはJVMに通常どおりロードされ、実行されます。JVMは、Javaまたはその他のJVMのネイティブ言語のバイトコードをコンパイラに渡し、コンパイラはそれをマシン・コードにコンパイルしてJVMに返します。Truffleフレームワーク上に記述されたサポートされている言語のインタプリタは、それ自体がJVMで実行されるJavaプログラムです。
ネイティブ・イメージ
ネイティブ・イメージは、Javaコードをスタンドアロン・ネイティブ実行可能ファイルまたはネイティブ共有ライブラリにコンパイルする革新的なテクノロジです。ネイティブ実行可能ファイルのビルド中に処理されるJavaバイトコードには、すべてのアプリケーション・クラス、依存性、サードパーティ依存ライブラリおよび必要なJDKクラスが含まれています。生成される自己完結型のネイティブ実行可能ファイルは、JVMを必要としない個々のオペレーティング・システムおよびマシン・アーキテクチャに固有のものです。
Java on Truffle
Java on Truffleは、Truffle言語実装フレームワークを使用してビルドされたJava仮想マシン仕様の実装です。これは、VMのすべてのコア・コンポーネントを含み、Java Runtime Environmentライブラリと同じAPIを実装し、GraalVMのすべてのJARおよびネイティブ・ライブラリを再利用する、完全なJava VMです。Java on TruffleはGraalVMの試験段階のテクノロジで、バージョン21.0.0から使用可能です。
使用可能なディストリビューション
GraalVMは、GraalVM CommunityおよびGraalVM Enterpriseエディションとして使用でき、Java 8、Java 11およびJava 16のサポートが含まれています。GraalVM EnterpriseはOracle JDKをベースにし、GraalVM CommunityはOpenJDKをベースにしています。
GraalVMは、x86 64ビット・システムのLinux、macOSおよびWindowsプラットフォーム、およびARM 64ビット・システムのLinuxで使用できます。Oracle JDK 17をベースにしたGraalVMディストリビューションは試験段階であり、いくつかの既知の制限があります。プラットフォームに応じて、ディストリビューションは.tar.gzまたは.zipアーカイブとして提供されます。インストール手順については、スタート・ガイドを参照してください。
ディストリビューション・コンポーネント・リスト
GraalVMは、コア・コンポーネントと追加コンポーネントで構成されています。コア・コンポーネントにより、JVMベースの言語で記述されたプログラムまたは埋込み可能なポリグロット・アプリケーションのランタイム・プラットフォームとしてGraalVMを使用できます。
コア・コンポーネント
ランタイム
- Java HotSpot VM
- JavaScriptランタイム
- LLVMランタイム
ライブラリ(JARファイル)
- GraalVMコンパイラ - 最上位JITコンパイラ
- ポリグロットAPI - 共有ランタイムでプログラミング言語を組み合せるためのAPI
ユーティリティ
- JavaScriptインタプリタを使用したJavaScript REPL
- LLVMビットコードからプログラムを直接実行するための
lli
ツール - 追加機能をインストールするためのGraalVMアップデータ
追加コンポーネント
GraalVMコア・インストールは、他の言語ランタイムおよびユーティリティで拡張できます。
ツール/ユーティリティ:
- ネイティブ・イメージ - アプリケーションを事前にネイティブ実行可能ファイルにコンパイルするテクノロジ。
- LLVMツールチェーン - GraalVMランタイムで実行可能なビットコードにネイティブ・プログラムをコンパイルするための一連のツールおよびAPI。
- Java on Truffle – Javaバイトコード・インタプリタを介してJavaを実行するためにTruffleフレームワーク上にビルドされたJVM実装。
ランタイム:
- Node.js - JavaScriptのNode.js 14.17.6ランタイム
- Python - Python 3.8.5互換
- Ruby - Ruby 2.7.3互換
- R - GNU R 4.0.3互換
- GraalWasm - WebAssembly (Wasm)
ライセンスおよびサポート
GraalVM Community Editionは、GitHub上で使用可能なソースからビルドされたオープン・ソース・ソフトウェアであり、GNU General Public Licenseバージョン2+クラスパス例外に基づいて配布されます(Javaの条項と同じ)。個々のGraalVMコンポーネントのライセンスを確認してください。これは通常、特定の言語のライセンスから派生しますが、異なる場合もあります。GraalVM Communityは、付帯条件なしで、あらゆる目的で自由に使用できますが、保証もサポートもされません。
機能のサポート
GraalVMテクノロジは、本番対応および試験段階として配布されます。
試験段階の機能は将来のGraalVMバージョンに対して検討中のものであり、本番での使用は意図されていません。開発チームは試験段階の機能に関するフィードバックを歓迎しますが、試験段階の機能は最終版には含められない可能性があること、および本番対応と判断される前に大幅な変更が加えられる可能性があることに注意してください。
次の表に、GraalVM Community Edition 21の本番対応機能および試験段階の機能をプラットフォーム別に示します。
機能 | Linux AMD64 | Linux ARM64 | macOS | Windows |
---|---|---|---|---|
ネイティブ・イメージ | 安定 | 安定 | 安定 | 安定 |
LLVMランタイム | 安定 | 安定 | 安定 | 使用不可 |
LLVMツールチェーン | 安定 | 安定 | 安定 | 使用不可 |
JavaScript | 安定 | 安定 | 安定 | 安定 |
Node.js | 安定 | 安定 | 安定 | 安定 |
Java on Truffle | 試験段階 | 試験段階 | 試験段階 | 試験段階 |
Python | 試験段階 | 使用不可 | 試験段階 | 使用不可 |
Ruby | 試験段階 | 試験段階 | 試験段階 | 使用不可 |
R | 試験段階 | 使用不可 | 試験段階 | 使用不可 |
WebAssembly | 試験段階 | 試験段階 | 試験段階 | 試験段階 |
次に読むもの
GraalVMを初めて使用する場合、または使用経験がほとんどない場合は、GraalVMのスタート・ガイドに進んでください。GraalVMをローカル・マシンにインストールして、ガイドに記載されている例を実行してみるか、ワークロードを使用してGraalVMをテストします。その後、より複雑なGitHub上のGraalVMデモを参照することをお薦めします。
GraalVMがすでにインストールされている、または使用経験のある開発者は、スタート・ガイドをスキップして、GraalVMテクノロジの詳細を確認するためにリファレンス・マニュアルに進むことができます。
GraalVMポリグロットAPIを使用してコーディングを開始するには、『GraalVM SDK Java API Reference』を参照してください。
入手可能なドキュメントで必要な答えが見つからない場合、またはトラブルシューティングについて問い合せる場合は、スラック・チャネルでヘルプを要求するか、GitHubの問題を送信できます。