- JDK 23 用 GraalVM (最新)
- JDK 24 用 GraalVM (早期アクセス)
- JDK 21 用 GraalVM
- JDK 17 用 GraalVM
- アーカイブ
- 開発ビルド
GraalJS の互換性
GraalJS は、ECMAScript に準拠した JavaScript 言語ランタイムです。このドキュメントでは、JavaScript で記述されたユーザーアプリケーション向けに提供されるパブリック API について説明します。
ECMAScript 言語準拠 #
GraalJS は、ECMAScript (ECMA-262) 仕様を実装しており、ECMAScript 2024 仕様 (第 15 版とも呼ばれる) と完全に互換性があります。新しい機能は、ECMAScript 2024 の一部として確定すると、GraalVM に頻繁に追加されます。詳細については、CHANGELOG.md を参照してください。ECMAScript 5 以降の古いバージョンは、設定オプションで有効にできます (番号の場合: --js.ecmascript-version=5
、年の場合: --js.ecmascript-version=2024
)。実稼働環境では、GraalJS の将来のバージョンで利用可能になると、仕様の新しいバージョンを使用するため、使用する ECMAScript バージョンを固定することを検討してください。
GraalJS は、JavaScript コアライブラリを表す、ECMAScript で指定されているグローバルスコープに次の関数オブジェクトを提供します: Array、ArrayBuffer、Boolean、DataView、Date、Error、Function、JSON、Map、Math、Number、Object、Promise、Proxy、Reflect、RegExp、Set、SharedArrayBuffer、String、Symbol、TypedArray、WeakMap、WeakSet。
追加のオブジェクトは、たとえば、--js.temporal
のようにオプションで利用できます。利用可能なオプションのリストについては、js --help
を実行してください。
これらの関数オブジェクトのいくつか、およびそのメンバーの一部は、特定のバージョンの仕様が実行に選択されている場合にのみ利用可能です。提供されるメソッドのリストについては、ECMAScript 仕様を調べてください。仕様に対する拡張機能は以下に指定します。
国際化 API (ECMA-402) #
GraalJS には、デフォルトで有効になっている ECMA-402 国際化 API の実装が付属しています (次のオプションを使用して無効にできます: --js.intl-402=false
)。これには、次の拡張機能が含まれます。
Intl.Collator
Intl.DateTimeFormat
Intl.DisplayNames
Intl.ListFormat
Intl.Locale
Intl.NumberFormat
Intl.PluralRules
Intl.RelativeTimeFormat
Intl.Segmenter
toLocaleString
などの他のいくつかの組み込みの機能も、ECMA-402 仕様に従って更新されます。
JavaScript モジュール #
GraalJS は、ECMAScript 6 以降で定義されているモジュールをサポートしています。この機能のサポートは引き続き拡大していることに注意してください。最新のすべての機能については、必ず最新の ECMAScript バージョンを使用してください。
ポリグロットの Source
を介してモジュールをロードする場合、モジュールをロードしていることを指定するために、非公式の application/javascript+module
MIME タイプを使用できます。ファイルから JavaScript コードをロードする場合は、モジュールが * .mjs * 拡張子のファイルからロードされていることを確認してください。import
キーワードを使用したロードは、それによって制限されず、任意の拡張子のファイルから import
できます。
互換性拡張 #
GraalJS では、他の JavaScript エンジンとの互換性のために、次のオブジェクトとメソッドが利用可能です。このようなメソッドの動作は、既存のすべてのエンジンのメソッドのセマンティクスと厳密に一致しない場合があることに注意してください。
言語機能 #
条件付きキャッチ句
js.syntax-extensions
オプションが有効になっている場合、GraalJS は条件付きキャッチ句をサポートします。
try {
myMethod(); // can throw
} catch (e if e instanceof TypeError) {
print("TypeError caught");
} catch (e) {
print("another Error caught");
}
グローバルプロパティ #
load(source)
- 指定された JavaScript ソースコードをロード (解析および実行) します
ソースのタイプは次のいずれかです
- String: 実行するソースファイルのパスまたは URL。
java.lang.URL
:js.load-from-url
オプションがtrue
に設定されている場合、URL にソースコードの実行を問い合わせます。java.io.File
: ファイルを読み取ってソースコードを実行します。- JavaScript オブジェクト: オブジェクトに、それぞれソース名とコードを表す
name
プロパティとscript
プロパティが問い合わせられます。 - その他すべてのタイプ: ソースは String に変換されます。
load
はデフォルトで使用可能であり、js.load
オプションを false
に設定することで無効にできます。
print(...arg)
および printErr(...arg)
- 引数をコンソール (それぞれ
stdout
とstderr
) に出力します - 可能な限り、人間が読みやすい出力を提供します
print
および printErr
はデフォルトで使用可能であり、js.print
オプションを false
に設定することで無効にできます。
console
グローバルオブジェクトのメソッド
デバッグ目的でいくつかのメソッドを提供するグローバルな console
オブジェクトが提供されます。これらのメソッドは、他のエンジンで提供されるものと同様の機能を提供しようとしますが、同一の結果を保証するものではありません。
GraalJS が Node.js モードで実行されている場合 (たとえば、js
の代わりに node
実行可能ファイルが起動された場合)、これらのメソッドの動作が異なることに注意してください。Node.js は、代わりに使用される独自の実装を提供します。
console.log
,console.info
, およびconsole.debug
:print(...arg)
のエイリアスconsole.error
およびconsole.warn
:print
と同様ですが、エラー IO ストリームを使用しますconsole.assert(check, message)
:check
が偽の場合にmessage
を出力しますconsole.clear
: 可能であればコンソールウィンドウをクリアしますconsole.count()
およびconsole.countReset()
: 呼び出された回数をカウントして出力するか、このカウンターをリセットしますconsole.group
およびconsole.groupEnd
: コンソールへの後続の出力のインデントを増減しますconsole.time()
,console.timeLog()
, およびconsole.timeEnd()
: それぞれタイマーを開始し、タイマーがアクティブになっている時間を表示するか、時間を表示してタイマーを停止します
console
オブジェクトはデフォルトで使用可能であり、オプション js.console
を false
に設定することで無効にできます。
js
シェルの追加グローバル関数 #
quit(status)
- エンジンを終了し、指定されたステータスコードを返します
read(file)
file
のコンテンツを読み取ります
結果は String として返されます。
引数 file
のタイプは次のいずれかです
java.io.File
: ファイルが直接使用されます。- その他すべてのタイプ:
file
は String に変換され、ファイル名として解釈されます。
readbuffer(file)
read
関数と同様に、file
のコンテンツを読み取ります
結果は JavaScript の ArrayBuffer
オブジェクトとして返されます。
readline()
- 入力ストリームから 1 行の入力を読み取ります
結果は String として返されます。
Object #
Object.prototype.__defineGetter__(prop, func)
this
のprop
プロパティを getter 関数func
になるように定義します
この機能は、ほとんどの JavaScript エンジンで非推奨となっています。最近の ECMAScript バージョンでは、getter と setter が言語によってネイティブにサポートされています。
Object.prototype.__defineSetter__(prop, func)
this
のprop
プロパティを setter 関数func
になるように定義します
この機能は、ほとんどの JavaScript エンジンで非推奨となっています。最近の ECMAScript バージョンでは、getter と setter が言語によってネイティブにサポートされています。
Object.prototype.__lookupGetter__(prop)
__defineGetter__
で設定されたオブジェクトのプロパティprop
の getter 関数を返します
この機能は、ほとんどの JavaScript エンジンで非推奨となっています。最近の ECMAScript バージョンでは、getter と setter が言語によってネイティブにサポートされています。
Object.prototype.__lookupSetter__(prop)
__defineSetter__
で設定されたオブジェクトのプロパティprop
の setter 関数を返します
この機能は、ほとんどの JavaScript エンジンで非推奨となっています。最近の ECMAScript バージョンでは、getter と setter が言語によってネイティブにサポートされています。
Nashorn スクリプトモード #
GraalJS は、Nashorn エンジンによって提供されるものと互換性のあるスクリプトモードを提供します。これは、js.scripting
オプションで有効になります。--experimental-options
が設定されていることを確認してください
js --experimental-options --js.scripting=true
スクリプトモードでは、readFully、readLine、$ARG
、$ENV
、$EXEC
など、いくつかのプロパティと関数がグローバルオブジェクトに追加されます。
以前に Nashorn または Rhino エンジンを対象としたコードで使用できる移行ガイドがあります。
GraalJS 拡張 #
Graal オブジェクト #
Graal
オブジェクトは、グローバルオブジェクトのプロパティとして提供されます。これは、Graal 固有の情報を提供します。プロパティの存在は、GraalJS が現在の言語エンジンであるかどうかを識別するために使用できます
if (typeof Graal != 'undefined') {
print(Graal.versionECMAScript);
print(Graal.versionGraalVM);
print(Graal.isGraalRuntime());
}
Graal オブジェクトは、オプション (js.graal-builtin=false
) で無効にしない限り、デフォルトで GraalJS で使用可能です。
Graal.versionECMAScript
- GraalJS ECMAScript 互換モードのバージョン番号 (年値) を提供します
Graal.versionGraalVM
- 現在のエンジンが GraalVM で実行されている場合、GraalVM のバージョンを提供します
Graal.isGraalRuntime()
- GraalJS が GraalVM 対応ランタイムで実行されているかどうかを示します
true
の場合、ホットコードは Graal コンパイラによってコンパイルされ、高いピークパフォーマンスが得られます。false
の場合、GraalJS は Graal コンパイラによって最適化されず、通常はパフォーマンスが低下します。
Graal.setUnhandledPromiseRejectionHandler(handler)
#
- オプション (
js.unhandled-rejections=handler
) を使用する場合の、未処理の Promise リジェクトハンドラーを提供します。 - ハンドラーは、2 つの引数 (rejectionReason、unhandledPromise) で呼び出されます。
Graal.setUnhandledPromiseRejectionHandler
は、ハンドラーをクリアするために、null
、undefined
、または空の引数を指定して呼び出すことができます。
Java #
Java
オブジェクトは、ホストクラスルックアップが許可されている場合にのみ利用可能です。Java ホストクラスとそのメンバーにアクセスするには、まず ホストアクセスポリシー によって許可され、ネイティブ実行可能ファイルから実行する場合は、ランタイムリフレクションに登録されている必要があります。
一部の関数では、Nashorn 互換モードを有効にする必要があることに注意してください (--js.nashorn-compat=true
)。
Java.type(className)
Java.type
は、指定された Java クラスをロードし、そのクラスの静的メンバー (たとえば、メソッドやフィールド) を持ち、new
キーワードで新しいインスタンスを構築するために使用できる構築可能なオブジェクトを返します
var BigDecimal = Java.type('java.math.BigDecimal');
var point1 = new BigDecimal("0.1");
var two = BigDecimal.TWO;
console.log(point1.multiply(two).toString());
new
演算子で直接使用する場合、Java.type(...)
を括弧で囲む必要があることに注意してください
console.log(new (Java.type('java.math.BigDecimal'))("1.1").pow(15));
Java.from(javaData)
Java.from
は、Java データ構造 (Array、List) の浅いコピーを JavaScript 配列として作成します。
多くの場合、これは必要ありません。通常、JavaScript から Java データ構造を直接使用できます。
Java.to(jsData, javaType)
Java.to
は、引数を Java タイプに変換します。
ソースオブジェクトjsData
は、JavaScript配列、またはlength
プロパティを持つ配列のようなオブジェクトであることが期待されます。ターゲットのjavaType
は、String(例えば"int[]"
)または型オブジェクト(例えばJava.type("int[]")
)のいずれかです。有効なターゲット型はJava配列です。ターゲット型が省略された場合、デフォルトでObject[]
になります。
var jsArray = ["a", "b", "c"];
var stringArrayType = Java.type("java.lang.String[]");
var javaArray = Java.to(jsArray, stringArrayType);
assertEquals('class java.lang.String[]', String(javaArray.getClass()));
var javaArray = Java.to(jsArray);
assertEquals('class java.lang.Object[]', String(javaArray.getClass()));
JavaScriptの値がJava型に変換される必要がある場合、ECMAScriptで定義された変換メソッド(例えば、ToString
やToDouble
)が実行されます。情報が失われる変換は許可されず、TypeError
が発生します。
Java.isJavaObject(obj)
obj
がJavaホストオブジェクトの場合、true
を返します- ネイティブJavaScriptオブジェクトや、他のポリグロット言語のオブジェクトの場合は
false
を返します
Java.isType(obj)
obj
がJava.type()
またはパッケージオブジェクトで取得された、Javaクラスのコンストラクタおよび静的メンバーを表すオブジェクトの場合、true
を返します。- その他のすべての引数に対しては
false
を返します
Java.typeName(obj)
obj
がJava型(isType(obj) === true
)またはJavaのClass
インスタンスを表す場合、obj
のJavaClass
名を返します- それ以外の場合は
undefined
を返します
Java.isJavaFunction(fn)
fn
がJava関数を表すJava言語のオブジェクトであるかどうかを返します- ネイティブJavaScript関数や他のポリグロット言語の関数を含む、他のすべての型に対しては
false
を返します
この関数は、Nashorn互換モード(
--js.nashorn-compat=true
)でのみ利用可能です。
Java.isScriptObject(obj)
obj
がJavaScript言語のオブジェクトであるかどうかを返します- Javaや他のポリグロット言語のオブジェクトを含む、他のすべての型に対しては
false
を返します
この関数は、Nashorn互換モード(
--js.nashorn-compat=true
)でのみ利用可能です。
Java.isScriptFunction(fn)
fn
がJavaScript関数であるかどうかを返します- Java関数や他のポリグロット言語の関数を含む、他のすべての型に対しては
false
を返します
この関数は、Nashorn互換モード(
--js.nashorn-compat=true
)でのみ利用可能です。
Java.addToClasspath(location)
- 指定された場所(
.jar
ファイルまたはディレクトリパス文字列)をJavaのクラスパスに追加します
ポリグロット #
Polyglot
オブジェクトの関数を使用すると、他のポリグロット言語の値とやり取りできます。
Polyglot
オブジェクトは、js.polyglot-builtin
オプションをfalse
に設定して無効化しない限り、デフォルトで使用できます。
Polyglot.export(key, value)
- JavaScriptの
value
を名前key
(文字列)でポリグロットバインディングにエクスポートしますfunction helloWorld() { print("Hello, JavaScript world"); } Polyglot.export("helloJSWorld", helloWorld);
ポリグロットバインディングにkey
で識別される値がすでに存在する場合、新しい値で上書きされます。value
は、任意の有効なポリグロット値である可能性があります。
key
が文字列でないか、または存在しない場合はTypeError
をスローします
Polyglot.import(key)
key
(文字列)で識別される値をポリグロットバインディングからインポートして返しますvar rubyHelloWorld = Polyglot.import("helloRubyWorld"); rubyHelloWorld();
key
で識別される値をエクスポートした言語がない場合、undefined
が返されます。
key
が文字列でないか、または存在しない場合はTypeError
をスローします
Polyglot.eval(languageId, sourceCode)
languageId
で識別されるインタプリタを使用して、sourceCode
を解析および評価します
sourceCode
の値は、文字列(または文字列に変換可能なもの)であることが期待されます。
- 評価結果は、
sourceCode
や評価される言語のセマンティクスに応じて返されますvar pyArray = Polyglot.eval('python', 'import random; [random.uniform(0.0, 1.0) for _ in range(1000)]');
無効なlanguageId
が渡された場合、sourceCode
を言語で評価できない場合、または実行されたプログラムが例外をスローした場合は、例外が発生する可能性があります。
Polyglot.evalFile(languageId, sourceFileName)
languageId
で識別されるインタプリタを使用して、ファイルsourceFileName
を解析します
sourceFileName
の値は、現在のパスからアクセス可能なファイルを表す文字列(または文字列に変換可能なもの)であることが期待されます。
- 実行可能なオブジェクト、通常は関数を返します
var rFunc = Polyglot.evalFile('R', 'myExample.r'); var result = rFunc();
無効なlanguageId
が渡された場合、sourceFileName
で識別されるファイルが見つからない場合、または言語が解析中に例外をスローした場合(構文エラーなどの解析時エラー)は、例外が発生する可能性があります。評価されたプログラムによってスローされる例外は、結果の関数が評価されるまでスローされません。
Polyglot.evalFile
関数は、Polyglot
組み込みが利用可能な場合、js.polyglot-evalfile
オプションをfalse
に設定して無効化しない限り、デフォルトで使用できます。また、js.debug-builtin
が有効になっている場合も利用できます。
デバッグ #
js.debug-builtin
オプションを指定してエンジンを起動する必要があります
Debug
は、JavaScriptコードとJavaScriptエンジンのデバッグ機能を提供するGraalJS固有の関数オブジェクトです。このAPIは予告なしに変更される可能性があります。本番環境での使用は避けてください。
グローバル関数 #
printErr(...arg)
print
と同じように動作します
唯一の違いは、デフォルトの出力ストリームの代わりに、エラー ストリームを使用して印刷されることです。
loadWithNewGlobal(source, arguments)
load
関数と同様に動作します
関連する違いは、コードが新しいグローバルスコープ(ECMAScriptで定義されているレルム)で評価されることです。
ソースのタイプは次のいずれかです
java.lang.URL
:URLから実行するソースコードがクエリされます。- JavaScriptオブジェクト:オブジェクトから
name
プロパティとscript
プロパティがクエリされます。 - その他すべてのタイプ: ソースは String に変換されます。
arguments
の値は、ロードされたコードの実行時に提供されます。