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の実装

ネイティブのデバッグ機能とともに、拡張機能は Debug Adapter Protocol (DAP)の組込み実装に付属しています。VS Codeで実行/デバッグ構成を作成する場合、Chrome DevTools Protocolがデフォルトでプロビジョニングされます。GraalVM Tools for Java拡張機能では、ユーザーは対応するデバッグ構成のプロトコル属性をchromeDevToolsまたはdebugAdapterに設定することで、使用するプロトコルを選択できます。

Debug Adapter Protocolを提供するデバッガ・ポートを開くには、コマンドライン・ランチャに--dapオプションを渡す必要があります。GraalVMのDebug Adapter Protocolに渡すことができるその他のオプションは、次のとおりです:

次に、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アプリケーションをデバッグするには、アプリケーションの起動構成を作成します:

  1. 「File」「Open Folder」の順に進み、VS Codeでアプリケーション・プロジェクト・フォルダを開きます。
  2. 左側のパネルのバグ・アイコンをクリックして、「Debug」ビューに切り替えます。新しく開いたウィンドウで、launch.jsonファイルを作成するように提案されます。デバッグがまだ構成されていない(launch.jsonが作成されていない)場合は、使用可能なデバッグ環境のリストからGraalVMを選択します。
  3. launch.jsonファイルを開くと、次のいずれかの方法を使用して新しい構成を追加できます:
    • カーソルが構成配列内にある場合は、コード補完を使用します。
    • 「Add Configuration」をクリックして、配列の最初にIntelliSenseスニペットの提案を起動します。
    • 「Debug」メニューで「Add Configuration」を選択します。
  4. 起動構成のいずれかを選択します:

    JavaScriptおよびNode.js起動構成

    ノート: 起動構成で使用可能な属性は、構成によって異なります。IntelliSenseの提案([Ctrl]+[Space])を使用して、特定のデバッグ構成に存在する属性を検出できます。すべての属性について、ホバー・ヘルプも使用できます。

デバッグ・セッションを開始するには:

  1. 「Debug」ビューの「Configuration」ドロップダウン・リストから、適切な構成を選択します。
  2. 起動構成を設定した後、[F5]でデバッグ・セッションを開始します。または、「View」「Command Palette」を使用して構成を実行できます(Linuxの場合は[Ctrl]+[Shift]+[P]ホット・キーの組合せを使用し、macOSの場合は[Command]+[Shift]+[P]を使用します)。
  3. フィルタリングをDebug: Select and Start Debuggingに設定するか、debugと入力してデバッグする構成を選択します。

GraalVM拡張機能には、GraalVMで実行されるJavaScriptおよびNode.jsアプリケーションの実行およびデバッグに使用可能な、次のデバッグ構成が用意されています:

JavaScriptおよびNode.js構成のデバッグ

対応するデバッグ構成の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アプリケーションをデバッグするには、アプリケーションの起動構成を作成します:

  1. 「File」「Open Folder」の順に進み、VS Codeでアプリケーション・プロジェクト・フォルダを開きます。
  2. 左側のパネルのバグ・アイコンをクリックして、「Debug」ビューに切り替えます。新しく開いたウィンドウで、launch.jsonファイルを作成するように提案されます。デバッグがまだ構成されていない(launch.jsonが作成されていない)場合は、使用可能なデバッグ環境のリストからGraalVMを選択します。
  3. launch.jsonファイルを開くと、次のいずれかの方法を使用して新しい構成を追加できます:
    • カーソルが構成配列内にある場合は、コード補完を使用します。
    • 「Add Configuration」をクリックして、配列の最初にIntelliSenseスニペットの提案を起動します。
    • 「Debug」メニューで「Add Configuration」を選択します。
  4. 起動構成を選択します。

    Pythonの起動構成

    ノート: 起動構成で使用可能な属性は、構成によって異なります。IntelliSenseの提案([Ctrl]+[Space])を使用して、特定のデバッグ構成に存在する属性を検出できます。すべての属性について、ホバー・ヘルプも使用できます。

デバッグ・セッションを開始するには:

  1. 「Debug」ビューの「Configuration」ドロップダウン・リストを使用して、適切な構成を選択します。
  2. 起動構成を設定した後、[F5]でデバッグ・セッションを開始します。または、「View」「Command Palette」を使用して構成を実行できます(Linuxの場合は[Ctrl]+[Shift]+[P]ホット・キーの組合せを使用し、macOSの場合は[Command]+[Shift]+[P]を使用します)。
  3. フィルタリングをDebug: Select and Start Debuggingに設定するか、debugと入力します。
  4. 「Launch Python Script」を選択すると、GraalVMで実行されているPythonスクリプトをデバッグ・モードで起動します。

    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アプリケーションをデバッグするには、アプリケーションの起動構成を作成します:

  1. 「File」「Open Folder」の順に進み、VS Codeでアプリケーション・プロジェクト・フォルダを開きます。
  2. 左側のパネルのバグ・アイコンをクリックして、「Debug」ビューに切り替えます。新しく開いたウィンドウで、launch.jsonファイルを作成するように提案されます。デバッグがまだ構成されていない(launch.jsonが作成されていない)場合は、使用可能なデバッグ環境のリストからGraalVMを選択します。
  3. launch.jsonファイルを開くと、次のいずれかの方法を使用して新しい構成を追加できます:
    • カーソルが構成配列内にある場合は、コード補完を使用します。
    • 「Add Configuration」をクリックして、配列の最初にIntelliSenseスニペットの提案を起動します。
    • 「Debug」メニューで「Add Configuration」を選択します。
  4. 起動構成を選択します。

    Rubyの起動構成

    ノート: 起動構成で使用可能な属性は、構成によって異なります。IntelliSenseの提案([Ctrl]+[Space])を使用して、特定のデバッグ構成に対して存在する属性を確認できます。すべての属性について、ホバー・ヘルプも使用できます。

デバッグ・セッションを開始するには:

  1. 「Debug」ビューの「Configuration」ドロップダウン・リストを使用して、適切な構成を選択します。
  2. 起動構成を設定した後、[F5]でデバッグ・セッションを開始します。または、「View」「Command Palette」を使用して構成を実行できます(Linuxの場合は[Ctrl]+[Shift]+[P]ホット・キーの組合せを使用し、macOSの場合は[Command]+[Shift]+[P]を使用します)。
  3. フィルタリングをDebug: Select and Start Debuggingに設定するか、debugと入力します。
  4. 「Launch Ruby Script」を選択すると、GraalVMで実行されているRubyスクリプトをデバッグ・モードで起動します。

    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アプリケーションをデバッグするには、アプリケーションの起動構成を作成します:

  1. 「File」「Open Folder」の順に進み、VS Codeでアプリケーション・プロジェクト・フォルダを開きます。
  2. 左側のパネルのバグ・アイコンをクリックして、「Debug」ビューに切り替えます。新しく開いたウィンドウで、launch.jsonファイルを作成するように提案されます。デバッグがまだ構成されていない(launch.jsonが作成されていない)場合は、使用可能なデバッグ環境のリストからGraalVMを選択します。
  3. launch.jsonファイルを開くと、次のいずれかの方法を使用して新しい構成を追加できます:
    • カーソルが構成配列内にある場合は、コード補完を使用します。
    • 「Add Configuration」をクリックして、配列の最初にIntelliSenseスニペットの提案を起動します。
    • 「Debug」メニューで「Add Configuration」を選択します。
  4. 起動構成を選択します。

    Rの起動構成

    ノート: 起動構成で使用可能な属性は、構成によって異なります。IntelliSenseの提案([Ctrl]+[Space])を使用して、特定のデバッグ構成に存在する属性を検出できます。すべての属性について、ホバー・ヘルプも使用できます。

デバッグ・セッションを開始するには:

  1. 「Debug」ビューの「Configuration」ドロップダウン・リストを使用して、適切な構成を選択します。
  2. 起動構成を設定した後、[F5]でデバッグ・セッションを開始します。または、「View」「Command Palette」を使用して構成を実行できます(Linuxの場合は[Ctrl]+[Shift]+[P]ホット・キーの組合せを使用し、macOSの場合は[Command]+[Shift]+[P]を使用します)。
  3. フィルタリングをDebug: Select and Start Debuggingに設定するか、debugと入力していずれかの構成を選択します:

    Rのデバッグ構成

    • 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の言語サーバー・プロトコル実装では、次のサービスがサポートされています:

ノート: 言語サーバー・プロトコルはテクノロジ・プレビューとして提供されており、アクティブ化するには、--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を自動的にインストールするオプションが表示されます。

Ruby言語サーバーなし

solargraph gemがインストールされると、Ruby言語サーバーが自動的に起動され、必要に応じて、委任として言語サーバー・プロトコルに渡されます。

R言語サーバー

GraalVM Tools for Java拡張機能により、Rの言語サーバー・プロトコルの実装である、languageserverを自動的にインストールして実行するオプションが提供されます。このオプションを有効にすると、GraalVMのインストールでlanguageserverパッケージが存在するかどうかがチェックされ、欠落しているパッケージを自動的にインストールするオプションが表示されます。

R言語サーバーなし

languageserverパッケージがインストールされると、R言語サーバーが自動的に起動され、必要に応じて、委任として言語サーバー・プロトコルに渡されます。

ポリグロット・アプリケーションの実行およびデバッグ

GraalVMポリグロットAPIでは、複数の言語(GraalVMでサポート)を1つのプログラムに組み合せることができます。この組合せは双方向にできます: つまり、JavaにJavaScript、Ruby、RおよびPythonを埋め込むことも、それらの言語からJavaをコールすることもできます。ホスト言語とゲスト言語は、直接相互に運用して、同じメモリー領域でデータをやり取りすることができます。詳細は、ポリグロット・プログラミング・ガイドを参照してください。

GraalVMでポリグロット・アプリケーションを実行するには、既存のアプリケーション・ランチャ(js --polyglotnode --polyglotなど)のいずれかに--polyglotオプションを渡すか、プライマリ言語の選択を必要とせずにJavaScript、Python、RubyおよびRのコードを実行するpolyglotと呼ばれる試験段階のランチャを使用する必要があります。polyglotランチャでは--polyglotオプションは必要ありません。デフォルトで有効になっているためです。

ノート: 場合によっては(JavaまたはRをコールするポリグロット・アプリケーションや、guとともにインストールされる言語にアクセスするネイティブ・ランチャなど)、--jvmオプションを渡すことが必要になる場合があります。

VS CodeでのGraalVM上のポリグロット・アプリケーションをデバッグするには、アプリケーションの起動構成を作成します:

  1. 「File」「Open Folder」の順に進み、VS Codeでアプリケーション・プロジェクト・フォルダを開きます。
  2. 左側のパネルのバグ・アイコンをクリックして、「Debug」ビューに切り替えます。新しく開いたウィンドウで、launch.jsonファイルを作成するように提案されます。デバッグがまだ構成されていない(launch.jsonが作成されていない)場合は、使用可能なデバッグ環境のリストからGraalVMを選択します。
  3. launch.jsonファイルを開くと、次のいずれかの方法を使用して新しい構成を追加できます:
    • カーソルが構成配列内にある場合は、コード補完を使用します。
    • 「Add Configuration」をクリックして、配列の最初にIntelliSenseスニペットの提案を起動します。
    • 「Debug」メニューで「Add Configuration」を選択します。
  4. 「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ソース・コードとして処理されます。

言語の埋込みのイメージ