ポリグロット・ネイティブ実行可能ファイル(JavaおよびJavaScript)のビルド
GraalVMポリグロットAPIを使用すると、Javaベースのホスト・アプリケーションにゲスト言語のコードを埋め込んで実行できます。GraalVMを使用すると、JavaScriptが埋め込まれたJavaアプリケーションを事前にコンパイルして、ポリグロット・ネイティブ実行可能ファイルを作成できます。Javaホスト・アプリケーションがJavaScriptなどのゲスト言語と対話する方法の詳細は、言語の埋込みのドキュメントを参照してください。
このガイドでは、Javaをホスト言語、JavaScriptをゲスト言語とするポリグロット・ネイティブ実行可能ファイルをビルドする方法を示します。
デモ部分では、単純なJSON Pretty Printer Javaアプリケーションを使用して、JSON形式で出力します。
-
GraalVM JDKがインストール済であることを確認します。最も簡単に始めるには、SDKMAN!を使用します。その他のインストール・オプションについては、「ダウンロード」セクションを参照してください。
-
Mavenプロジェクトを作成し、デフォルトのApplication.javaファイルをPrettyPrintJSON.javaという名前のファイルに置き換えます。次のコンテンツをコピーしてファイルに貼り付けます。
import java.io.*; import java.util.stream.*; import org.graalvm.polyglot.*; public class PrettyPrintJSON { public static void main(String[] args) throws java.io.IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String input = reader.lines() .collect(Collectors.joining(System.lineSeparator())); try (Context context = Context.create("js")) { Value parse = context.eval("js", "JSON.parse"); Value stringify = context.eval("js", "JSON.stringify"); Value result = stringify.execute(parse.execute(input), null, 2); System.out.println(result.asString()); } } }
-
プロジェクト構成ファイル(この場合はpom.xml)を開き、次の依存関係を追加してJavaScriptとの相互運用性を有効にします。
- ポリグロット・ランタイムを有効にするには:
<dependency> <groupId>org.graalvm.polyglot</groupId> <artifactId>polyglot</artifactId> <version>${graalvm.version}</version> </dependency>
- Javascriptを有効にするには:
<dependency> <groupId>org.graalvm.polyglot</groupId> <artifactId>js</artifactId> <version>${graalvm.version}</version> </dependency>
- ポリグロット・ランタイムを有効にするには:
- GraalVM JDKを使用してプロジェクトをコンパイルします:
./mvnw clean package
-
ネイティブ実行可能ファイルをビルドします:
native-image PrettyPrintJSON
実行可能ファイルをビルドするだけでなく、JavaScriptエンジンもプルするため、数分かかります。JavaScriptコンテキストは、生成されたイメージで使用できます。
ノート: ポリグロット・ネイティブ実行可能ファイルをビルドする場合、Truffleフレームワークが含まれているため、より多くの物理メモリーが必要です。
-
生成された実行可能ファイルを実行し、いくつかの整形出力を実行します:
./prettyprintjson <<EOF {"GraalVM":{"description":"Language Abstraction Platform","supports":["combining languages","embedding languages","creating native images"],"languages": ["Java","JavaScript","Node.js", "Python", "Ruby","R","LLVM"]}} EOF
予想される出力は次のとおりです。
{ "GraalVM": { "description": "Language Abstraction Platform", "supports": [ "combining languages", "embedding languages", "creating native images" ], "languages": [ "Java", "JavaScript", "Node.js", "Python", "Ruby", "R", "LLVM" ] } }
ネイティブ実行可能ファイル・バージョンは、JVMで同じアプリケーションを実行するよりも高速に実行されます。
ノート: GraalVMネイティブ・イメージによるJavaScriptサポートは、一般提供とみなされています。残りの言語サポートは試験段階です。