ストックJDKでのGraalVM JavaScriptの実行

GraalVM JavaScriptは、GraalVMの一部として、またはGraalVMでビルドされた埋込みシナリオでの実行に最適化されています。これにより、最適化コンパイラとしてGraalVMコンパイラを使用し、場合によってはネイティブ・イメージを使用してエンジンをネイティブ・バイナリに事前にコンパイルすることで、可能な最善のパフォーマンスが保証されます。

GraalVM JavaScriptはJavaアプリケーションであるため、OpenJDKなどのストックJava VMで実行できます。Graalコンパイラを使用しないで実行すると、JavaScriptのパフォーマンスは大幅に低下します。ストックJVMで使用可能なJITコンパイラは、GraalVM JavaScriptコードベースを実行およびJITコンパイルできますが、可能な最大限のパフォーマンスを引き出すように最適化することはできません。このドキュメントでは、ストックJava VMでGraalVM JavaScriptを実行する方法について説明し、どのようにGraalVMコンパイラをJITコンパイラとして使用して可能な最善のパフォーマンスを保証できるかを示します。

Maven CentralでのGraalVM JavaScript

GraalVM JavaScriptはオープン・ソースであり、コミュニティによってMaven Centralリポジトリに定期的にプッシュされます。org.graalvm.polyglot:jsに、POMアーティファクトとして置かれています。

これには、Graalコンパイラを使用したJDK 21 (またはそれ以降)上のGraalVM JavaScriptのサンプルのMavenプロジェクトがあります:

基本的に、サンプルのpom.xmlファイルでは、JVMコンパイラ・インタフェース(JVMCI)をアクティブ化し、--module-pathおよび--upgrade-module-pathにそれを指定して、JITコンパイラがGraalVMコンパイラとなるように構成します。

ScriptEngine JSR 223

js-scriptengine.jarがモジュール・パスに含まれている場合は、ScriptEngineを介してGraalVM JavaScriptを起動できます。このエンジンにより、Graal.jsjsJavaScriptjavascriptなど、複数の異なる名前で登録されます。Nashornエンジンがモジュール・パスに存在する場合は、このエンジンもその名前で使用可能です。

ScriptEngineからGraalVM JavaScriptを起動するには、次のコードを使用できます:

new ScriptEngineManager().getEngineByName("Graal.js");

使用可能なすべてのエンジンをリストするには:

List<ScriptEngineFactory> engines = new ScriptEngineManager().getEngineFactories();
for (ScriptEngineFactory f : engines) {
    System.out.println(f.getLanguageName() + " " + f.getEngineName() + " " + f.getNames());
}

設定の検査 - GraalVMコンパイラがJITコンパイラとして使用されるか

--engine.TraceCompilationフラグは、JavaScriptメソッドがGraalVMコンパイラによってコンパイルされるたびにデバッグ出力を有効にします。実行時間が十分に長いJavaScriptソース・コードによってコンパイルがトリガーされ、ログ出力が行われます:

> function add(a,b) { return a+b; }; for (var i=0;i<1000*1000;i++) { add(i,i); }
[truffle] opt done         add <opt> <split-c0875dd>                                   |ASTSize       7/    7 |Time    99(  90+9   )ms |DirectCallNodes I    0/D    0 |GraalNodes    22/   71 |CodeSize          274 |CodeAddress 0x7f76e4c1fe10 |Source    <shell>:1:1