VS Codeでのポリグロットのプログラミングおよびデバッグ
GraalVM Tools for Java拡張機能により、VS Codeでポリグロット環境を実現できます。Python、Ruby、R、JavaScript、Node.JSなど、いくつかの一般的な言語に編集およびデバッグ機能が提供されます。拡張機能により、双方向の方法でポリグロット・プログラミングをサポートしています: つまり、JavaにJavaScript、Ruby、RおよびPythonを埋め込むことも、それらの言語からJavaをコールすることもできます。ホスト言語とゲスト言語は、直接相互に運用して、同じメモリー領域でデータをやり取りすることができます。
GraalVM Tools for Java拡張機能は、デフォルトでJavaScript、Node.jsおよびPython用の完全な編集機能を備えています。VS CodeのRubyおよびR開発では、言語サーバーを追加でインストールする必要があります。それ以外にも、拡張機能には言語サーバー・プロトコルの組込み実装が付属しており、コード補完、使用方法の検索、宣言への移動、CodeLens、ホバーによるドキュメント表示など、よりスマートな編集機能が追加されます。デフォルトでは、サポートされているすべての言語に対してデバッグ機能が提供されています。
このガイドでは、JavaScriptおよびNode.JS、Python、Ruby、Rアプリケーションを1つずつデバッグする方法を学習します。言語サーバー・プロトコルの実装と編集機能について学習します。必要な項に直接ジャンプできます:
- Debug Adapter Protocolの実装
- JavaScriptおよびNode.jsのデバッグ
- Pythonのデバッグ
- Rubyのデバッグ
- Rのデバッグ
- 言語サーバー・プロトコルの実装
- ポリグロット・アプリケーションの実行およびデバッグ
Debug Adapter Protocolの実装
ネイティブのデバッグ機能とともに、拡張機能は Debug Adapter Protocol (DAP)の組込み実装に付属しています。VS Codeで実行/デバッグ構成を作成する場合、Chrome DevTools Protocolがデフォルトでプロビジョニングされます。GraalVM Tools for Java拡張機能では、ユーザーは対応するデバッグ構成のプロトコル属性をchromeDevTools
またはdebugAdapter
に設定することで、使用するプロトコルを選択できます。
Debug Adapter Protocolを提供するデバッガ・ポートを開くには、コマンドライン・ランチャに--dap
オプションを渡す必要があります。GraalVMのDebug Adapter Protocolに渡すことができるその他のオプションは、次のとおりです:
--dap.Suspend=false
: 最初のソース行での実行の一時停止を無効にします(デフォルトでは有効になっています)。--dap.WaitAttached
: デバッガ・クライアントがアタッチされるまでソース・コードを実行しません。デフォルトはfalseです。--dap=<[[host:]port]>
: デフォルトとは異なるポート(<host>:4711
)でデバッガを起動します。
次に、DAPクライアントから開いているDAPポートに接続する必要があります。たとえば、Node.jsアプリケーションのlaunch.json
のコンテンツであるオープンDAPポートに接続するには、次のようになります:
{
"version": "0.2.0",
"configurations": [
{
"type": "graalvm",
"request": "launch",
"name": "Launch Node App",
"outputCapture": "std",
"protocol": "debugAdapter",
"program": "${workspaceFolder}/App.js"
}
]
}
Chrome Dev ToolsでDebug Adapter Protocolを使用する利点は、VS Codeに対してネイティブであること(中間変換を必要としない)、マルチスレッドをサポートし、Rubyアプリケーションなどのデバッグに特に役立つ可能性があることです。
JavaScriptおよびNode.jsのデバッグ
GraalVMで実行されているJavaScriptまたはNode.jsアプリケーションをデバッグするには、アプリケーションの起動構成を作成します:
- 「File」、「Open Folder」の順に進み、VS Codeでアプリケーション・プロジェクト・フォルダを開きます。
- 左側のパネルのバグ・アイコンをクリックして、「Debug」ビューに切り替えます。新しく開いたウィンドウで、
launch.json
ファイルを作成するように提案されます。デバッグがまだ構成されていない(launch.json
が作成されていない)場合は、使用可能なデバッグ環境のリストからGraalVM
を選択します。 launch.json
ファイルを開くと、次のいずれかの方法を使用して新しい構成を追加できます:- カーソルが構成配列内にある場合は、コード補完を使用します。
- 「Add Configuration」をクリックして、配列の最初にIntelliSenseスニペットの提案を起動します。
- 「Debug」メニューで「Add Configuration」を選択します。
-
起動構成のいずれかを選択します:
ノート: 起動構成で使用可能な属性は、構成によって異なります。IntelliSenseの提案([Ctrl]+[Space])を使用して、特定のデバッグ構成に存在する属性を検出できます。すべての属性について、ホバー・ヘルプも使用できます。
デバッグ・セッションを開始するには:
- 「Debug」ビューの「Configuration」ドロップダウン・リストから、適切な構成を選択します。
- 起動構成を設定した後、[F5]でデバッグ・セッションを開始します。または、「View」、「Command Palette」を使用して構成を実行できます(Linuxの場合は[Ctrl]+[Shift]+[P]ホット・キーの組合せを使用し、macOSの場合は[Command]+[Shift]+[P]を使用します)。
- フィルタリングをDebug: Select and Start Debuggingに設定するか、debugと入力してデバッグする構成を選択します。
GraalVM拡張機能には、GraalVMで実行されるJavaScriptおよびNode.jsアプリケーションの実行およびデバッグに使用可能な、次のデバッグ構成が用意されています:
- 「Launch Node.js Application」は、デバッグ・モードでGraalVMを使用してNode.jsアプリケーションを起動します。
- 「Launch JavaScript」は、デバッグ・モードでGraalVMを使用してJavaScriptアプリケーションを起動します。
- 「Attach」は、ローカルで実行中のGraalVMランタイムにデバッガをアタッチします。
- 「Attach to Remote」は、リモートGraalVMランタイムのデバッグ・ポートにデバッガをアタッチします。
対応するデバッグ構成のprotocol
属性をchromeDevTools
またはdebugAdapter
に設定することで、使用するデバッグ・プロトコル(Debug Adapter ProtocolまたはChrome Dev Toolsプロトコル)を選択することもできます。たとえば、開いているDebug Adapter Protocolポートに接続するには、launch.json
のコンテンツが次のようになっている必要があります:
{
"version": "0.2.0",
"configurations": [
{
"type": "graalvm",
"request": "launch",
"name": "Launch Node App",
"outputCapture": "std",
"protocol": "debugAdapter",
"program": "${workspaceFolder}/App.js"
}
]
}
Pythonのデバッグ
GraalVMで実行されているPythonアプリケーションをデバッグするには、アプリケーションの起動構成を作成します:
- 「File」、「Open Folder」の順に進み、VS Codeでアプリケーション・プロジェクト・フォルダを開きます。
- 左側のパネルのバグ・アイコンをクリックして、「Debug」ビューに切り替えます。新しく開いたウィンドウで、
launch.json
ファイルを作成するように提案されます。デバッグがまだ構成されていない(launch.json
が作成されていない)場合は、使用可能なデバッグ環境のリストからGraalVM
を選択します。 launch.json
ファイルを開くと、次のいずれかの方法を使用して新しい構成を追加できます:- カーソルが構成配列内にある場合は、コード補完を使用します。
- 「Add Configuration」をクリックして、配列の最初にIntelliSenseスニペットの提案を起動します。
- 「Debug」メニューで「Add Configuration」を選択します。
-
起動構成を選択します。
ノート: 起動構成で使用可能な属性は、構成によって異なります。IntelliSenseの提案([Ctrl]+[Space])を使用して、特定のデバッグ構成に存在する属性を検出できます。すべての属性について、ホバー・ヘルプも使用できます。
デバッグ・セッションを開始するには:
- 「Debug」ビューの「Configuration」ドロップダウン・リストを使用して、適切な構成を選択します。
- 起動構成を設定した後、[F5]でデバッグ・セッションを開始します。または、「View」、「Command Palette」を使用して構成を実行できます(Linuxの場合は[Ctrl]+[Shift]+[P]ホット・キーの組合せを使用し、macOSの場合は[Command]+[Shift]+[P]を使用します)。
- フィルタリングをDebug: Select and Start Debuggingに設定するか、debugと入力します。
-
「Launch Python Script」を選択すると、GraalVMで実行されているPythonスクリプトをデバッグ・モードで起動します。
対応するデバッグ構成のprotocol
属性をchromeDevTools
またはdebugAdapter
に設定することで、使用するデバッグ・プロトコル(Debug Adapter ProtocolまたはChrome Dev Toolsプロトコル)を選択することもできます。たとえば、Chrome Dev Toolsプロトコル・ポートに接続するには、launch.json
のコンテンツが次のようになっている必要があります:
{
"version": "0.2.0",
"configurations": [
{
"type": "graalvm",
"request": "launch",
"name": "Launch Python App",
"outputCapture": "std",
"protocol": "chromeDevTools",
"program": "${workspaceFolder}/App.py"
}
]
}
Rubyのデバッグ
GraalVMで実行されているRubyアプリケーションをデバッグするには、アプリケーションの起動構成を作成します:
- 「File」、「Open Folder」の順に進み、VS Codeでアプリケーション・プロジェクト・フォルダを開きます。
- 左側のパネルのバグ・アイコンをクリックして、「Debug」ビューに切り替えます。新しく開いたウィンドウで、
launch.json
ファイルを作成するように提案されます。デバッグがまだ構成されていない(launch.json
が作成されていない)場合は、使用可能なデバッグ環境のリストからGraalVM
を選択します。 launch.json
ファイルを開くと、次のいずれかの方法を使用して新しい構成を追加できます:- カーソルが構成配列内にある場合は、コード補完を使用します。
- 「Add Configuration」をクリックして、配列の最初にIntelliSenseスニペットの提案を起動します。
- 「Debug」メニューで「Add Configuration」を選択します。
-
起動構成を選択します。
ノート: 起動構成で使用可能な属性は、構成によって異なります。IntelliSenseの提案([Ctrl]+[Space])を使用して、特定のデバッグ構成に対して存在する属性を確認できます。すべての属性について、ホバー・ヘルプも使用できます。
デバッグ・セッションを開始するには:
- 「Debug」ビューの「Configuration」ドロップダウン・リストを使用して、適切な構成を選択します。
- 起動構成を設定した後、[F5]でデバッグ・セッションを開始します。または、「View」、「Command Palette」を使用して構成を実行できます(Linuxの場合は[Ctrl]+[Shift]+[P]ホット・キーの組合せを使用し、macOSの場合は[Command]+[Shift]+[P]を使用します)。
- フィルタリングをDebug: Select and Start Debuggingに設定するか、debugと入力します。
-
「Launch Ruby Script」を選択すると、GraalVMで実行されているRubyスクリプトをデバッグ・モードで起動します。
対応するデバッグ構成のprotocol
属性をchromeDevTools
またはdebugAdapter
に設定することで、使用するデバッグ・プロトコル(Debug Adapter ProtocolまたはChrome Dev Toolsプロトコル)を選択することもできます。たとえば、Chrome Dev Toolsプロトコル・ポートに接続するには、launch.json
のコンテンツが次のようになっている必要があります:
{
"version": "0.2.0",
"configurations": [
{
"type": "graalvm",
"request": "launch",
"name": "Launch Ruby App",
"outputCapture": "std",
"protocol": "chromeDevTools",
"program": "${workspaceFolder}/App.rb"
}
]
}
Rのデバッグ
GraalVMで実行されているRアプリケーションをデバッグするには、アプリケーションの起動構成を作成します:
- 「File」、「Open Folder」の順に進み、VS Codeでアプリケーション・プロジェクト・フォルダを開きます。
- 左側のパネルのバグ・アイコンをクリックして、「Debug」ビューに切り替えます。新しく開いたウィンドウで、
launch.json
ファイルを作成するように提案されます。デバッグがまだ構成されていない(launch.json
が作成されていない)場合は、使用可能なデバッグ環境のリストからGraalVM
を選択します。 launch.json
ファイルを開くと、次のいずれかの方法を使用して新しい構成を追加できます:- カーソルが構成配列内にある場合は、コード補完を使用します。
- 「Add Configuration」をクリックして、配列の最初にIntelliSenseスニペットの提案を起動します。
- 「Debug」メニューで「Add Configuration」を選択します。
-
起動構成を選択します。
ノート: 起動構成で使用可能な属性は、構成によって異なります。IntelliSenseの提案([Ctrl]+[Space])を使用して、特定のデバッグ構成に存在する属性を検出できます。すべての属性について、ホバー・ヘルプも使用できます。
デバッグ・セッションを開始するには:
- 「Debug」ビューの「Configuration」ドロップダウン・リストを使用して、適切な構成を選択します。
- 起動構成を設定した後、[F5]でデバッグ・セッションを開始します。または、「View」、「Command Palette」を使用して構成を実行できます(Linuxの場合は[Ctrl]+[Shift]+[P]ホット・キーの組合せを使用し、macOSの場合は[Command]+[Shift]+[P]を使用します)。
-
フィルタリングをDebug: Select and Start Debuggingに設定するか、debugと入力していずれかの構成を選択します:
- Launch R Scriptは、デバッグ・モードでGraalVMを使用してRスクリプトを起動します。
- 「Launch R Terminal」は、GraalVMで実行する統合Rターミナルをデバッグ・モードで起動します。
対応するデバッグ構成のprotocol
属性をchromeDevTools
またはdebugAdapter
に設定することで、使用するデバッグ・プロトコル(Debug Adapter ProtocolまたはChrome Dev Toolsプロトコル)を選択することもできます。たとえば、Chrome Dev Toolsプロトコル・ポートに接続するには、launch.json
のコンテンツが次のようになっている必要があります:
{
"version": "0.2.0",
"configurations": [
{
"type": "graalvm",
"request": "launch",
"name": "Launch R Script",
"outputCapture": "std",
"protocol": "chromeDevTools",
"program": "${workspaceFolder}/App.r"
}
]
}
言語サーバー・プロトコルの実装
GraalVMは、言語サーバー・プロトコルの組込み実装を提供します。これにより、VS Codeなどの互換性のある開発ツールをGraalVMにアタッチでき、コード補完、使用方法の検索、宣言への移動、CodeLens、ホバーによるドキュメント表示など、よりスマートな編集機能が追加されます。
現在、GraalVMの言語サーバー・プロトコル実装では、次のサービスがサポートされています:
- テキスト・ドキュメントの同期
- ホバー・プロバイダ
- 補完プロバイダ
- 署名ヘルプ・プロバイダ
- ドキュメント強調表示プロバイダ
- コード・アクション・プロバイダ
- CodeLensプロバイダ
- 実行コマンド・プロバイダ
ノート: 言語サーバー・プロトコルはテクノロジ・プレビューとして提供されており、アクティブ化するには、
--experimental-options
オプションを渡す必要があります。
言語サーバー・プロトコルを開始するには、Node.jsアプリケーションを使用した次の例のように、--lsp
オプションをコマンドライン・ランチャに渡します:
node --experimental-options --lsp app.js
[Graal LSP] Starting server and listening on localhost/127.0.0.1:8123
Example app listening on port 3000!
この拡張機能は、言語サーバー・プロトコルのクライアントとして機能します。デフォルトでは、言語サーバーは、VS Codeのユーザー・インタフェースを介して実行中またはデバッグ中のすべてのプロセスの一部として起動されます。言語サーバーを個別のプロセスとして起動し、実行中またはデバッグ中のすべてのアプリケーションについて通知を受け取るようにすることもできます(オプションで使用可能)。この場合は、元のアプリケーションと同じコードをテスト実行した後、ランタイム・データの提供が試行されます。現在、どちらのアプローチの場合でも言語サーバーが起動され、GraalVMでサポートされている言語(JavaScript、Python、R、RubyおよびSimpleLanguage)について、スマート編集機能が提供されます。
重要: GraalVM言語サーバー・プロコル自体により、通常はアプリケーション・ソースの解析によって収集される静的データが提供されることはありません(これらのデータは動的言語の場合にあいまいになることがあるため)。かわりに、アプリケーション・ランタイムから収集される正確な動的データを提供するように設計されています。
GraalVMの言語サーバー・プロトコル実装では、(--lsp.Delegates
ランチャ・オプションを使用して)特定の言語専用に記述された既存の言語サーバーに委任し、これらのサーバーから返される静的データを独自の動的データと単一の結果にマージできます。
RubyおよびR言語サーバー
GraalVM Tools for Java拡張機能には、JavaScript、Node.jsおよびPythonのデフォルトの編集機能が付属しています。VS CodeのRubyおよびR開発では、言語サーバーを追加でインストールする必要があります。
Ruby言語サーバー
GraalVM Tools for Java拡張機能により、Ruby言語用の言語サーバー・プロトコルの実装である、solargraphを自動的にインストールして実行するオプションが提供されます。このオプションを有効にすると、GraalVMのインストールでsolargraph
gemが存在するかどうかがチェックされ、欠落しているgemを自動的にインストールするオプションが表示されます。
solargraph
gemがインストールされると、Ruby言語サーバーが自動的に起動され、必要に応じて、委任として言語サーバー・プロトコルに渡されます。
R言語サーバー
GraalVM Tools for Java拡張機能により、Rの言語サーバー・プロトコルの実装である、languageserverを自動的にインストールして実行するオプションが提供されます。このオプションを有効にすると、GraalVMのインストールでlanguageserver
パッケージが存在するかどうかがチェックされ、欠落しているパッケージを自動的にインストールするオプションが表示されます。
languageserver
パッケージがインストールされると、R言語サーバーが自動的に起動され、必要に応じて、委任として言語サーバー・プロトコルに渡されます。
ポリグロット・アプリケーションの実行およびデバッグ
GraalVMポリグロットAPIでは、複数の言語(GraalVMでサポート)を1つのプログラムに組み合せることができます。この組合せは双方向にできます: つまり、JavaにJavaScript、Ruby、RおよびPythonを埋め込むことも、それらの言語からJavaをコールすることもできます。ホスト言語とゲスト言語は、直接相互に運用して、同じメモリー領域でデータをやり取りすることができます。詳細は、ポリグロット・プログラミング・ガイドを参照してください。
GraalVMでポリグロット・アプリケーションを実行するには、既存のアプリケーション・ランチャ(js --polyglot
やnode --polyglot
など)のいずれかに--polyglot
オプションを渡すか、プライマリ言語の選択を必要とせずにJavaScript、Python、RubyおよびRのコードを実行するpolyglot
と呼ばれる試験段階のランチャを使用する必要があります。polyglot
ランチャでは--polyglot
オプションは必要ありません。デフォルトで有効になっているためです。
ノート: 場合によっては(JavaまたはRをコールするポリグロット・アプリケーションや、
gu
とともにインストールされる言語にアクセスするネイティブ・ランチャなど)、--jvm
オプションを渡すことが必要になる場合があります。
VS CodeでのGraalVM上のポリグロット・アプリケーションをデバッグするには、アプリケーションの起動構成を作成します:
- 「File」、「Open Folder」の順に進み、VS Codeでアプリケーション・プロジェクト・フォルダを開きます。
- 左側のパネルのバグ・アイコンをクリックして、「Debug」ビューに切り替えます。新しく開いたウィンドウで、
launch.json
ファイルを作成するように提案されます。デバッグがまだ構成されていない(launch.json
が作成されていない)場合は、使用可能なデバッグ環境のリストからGraalVM
を選択します。 launch.json
ファイルを開くと、次のいずれかの方法を使用して新しい構成を追加できます:- カーソルが構成配列内にある場合は、コード補完を使用します。
- 「Add Configuration」をクリックして、配列の最初にIntelliSenseスニペットの提案を起動します。
- 「Debug」メニューで「Add Configuration」を選択します。
-
「Launch Polyglot Application」を選択して、ポリグロット・アプリケーションをデバッグ・モードで起動します。
対応するデバッグ構成のprotocol
属性をchromeDevTools
またはdebugAdapter
に設定することで、ポリグロット・アプリケーションのデバッグに使用するデバッグ・プロトコル(Debug Adapter ProtocolまたはChrome Dev Toolsプロトコル)を選択できます。たとえば、Chrome Dev Toolsプロトコル・ポートに接続するには、launch.json
のコンテンツは次のようになります:
{
"version": "0.2.0",
"configurations": [
{
"type": "graalvm",
"request": "launch",
"name": "Launch Polyglot App",
"outputCapture": "std",
"protocol": "chromeDevTools",
"program": "${workspaceFolder}/polyglot.js"
}
]
}
または、--polyglot
オプションを既存のアプリケーション・ランチャのいずれかに渡すには、--polyglot
値を含むruntimeArgs
属性をそれぞれのデバッグ構成に追加します。
その他のエディタ機能
ポリグロット・アプリケーションの記述が簡単であることはGraalVMの特徴の1つであるため、JavaScriptソース内で起動されるコード補完には、Polyglot.eval(...)
、Polyglot.evalFile(...)
およびJava.type(...)
のコールのためのアイテムが用意されています。
同様に、Pythonソース内で起動されるコード補完には、Polyglot.eval(...)
、Polyglot.eval_file(...)
およびJava.type(...)
のコールのためのアイテムが用意されています。
Rソース内で起動されるコード補完には、eval.polyglot(...)
およびnew("<Java type>", ...)
のコールのためのアイテムが用意されています。
最後に、Rubyソース内で起動されるコード補完には、Polyglot.eval(...)
、Polyglot.eval_file(...)
およびJava.type(...)
のコールのためのアイテムが用意されています。
JavaScript、Python、RおよびRubyソースをエディタで開くと、すべてのPolyglot.eval(...)
コールが検出され、それぞれの埋込み言語がその場所に注入されます。たとえば、JavaScriptソース内からポリグロットAPIを介してRコード・スニペットをコールする場合、R言語コードは、対応するJavaScript文字列およびすべてのVS Codeの編集機能(構文の強調表示、カッコの一致、自動閉じペア、コード補完など)内に埋め込まれ、String
のコンテンツはRソース・コードとして処理されます。