Node.jsとJava組み込みの比較

GraalVMは、完全に準拠したECMAScript 2024 JavaScriptランタイムを提供します。そのため、Oracle Database、Javaベースのアプリケーション、Node.jsなど、さまざまな埋め込みシナリオでJavaScriptコードを実行できます。

埋め込みシナリオによっては、アプリケーションがアクセスできる組み込み機能が異なります。たとえば、GraalVMのbin/node実行可能ファイルを使用して実行されるNode.jsアプリケーションは、fshttpなどの組み込み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クラスと対話できます。このオブジェクトはjsnodeランチャーではデフォルトで利用できますが、Javaクラスへのアクセスは、JVMスタンドアロン(名前に-jvmが含まれるもの)でのみ可能です。

Polyglot APIを使用してJavaScriptを埋め込む場合は、Context.BuilderallowHostAccessallowHostClassLookup)でホストアクセスを明示的に有効にする必要があります。JavaScriptとJavaの相互運用性の詳細については、Java相互運用性ガイドを参照してください。

マルチスレッド処理 #

JavaScriptを実行するポリグロットContextは、「共有なし」の並列処理モデルを強制します。つまり、2つの同時実行Javaスレッドが同時にJavaScript値にアクセスすることはできません。並列実行を活用するには、複数のコンテキストを作成し、複数のスレッドから実行する必要があります。

  1. Node.jsモードでは、Node.jsのWorker threads APIを使用して、複数のコンテキストを作成できます。Worker threads APIは、2つの並列コンテキスト間で共有が行われないようにします。
  2. Javaでは、複数のスレッドから複数のコンテキストを実行できます。コンテキストに同時に2つのスレッドがアクセスしない限り、並列実行は安全に行われます。

GraalJSでの並列実行の詳細については、このブログ投稿を参照してください。

Javaライブラリ #

Javaライブラリは、組み込みオブジェクトJavaを介してGraalJSからアクセスできます。JavaライブラリがContextからアクセス可能になるには、そのJARファイルをクラスパスに追加する必要があります。これは次のように行うことができます。

  1. Node.jsモードでは、--vm.cpオプションを使用してクラスパスを変更できます。
  2. Javaでは、デフォルトのJavaの-cpオプションを使用できます。

コマンドラインオプションで詳細をご覧ください。

JavaScriptパッケージとモジュール #

npmパッケージレジストリなどで利用可能な、多くの一般的なJavaScriptモジュールは、Node.jsとJavaの両方から使用できます。

  1. Node.jsモードでは、JavaScriptモジュールはNode.jsランタイムによって処理されます。そのため、GraalJSはNode.jsでサポートされているすべてのモジュール(ESモジュール、CommonJSモジュール、ネイティブモジュールを含む)をサポートします。
  2. Javaモードでは、GraalJSは、ネイティブNode.js組み込みモジュール(fshttpなど)に依存しないJavaScriptモジュールまたはパッケージを実行できます。モジュールは、パッケージバンドラーを使用して、またはESモジュールで使用可能な組み込みメカニズムを使用してロードできます。CommonJSモジュールは、Javaモードで実験的なオプションでサポートされています。

JavaScriptモジュールの詳細については、モジュールを参照してください。

お問い合わせ