一種通用的語言協議
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