參加你附近的 ,瞭解 VS Code 中的 AI 輔助開發。

一種通用的語言協議

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

Visual Studio Code 是一款適用於任何開發人員的編輯器,無論您使用哪種程式語言。透過工具中捆綁的語言或市場中的擴充套件,我們支援超過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