語言通用協定
2016 年 6 月 27 日,VS Code 團隊撰寫,@code
Visual Studio Code 是適用於任何開發人員的編輯器,無論您使用何種程式語言。無論是工具內建的語言,或是 Marketplace 中的擴充功能,我們都支援超過 150 種語言。我們也致力於開放式地開發 VS Code,並將驅動 VS Code 的元件設為可用且開放原始碼。我們最著名的元件之一是 Monaco 編輯器,而另一項驅動 VS Code 的技術是 開放、基於 JSON 的協定,任何人都可以透過實作「語言伺服器」,使用此協定將新程式語言的支援新增至 VS Code。
任何語言,任何工具
今天在舊金山舉行的 DevNation 會議上,我們與 Red Hat 和 Codenvy 一同宣布,業界的工具建立者和語言供應商現正採用此語言伺服器協定。對於語言建立者而言,這表示可在各種開發工具和作業系統中,為其語言提供強化的工具體驗,類似於 TypeScript 開發人員或 C# 開發人員 (透過 OmniSharp) 今天獲得的體驗。這也表示任何開發人員都可以在任何工具上,針對其偏好的程式語言獲得一致的編輯體驗,即使該工具不是 VS Code 也一樣。
運作方式
Visual Studio Code 為許多程式語言提供豐富的語言支援。對特定程式語言的支援是由語言伺服器提供,該伺服器深入了解該語言。VS Code 與這些伺服器通訊,以啟用豐富的編輯功能,例如「錯誤與警告」、「重構」和「前往定義」。
以下範例說明工具和語言伺服器如何在例行編輯工作階段期間,傳達語意資訊
-
使用者在工具中開啟檔案 (稱為文件):工具通知語言伺服器文件已開啟 (
didOpen
),且該文件的相關資訊由工具維護在記憶體中。 -
使用者進行編輯:工具通知伺服器文件變更 (
didChange
),且語言伺服器會更新程式的語意資訊。在此期間,語言伺服器會分析此資訊,並將找到的錯誤和警告 (diagnostics
) 通知工具。 -
使用者對符號執行「前往定義」:工具傳送
definition
要求給伺服器。伺服器會以包含定義的文件uri
和文件內的range
回應。根據此資訊,工具可以開啟定義位置的對應文件。 -
使用者關閉文件 (檔案):工具會傳送
didClose
通知,告知語言伺服器文件現在已不在記憶體中,而是由檔案系統維護 (即儲存在檔案系統上)。
此通訊透過 JSON-RPC 進行,在一般工作階段期間會發生多次。
此架構允許 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 Hat 和 Eclipse Che 團隊的部落格文章,並造訪 GitHub 上的 語言伺服器協定儲存庫。甚至還有 語言伺服器逐步解說,您可以逐步了解以 TypeScript 和 Node.js 實作的運作中語言伺服器的原始碼。但當然,您可以使用任何語言實作語言伺服器!
祝您編碼愉快!
VS Code 團隊,@code