Oracle GraalVM Enterprise Editionスタート・ガイド

ここでは、GraalVM Enterpriseのダウンロードとインストール、基本的なアプリケーションの実行、および付随する機能のサポートの追加について説明します。さらに、GraalVM Enterpriseのポリグロット機能について学習し、JVMベースのアプリケーションのプラットフォーム固有のネイティブ実行可能ファイルをビルドする方法を確認します。

GraalVM Enterpriseを初めて使用する場合、または使用経験がほとんどない場合は、GraalVM Enterpriseの概要ページから始めることをお薦めします。ここには、GraalVM Enterpriseのアーキテクチャ、入手可能なディストリビューション、サポートされているプラットフォーム、ライセンスとサポート、コアと追加機能などに関する情報があります。

GraalVM Enterpriseがすでにインストールされ、使用経験がある場合は、このスタート・ガイドをスキップして、詳細なリファレンス・マニュアルに進むことができます。

GraalVM Enterpriseのダウンロード

Oracle GraalVM Enterprise Editionを取得するには、次の方法があります:

GraalVM Enterpriseのインストール

オペレーティング・システムを選択し、特定のプラットフォームのインストール・ステップに進みます:

アプリケーションの実行

GraalVMのコア・ディストリビューションには、JVMおよびGraalVMコンパイラが含まれます。GraalVMをインストールすると、すでにどのJavaアプリケーションでも変更せずに実行できます。

その他の言語サポートは、gu (GraalVMアップデータ・ツール)を使用して追加言語のランタイムおよびユーティリティをインストールすることで、リクエストに応じてインストールできます。さらに、次に、JavaScript、Node.js、LLVM、Ruby、R、PythonおよびWebAssemblyなど、オプションで使用可能な他のGraalVMランタイムを追加する方法についても説明します。

様々な言語のランタイム

Java

javaランチャは、GraalVMデフォルト・コンパイラ(Graal)を使用してJVMを実行します。インストール時にJavaバージョンを確認します:

$JAVA_HOME/bin/java -version

この典型的なHelloWorldクラスを次に示します:

public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello, World!");
  }
}

次のコマンドを実行してこのクラスをバイトコードにコンパイルし、実行します:

javac HelloWorld.java
java HelloWorld
Hello World!

GitHub上のGraalVMデモには、より大規模なJavaの例が数多くあります。GraalVMコンパイラの詳細は、Graalコンパイラを参照してください。Javaの実行の詳細は、JVM言語を参照してください。

JavaScriptおよびNode.js

GraalVMでは、JavaScriptアプリケーションの実行がサポートされています。JavaScriptランタイムはオプションで使用可能であり、次のコマンドを使用してインストールできます:

gu install js

jsランチャが$JAVA_HOME/binにインストールされます。JavaScriptランタイムがインストールされている場合、REPLモードと、スクリプト・ファイルを直接実行する方法の両方で、プレーンJavaScriptコードを実行できます:

$JAVA_HOME/bin/js
> 1 + 2
3

GraalVMでは、Node.jsアプリケーションの実行もサポートされます。Node.jsサポートはデフォルトではインストールされませんが、次のコマンドを使用して簡単に追加できます:

gu install nodejs

nodeランチャとnpmランチャの両方が$JAVA_HOME/binディレクトリで使用可能になります。

$JAVA_HOME/bin/node -v
$JAVA_HOME/bin/npm show <package name> version

100,000を超えるnpmパッケージが定期的にテストされ、express、react、async、request、browserify、grunt、mocha、underscoreなどのモジュールを含むGraalVM Enterpriseと互換性があります。Node.jsモジュールをインストールするには、<graalvm>/binフォルダにあるnpm実行可能ファイルを使用します。これは、nodeとともにインストールされます。npmコマンドは、デフォルトのNode.jsコマンドと同等で、すべてのNode.js APIをサポートします。

npm installを使用して、モジュールcolorsansispan、およびexpressをインストールします。インストールしたモジュールは、アプリケーションから使用できます。

$JAVA_HOME/bin/npm install colors ansispan express

次のコード・スニペットを使用して、Node.jsモジュールをインストールしたディレクトリにapp.jsファイルとして保存します:

const http = require("http");
const span = require("ansispan");
require("colors");

http.createServer(function (request, response) {
    response.writeHead(200, {"Content-Type": "text/html"});
    response.end(span("Hello Graal.js!".green));
}).listen(8000, function() { console.log("Graal.js server running at http://127.0.0.1:8000/".red); });

setTimeout(function() { console.log("DONE!"); process.exit(); }, 2000);

nodeコマンドを使用して、GraalVM Enterpriseでapp.jsを実行します:

$JAVA_HOME/bin/node app.js

Node.jsとの互換性に関する詳細なドキュメントおよび情報は、JavaScriptおよびNode.jsを参照してください。

LLVM言語

GraalVM LLVMランタイムは、C/C++、Rust、およびLLVMビットコードにコンパイル可能なその他のプログラミング言語を実行できます。

LLVMランタイムはオプションで使用可能であり、次のコマンドを使用してインストールできます:

$JAVA_HOME/bin/gu install llvm

lliのGraalVM実装が$JAVA_HOME/binディレクトリにインストールされます。インストール時にバージョンを確認します:

$JAVA_HOME/bin/lli --version

LLVMランタイムをインストールすると、LLVMビットコード形式のプログラムをGraalVMで実行できます。ネイティブ・プログラムをLLVMビットコードにコンパイルするには、一部のLLVMフロントエンド(clangなど)を使用します。

LLVMランタイムの他に、GraalVMには、次のように設定できるLLVMフロントエンド(ツールチェーン)も用意されています:

gu install llvm-toolchain
export LLVM_TOOLCHAIN=$(lli --print-toolchain-path)

その後、C/C++コードは、GraalVMに付属のclangを使用してLLVMビットコードにコンパイルできます。たとえば、次のCコードをhello.cという名前のファイルに入れます:

#include <stdio.h>

int main() {
    printf("Hello from GraalVM!\n");
    return 0;
}

LLVMビットコードが埋め込まれた実行可能ファイルhellohello.cをコンパイルし、実行します:

$LLVM_TOOLCHAIN/clang hello.c -o hello
lli hello

詳細なドキュメントおよびGraalVM EnterpriseでのLLVMビットコードの実行例は、LLVM言語を参照してください。

Python

GraalVMを使用すると、Python 3ランタイム環境でPythonアプリケーションを実行できます。このサポートはデフォルトでは使用できませんが、次のコマンドを使用してGraalVMに簡単に追加できます:

gu install python

graalpyランチャをインストールします。バージョンを確認すると、Pythonプログラムをすでに実行できます:

$JAVA_HOME/bin/graalpy --version
$JAVA_HOME/bin/graalpy
...
>>> 1 + 2
3
>>> exit()

GraalVMでのPythonサポートのその他の例および詳細は、Pythonのリファレンス・マニュアルを参照してください。

Ruby

GraalVMは、RubyGemsやRuby Bundlerなどとの対話を可能にするgemコマンドを含む、高パフォーマンスのRubyランタイム環境を提供します。Rubyランタイムは、デフォルトではGraalVMで使用できませんが、次のコマンドを使用して簡単に追加できます:

gu install ruby

インストールすると、rubygemirbrakerdocriなどのRubyランチャでRubyプログラムを実行できるようになります:

$JAVA_HOME/bin/ruby [options] program.rb

Ruby用のGraalVMランタイムでは、Rubyの標準実装と同じオプションが使用されますが、いくつかの追加があります。たとえば:

gem install chunky_png
$JAVA_HOME/bin/ruby -r chunky_png -e "puts ChunkyPNG::Color.to_hex(ChunkyPNG::Color('mintcream @ 0.5'))"
#f5fffa80

その他の例および詳細なドキュメントは、Rubyのリファレンス・マニュアルを参照してください。

R

GraalVMは、Rプログラムを直接またはREPLモードで実行するためのGNU互換環境を提供します。R言語のサポートはデフォルトでは使用できませんが、次のコマンドを使用してGraalVMに追加できます:

gu install R

言語がインストールされたら、Rスクリプトを実行してR REPLを使用できます:

$JAVA_HOME/bin/R
...

> 1 + 1
[1] 2

その他の例および詳細なドキュメントは、Rのリファレンス・マニュアルを参照してください。

WebAssembly

GraalVMを使用すると、WebAssemblyにコンパイルされたプログラムを実行できます。このサポートはデフォルトでは使用できませんが、次のコマンドを使用してGraalVMに追加できます:

gu install wasm

その後、コンパイルされたWebAssemblyバイナリ・コードを実行できるwasmランチャが使用可能になります。

たとえば、floyd.cという名前のファイルに次のCプログラムを入れます:

#include <stdio.h>

int main() {
  int number = 1;
  int rows = 10;
  for (int i = 1; i <= rows; i++) {
    for (int j = 1; j <= i; j++) {
      printf("%d ", number);
      ++number;
    }
    printf(".\n");
  }
  return 0;
}

最新のEmscriptenコンパイラのフロントエンド・バージョンを使用してコンパイルします。現在の作業ディレクトリにスタンドアロンfloyd.wasmファイルが生成されます:

emcc -o floyd.wasm floyd.c

次に、コンパイルしたWebAssemblyバイナリをGraalVMで次のように実行できます:

$JAVA_HOME/bin/wasm --Builtins=wasi_snapshot_preview1 floyd.wasm

詳細は、WebAssemblyのリファレンス・マニュアルを参照してください。

ネイティブ・イメージ

GraalVM Enterpriseを使用すると、Javaバイトコードをプラットフォーム固有の自己完結型のネイティブ実行可能ファイルにコンパイルして、アプリケーションの起動を高速化し、フットプリントを縮小できます。

ネイティブ・イメージ機能はデフォルトでは使用できませんが、GraalVMアップデータ・ツールを使用して簡単にインストールできます:

gu install native-image

前述のHelloWorldの例を使用して、ネイティブ実行可能ファイルの生成方法を示します:

public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello, World!");
  }
}

ノート: コンパイルについては、native-imageはローカル・ツールチェーンに依存します。システムが前提条件を満たしていることを確認します。

HelloWorld.javaをバイトコードにコンパイルし、ネイティブ実行可能ファイルをビルドします:

javac HelloWorld.java
native-image HelloWorld

最後のコマンドは、現在の作業ディレクトリにhelloworldという名前の実行可能ファイルを生成します。これを呼び出すと、ネイティブにコンパイルされたHelloWorldクラスのコードが次のように実行されます:

./helloworld
Hello, World!

この革新的なテクノロジの詳細は、ネイティブ・イメージのリファレンス・マニュアルを参照してください。

言語の結合

GraalVM Enterpriseでは、あるプログラミング言語を別のプログラミング言語からコールし、それらの間でデータを交換できます。相互運用性を有効にするために、GraalVM Enterpriseには--polyglotフラグが用意されています。

たとえば、js --jvm --polyglot example.jsを実行すると、example.jsがポリグロット・コンテキストで実行されます。プログラムがサポートされている他の言語のコードをコールすると、GraalVM Enterpriseはexample.jsアプリケーションと同じランタイムでそのコードを実行します。多言語アプリケーションの実行の詳細は、「ポリグロット・プログラミング」を参照してください。

新規ユーザー

このガイドは、主にGraalVM Enterpriseを初めて使用するユーザー、またはGraalVM Enterpriseに関する知識はあるが使用経験がほとんどないユーザーを対象としているため、より複雑なサンプル・アプリケーションを調べることを検討してください。

Oracle Cloudユーザー

クラウド・ワークロードにGraalVM Enterpriseを検討しているOracle Cloudユーザーは、OCIでのGraalVM Enterpriseを参照することをお薦めします。このページでは、Oracle Cloud Infrastructure仮想マシン・コンピュート・インスタンスでのGraalVM Enterpriseの使用に焦点を当てています。

上級ユーザー

特定の言語のGraalVM Enterpriseサポートに主に関心がある場合、またはGraalVM Enterpriseの様々な機能のより詳細な情報が必要な場合は、リファレンス・マニュアルを参照してください。

GraalVM Enterpriseが提供するツールのサポートを探している場合は、デバッグおよびモニタリング・ツールに進んでください。

GraalVM Enterpriseを将来の言語またはツール実装のプラットフォームとして検討している場合は、「プラットフォームとしてのGraalVM Enterprise」に移動してください。

GraalVM Enterpriseのセキュリティ・モデルの詳細は「セキュリティ・ガイド」、リッチAPIドキュメントは「GraalVM SDK Javadoc」を参照してください。