VS Codeのエージェントモードを拡張するには、を試してください!

言語のための共通プロトコル

2016年6月27日 The VS Code Team, @code

Visual Studio Code は、使用するプログラミング言語に関わらず、あらゆる開発者向けのエディターです。ツールにバンドルされている言語やマーケットプレイスの拡張機能を含め、150以上の言語をサポートしています。また、VS Code をオープンに開発し、VS Code を支えるコンポーネントを公開しオープンソース化することにも取り組んでいます。最も注目すべきコンポーネントの1つはMonaco エディターですが、VS Code を支えるもう1つのテクノロジーは、"言語サーバー"を実装することで、誰でも新しいプログラミング言語のサポートを VS Code に追加できるオープンな JSON ベースのプロトコルです。

any developer any language any tool

あらゆる言語、あらゆるツール

本日、サンフランシスコで開催されたDevNationカンファレンスで、Red Hat および Codenvyとともに、この言語サーバープロトコルが業界全体のツール作成者や言語プロバイダーによって採用されていることを発表しました。言語の作成者にとっては、これにより、TypeScript開発者やC#開発者(OmniSharp経由)が現在得ている体験と同様に、様々な開発ツールやオペレーティングシステムで、その言語のツール体験が向上することを意味します。また、これにより、あらゆる開発者が、お気に入りのプログラミング言語に対して、任意のツールで一貫した編集体験を得ることができるようになります。たとえそれが VS Code 以外のツールであってもです。

仕組み

Visual Studio Code は、多くのプログラミング言語に対して豊富な言語サポートを提供します。特定のプログラミング言語のサポートは、その言語を深く理解する言語サーバーによって提供されます。VS Code はこれらのサーバーと通信し、「エラーと警告」、「リファクタリング」、「定義へ移動」などの豊富な編集機能を実現します。

language server protocol

ここに、通常の編集セッション中にツールと言語サーバーがセマンティック情報をどのように通信するかを示す例があります。

  • ユーザーがツールでファイル(ドキュメントと呼ばれる)を開く: ツールは言語サーバーにドキュメントが開かれていること(didOpen)、およびそのドキュメントに関する情報がツールによってメモリ内で管理されていることを通知します。

  • ユーザーが編集を行う: ツールはドキュメントの変更(didChange)をサーバーに通知し、プログラムのセマンティック情報は言語サーバーによって更新されます。これが行われると、言語サーバーはこの情報を分析し、見つかったエラーと警告(diagnostics)をツールに通知します。

  • ユーザーがシンボルに対して「定義へ移動」を実行する: ツールはサーバーにdefinitionリクエストを送信します。サーバーは、定義を含むドキュメントのuriとドキュメント内のrangeで応答します。この情報に基づいて、ツールは定義位置で対応するドキュメントを開くことができます。

  • ユーザーがドキュメント(ファイル)を閉じる: ツールからdidClose通知が送信され、ドキュメントがメモリに保持されなくなり、代わりにファイルシステムによって(つまり、ファイルシステムに)管理されていることを言語サーバーに通知します。

この通信はJSON-RPCを介して行われ、一般的なセッション中に何度も発生します。

language server sequence

このアーキテクチャにより、VS Code は複数の言語サーバーとやり取りできます。各サーバーは、共通の JSON ベースのプロトコルを利用している限り、任意の言語で実装でき(ツールが実装されている言語とは独立して)、さまざまな機能をサポートできます。

また、これにより、特定の言語サーバーを一度実装すれば、様々なツールがそれを利用できるようになります。このプロトコルが、次世代 Eclipse IDE であるEclipse Cheに採用した Codenvy、およびプロトコルを利用する任意のツールで利用できる Java 用のスタンドアロン言語サーバーを公開しようとしている Red Hat によって採用されたことは、非常に喜ばしいことです。

オープン仕様

このプロトコルの完全な仕様は公開 GitHub リポジトリで入手できます。また、プロトコルが今日までどのように進化してきたかの履歴も公開されています。より多くの言語やツールに採用され続けるにつれて、Red Hat、Codenvy、その他オープンソースコミュニティのパートナーと共に、このプロトコルをサポートし、発展させていく予定です。他のオープンソースプロジェクトと同様に、誰でもリポジトリで質問したり、問題を報告したり、プルリクエストを送信したりできます。

次の展開

これは始まりにすぎません。OmniSharp (C#)、JSON、C++、xText、JavaFX、R などのプログラミング言語コミュニティは、将来的にそれぞれの言語の言語サーバーをリリースすることを約束しています。言語サーバー、エディター、SDK を含むプロトコル実装の完全なリストは、GitHub リポジトリで入手できます。

詳細については、ブレイクアウトセッションをご覧くださいRed HatおよびEclipse Cheチームのブログ記事をチェックし、GitHub の言語サーバープロトコルリポジトリにアクセスしてください。TypeScript と Node.js で実装された動作中の言語サーバーのソースコードをステップ実行できる言語サーバーウォークスルーもあります。もちろん、言語サーバーはどんな言語でも実装できます!

ハッピーコーディング!

The VS Code Team, @code