ポリグロット・ネイティブ実行可能ファイル(JavaおよびJavaScript)のビルド

GraalVMポリグロットAPIを使用すると、Javaベースのホスト・アプリケーションにゲスト言語のコードを埋め込んで実行できます。GraalVMを使用すると、JavaScriptが埋め込まれたJavaアプリケーションを事前にコンパイルして、ポリグロット・ネイティブ実行可能ファイルを作成できます。Javaホスト・アプリケーションがJavaScriptなどのゲスト言語と対話する方法の詳細は、言語の埋込みのドキュメントを参照してください。

このガイドでは、Javaをホスト言語、JavaScriptをゲスト言語とするポリグロット・ネイティブ実行可能ファイルをビルドする方法を示します。

デモ部分では、単純なJSON Pretty Printer Javaアプリケーションを使用して、JSON形式で出力します。

  1. GraalVM JDKがインストール済であることを確認します。最も簡単に始めるには、SDKMAN!を使用します。その他のインストール・オプションについては、「ダウンロード」セクションを参照してください。

  2. 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());
         }
       }
     } 
    
  3. プロジェクト構成ファイル(この場合は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>
      
  4. GraalVM JDKを使用してプロジェクトをコンパイルします:
     ./mvnw clean package
    
  5. ネイティブ実行可能ファイルをビルドします:

     native-image PrettyPrintJSON
    

    実行可能ファイルをビルドするだけでなく、JavaScriptエンジンもプルするため、数分かかります。JavaScriptコンテキストは、生成されたイメージで使用できます。

    ノート: ポリグロット・ネイティブ実行可能ファイルをビルドする場合、Truffleフレームワークが含まれているため、より多くの物理メモリーが必要です。

  6. 生成された実行可能ファイルを実行し、いくつかの整形出力を実行します:

     ./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サポートは、一般提供とみなされています。残りの言語サポートは試験段階です。