Microsoft已將VS Code編輯器用于與各種可支持的語言服務(wù)器進(jìn)行通信的協(xié)議開源。
Visual Studio Code是一個(gè)由Microsoft開發(fā)的IDE,支持超過150種語言。為支持多種語言,該IDE包含了Monaco Editor以及用于語法檢查、錯(cuò)誤報(bào)告等功能的代碼驗(yàn)證工具,并通過語言服務(wù)器提供了智能感知和重構(gòu)等功能。通常每種可支持的編程語言需要一個(gè)這樣的服 務(wù)器,Monaco與這些服務(wù)器之間的通信是通過語言服務(wù)器協(xié)議(LSP)實(shí)現(xiàn)的,Microsoft最近已將LSP開源。
代碼驗(yàn)證是一種需要投入大量資源的操作,因此語言服務(wù)器會(huì)通過一個(gè)獨(dú)立的進(jìn)程執(zhí)行。語言服務(wù)器可使用多種語言編寫,并使用一種基于JSON-RPC 的輕量級(jí)協(xié)議通過stdin/stdout與編輯器交換信息。根據(jù)正在與Microsoft合作開發(fā)Visual Studio的計(jì)算機(jī)科學(xué)家Erich Gamma介紹,該協(xié)議受到了來自V8調(diào)試器協(xié)議的啟發(fā)。
與HTTP類似,LSP也包含一個(gè)頁頭區(qū),隨后是JSON-RPC內(nèi)容區(qū),代碼片段如下所示:
Content-Length: ... { "jsonrpc": "2.0", "id": 1, "method": "textDocument/didOpen", "params": { ... }}
頁頭區(qū)可包含兩個(gè)用于指定內(nèi)容長(zhǎng)度和類型的字段。內(nèi)容可由發(fā)往語言服務(wù)器的請(qǐng)求或從語言服務(wù)器收到的響應(yīng)所代表。這一區(qū)域可用于發(fā)送消息、通知,以 及命令。通過指定可支持的能力,語言服務(wù)器可以對(duì)代碼驗(yàn)證功能可以使用的特性進(jìn)行擴(kuò)展。由于可以同時(shí)向不同語言服務(wù)器發(fā)送多個(gè)請(qǐng)求,每個(gè)數(shù)據(jù)包都包含一個(gè) ID字段,借此編輯器可以區(qū)分不同的回應(yīng)。
LSP實(shí)現(xiàn)了編輯器和所用語言服務(wù)器之間的解耦,這樣就可以在一個(gè)IDE種使用多個(gè)服務(wù)器,或在支持某一協(xié)議的多個(gè)IDE之間重用同一個(gè)語言服務(wù) 器。Microsoft和其他供應(yīng)商已經(jīng)為C++、CSS/LESS/SASS、JSON、PowerShell、Xtext、PHP等語言創(chuàng)建了服務(wù) 器。Eclipse Che也已選擇了LSP并計(jì)劃借此提供針對(duì)C/C++、C#、Go、JSON、R、TypeScript、RAML以及XML的支持。Red Hat將為Eclipse Che提供Java語言服務(wù)器。此外還有適用于C#、Haxe、Java和Node.js的SDK。