🚀 在 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 採用令人興奮的原因,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