🚀 在 VS Code 中

語言通用協定

2016 年 6 月 27 日,VS Code 團隊撰寫,@code

Visual Studio Code 是適用於任何開發人員的編輯器,無論您使用何種程式語言。無論是工具內建的語言,或是 Marketplace 中的擴充功能,我們都支援超過 150 種語言。我們也致力於開放式地開發 VS Code,並將驅動 VS Code 的元件設為可用且開放原始碼。我們最著名的元件之一是 Monaco 編輯器,而另一項驅動 VS Code 的技術是 開放、基於 JSON 的協定,任何人都可以透過實作「語言伺服器」,使用此協定將新程式語言的支援新增至 VS Code。

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 的協定即可。

這也讓指定的語言伺服器可以實作一次,並讓不同的工具加以利用。這就是此協定已獲得 Codenvy 採用的原因,他們已將其新增至下一代 Eclipse IDE Eclipse Che,以及 Red Hat,他們正努力發布適用於 Java 的獨立語言伺服器,任何使用此協定的工具都可以取用。

開放規格

此協定的完整規格可在 公開 GitHub 儲存庫 中取得,協定至今發展歷程的記錄也一樣。隨著越來越多語言和工具採用此協定,我們打算與 Red Hat、Codenvy 和開放原始碼社群中的其他合作夥伴一起支援和發展此協定。任何人都可以像其他開放原始碼專案一樣,在儲存庫上提出問題、提交問題或提交提取要求。

下一步

這僅僅是開始,OmniSharp (C#)、JSON、C++、xText、JavaFX 和 R 等程式語言的社群已承諾在未來發布其語言的語言伺服器。完整的協定實作清單,包括語言伺服器、編輯器和 SDK,可在 GitHub 儲存庫中取得。

如果您想了解更多資訊,請觀看分組會議,查看 Red HatEclipse Che 團隊的部落格文章,並造訪 GitHub 上的 語言伺服器協定儲存庫。甚至還有 語言伺服器逐步解說,您可以逐步了解以 TypeScript 和 Node.js 實作的運作中語言伺服器的原始碼。但當然,您可以使用任何語言實作語言伺服器!

祝您編碼愉快!

VS Code 團隊,@code