- GraalVM for JDK 23 (最新)
- GraalVM for JDK 24 (アーリーアクセス)
- GraalVM for JDK 21
- GraalVM for JDK 17
- アーカイブ
- 開発ビルド
Node.jsとJava組み込みの比較
GraalVMは、完全に準拠したECMAScript 2024 JavaScriptランタイムを提供します。そのため、Oracle Database、Javaベースのアプリケーション、Node.jsなど、さまざまな埋め込みシナリオでJavaScriptコードを実行できます。
埋め込みシナリオによっては、アプリケーションがアクセスできる組み込み機能が異なります。たとえば、GraalVMのbin/node
実行可能ファイルを使用して実行されるNode.jsアプリケーションは、fs
、http
などの組み込みNode.jsモジュールを含む、すべてのNode.js APIにアクセスできます。逆に、Javaアプリケーションに埋め込まれたJavaScriptコードは、コンテキストAPIで指定されたように、機能が制限されており、Node.jsの組み込みモジュールにはアクセスできません。
このガイドでは、Node.jsアプリケーションとJavaアプリケーションに埋め込まれたJavaScriptの主な違いについて説明します。
コンテキストの作成 #
GraalVMのJavaScriptコードは、実行コンテキストを使用して実行できます。
Javaアプリケーションでは、Context
APIを使用して新しいコンテキストを作成できます。新しいコンテキストは複数の方法で構成でき、構成オプションには、Javaクラスへのアクセスの公開、IOへのアクセスの許可などがあります。APIドキュメントに、コンテキスト作成オプションの一覧があります。このシナリオでは、GraalVMのPolyglot Bindings
を使用して、JavaクラスをJavaScriptに公開できます。
Node.jsアプリケーションでは、アプリケーションを実行するGraalVM Context
はNode.jsランタイムによって事前に初期化され、ユーザーアプリケーションで構成することはできません。このシナリオでは、以下に説明するように、bin/node
コマンドの--vm.cp=
コマンドラインオプションを使用して、JavaクラスをNode.jsアプリケーションに公開できます。
Java相互運用性 #
JavaScriptアプリケーションは、組み込みオブジェクトJava
を使用してJavaクラスと対話できます。このオブジェクトはjs
とnode
ランチャーではデフォルトで利用できますが、Javaクラスへのアクセスは、JVMスタンドアロン(名前に-jvm
が含まれるもの)でのみ可能です。
Polyglot APIを使用してJavaScriptを埋め込む場合は、Context.Builder
(allowHostAccess
、allowHostClassLookup
)でホストアクセスを明示的に有効にする必要があります。JavaScriptとJavaの相互運用性の詳細については、Java相互運用性ガイドを参照してください。
マルチスレッド処理 #
JavaScriptを実行するポリグロットContext
は、「共有なし」の並列処理モデルを強制します。つまり、2つの同時実行Javaスレッドが同時にJavaScript値にアクセスすることはできません。並列実行を活用するには、複数のコンテキストを作成し、複数のスレッドから実行する必要があります。
- Node.jsモードでは、Node.jsのWorker threads APIを使用して、複数のコンテキストを作成できます。Worker threads APIは、2つの並列コンテキスト間で共有が行われないようにします。
- Javaでは、複数のスレッドから複数のコンテキストを実行できます。コンテキストに同時に2つのスレッドがアクセスしない限り、並列実行は安全に行われます。
GraalJSでの並列実行の詳細については、このブログ投稿を参照してください。
Javaライブラリ #
Javaライブラリは、組み込みオブジェクトJava
を介してGraalJSからアクセスできます。JavaライブラリがContext
からアクセス可能になるには、そのJARファイルをクラスパスに追加する必要があります。これは次のように行うことができます。
- Node.jsモードでは、
--vm.cp
オプションを使用してクラスパスを変更できます。 - Javaでは、デフォルトのJavaの
-cp
オプションを使用できます。
コマンドラインオプションで詳細をご覧ください。
JavaScriptパッケージとモジュール #
npm
パッケージレジストリなどで利用可能な、多くの一般的なJavaScriptモジュールは、Node.jsとJavaの両方から使用できます。
- Node.jsモードでは、JavaScriptモジュールはNode.jsランタイムによって処理されます。そのため、GraalJSはNode.jsでサポートされているすべてのモジュール(ESモジュール、CommonJSモジュール、ネイティブモジュールを含む)をサポートします。
- Javaモードでは、GraalJSは、ネイティブNode.js組み込みモジュール(
fs
、http
など)に依存しないJavaScriptモジュールまたはパッケージを実行できます。モジュールは、パッケージバンドラーを使用して、またはESモジュールで使用可能な組み込みメカニズムを使用してロードできます。CommonJSモジュールは、Javaモードで実験的なオプションでサポートされています。
JavaScriptモジュールの詳細については、モジュールを参照してください。