如何評價微軟的Language Server Protocol?

Protocol Implementations · Microsoft/language-server-protocol Wiki · GitHub

微軟和Codenvy一起推出了這個標準,意在讓editor和IDE以後能夠使用一個通用的組件來做代碼分析

那麼這個protocol有什麼過人之處和不足?今後的發展如何,可否完全取代單獨的編輯器插件(比如YCM)么?


@空明流轉 不是早就說過了嗎,M$ 出的任何東西都不應該流行,因為我們要反抗邪惡公司統治世界的企圖。


LSP搞的好絕對是能革IDE命的存在.

Language Server Protocol主要就是解決市面上那麼多編輯器(m)和那麼多語言(n)共存的問題,以前寫編輯器語言插件要寫 m x n 個, LSP出現後只要寫 m + n 個就可以了.

實際使用也是非常爽,只要編輯器裝完 Language Client Plugin, 任何一個新語言只要配個啟動Lanuage Server的命令就有各種補全. 異常神奇.

LSP本身是非常良好的設計,它脫胎於OmniSharp和TypeScript Server,經過實戰檢驗,可以覆蓋一般語言里補全/查錯/找定義/查看類型/的種種功能. 通信用了JSONRPC,可以用TCP或者stdin/stdout傳輸. 把編輯器行為和語言特性用一種通用的方式解耦,這一點可以秒殺市面上所有編輯器和IDE(YCM不能比).

-------------------------

但是現實是骨感的... 微軟邪惡帝國的本質讓他在開源界永世不得翻身(誤

LSP對文檔的抽象是個二維的字元矩陣, 一些古老的編輯器(Vim/Emacs)對算行列的支持不是很好. 所以編輯器插件實現的時候就很麻煩,或者作者會直接省事把整個文件全部重傳給伺服器. 效率不好.

但是更嚴重的問題語言伺服器沒有寫的好的... 這裡Microsoft/language-server-protocol 列出的實現, 要不是功能不全,要不是Bug多, 一般實現代碼也醜陋無比.

這個問題主要原因還是沒有語言團隊的官方支持.(也就是沒語言團隊理會巨硬的proposal). 民間開發者對編譯器/語言/程序的理解實在太弱,就算有LSP這樣的設計思路給到,也沒有辦法做出一個良好的實現.

相反,如果有語言的Core Team支持的話,Language Server就會很神, 目前只有Rust的LSP是Mozilla官方的人寫的, 效果也不錯.

總的來說, LSP目前是有人用的, 但是用戶太少,實現太爛. 光有良好設計,沒有強大社區召喚力push語言實現者實現還是不行的....(估計也就FB/Google能這麼折騰


為什麼都這麼悲觀……

Clang 團隊開始開發支持 LSP 的 ClangD Clang Developers - ClangD, llvm-mirror/clang-tools-extra, rL294291. 根據討論,Clang 團隊似乎想從 libclang 走向 LSP (libclang 就是 YCM 之類用的後端);

YCM 作者 Val Markovic 對 ClangD 和 LSP 的評價 ([cfe-dev] ClangD):

&>From the YCM side: I think this is a *fantastic* idea! We were thinking
about pulling out the C++ completion out of ycmd and into a separate server
that ycmd would talk to (much like it works for several other languages
already) but hearing that clang devs are taking this on saves us a bunch of
work!

And it"s great to hear it will follow the common completion API MS is
pushing; we"ll be supporting that API on the back-end of ycmd some time in
the future (and clangd might accelerate that). We"re looking into possibly
supporting it on the front-end as well.

之後也有 Qt 團隊的人表示很感興趣,不過討論了太多細節,太長我就不貼了。

Rust 的 Language Server (RLS)也是緊跟著 LSP 的標準:Move to LSP 3.0 · Issue #178 · rust-lang-nursery/rls


這貨也要配合著這個看

Anders Hejlsberg on Modern Compiler Construction

怎麼寫service部分比較好, 高效(不能每次都重建整個樹)。。

===========================================

ps: 最新的的scala編譯器dotty


RMS都說支持你支持不支持?


Neovim 的 issue 列表上很早就出現對於支持 LSP 的討論了,目測已在計劃之內:Language Server Implementation (LSP) · Issue #5522 · neovim/neovim


超級吊!!!

因為 lsp 的存在,所以 VSCode 只是一個遵循了 lsp 的 client 而已。既然只是個 client,以後 VSCode 的牛逼的功能(接近於 IDE 的靜態分析等)幾乎都能在 Emacs / Vim 上實現了,編輯器界終於達到了前所未有的大和諧,喜大普奔!

emacs-lsp/lsp-mode


使用cquery:C++ language server

需要更多人幫忙C++ language server ... Polish before publishing · Issue #30 · jacobdufault/cquery

Higher priority items I"d like to get addressed before publishing to the marketplace

  • make sure we don"t load cached file if real file is not present
  • Very make_unique contributes constructor calls
  • extern const char not included in outline? see ash_switches.h
  • show warning for compile_commands.json, autogen if possible; maybe git rev-parse origin/master ; or git rev-parse HEAD
  • Verify when loading project we add to end of queue so existing open files are indexed first
  • we don"t need to reindex file unless it has timestamp change, ever, try to add metrics to count how many files get updated after sync
  • reindex file is command line arguments change
  • max number of code lens results otherwise vscode will hang if the file has 20k+ code lens
  • Mention how to disable code lens in README
  • Drop clang_args in favor of pref or move to .cquery or similar
  • clang arg pref should be platform specific
  • Only status update every few hundred milliseconds
  • Reduce output
  • index perf: don"t run every DoIdMap; stop after 500 or 1000 iterations
  • Move completion entirely off querydb thread so it never touches querydb
  • progress indicator needs to account for index threads which are busy (ie, +1 to a job when they remove the item from the queue until it is done being processed)

Misc issues that need to be dealt with at some point

  • Make warning "launch.workingDirectory" say "cquery.launch.workingDirectory"
  • std::sting -&> std::string typo fixit does replaces trailing text content/space, it should insert the new string instead of replacing, likely a bug in FixIt generation
  • Fix show references for function declaration parameters
  • Code lens causing screen to scroll - Microsoft/vscode#12294
  • Show warning for old pref names
  • No reload notification when adding new pref that changes from default value (include.blacklist)
  • Find ref on lambda parameter
  • gv on variable should show variables of the same type
  • Freshen should drop existing index
  • labeled stack traces on linux
  • Insert include by typing a symbol (ie, global symbol search)
  • see if we can set code lens command title to show custom string
  • Prefer smallest path found for include when scanning
  • Clickable controls in tooltips - Microsoft/vscode#29076
  • See if we can integrate commit characters for code completion
  • Auto-implement doesn"t strip override
  • Auto-implement select implemented content for fast ctrl-x ctrl-v
  • Call tree in context menu
  • Call tree - use icon for base/derived calls
  • Completion list private with - or similar
  • Don"t show errors for ie, *.mojom files
  • Add task to reload compile_commands.json
  • Call tree should store index lines and look it up when the user requests goto definition
  • Add task to drop existing index and do a fresh import
  • Reparse top document - might be possible by hooking directly into extension API and sending a notification $cquery/onView
  • Call hierarchy; show class name and line, skip column MyMethod (Foobar:3). If no class name show file MyMethod (http://foo.cc:3)
  • Call hierarchy: sort by file and then by location in that file
  • Call tree fails on pure-virtual functions
  • Investigate jemalloc
  • Do not report global completions in certain situations, ie, o not report global completions in certain situations, ie, Example: type this: class Foo : public Bar {public:
  • Idea: only do live-indexing after a save, but use completion thread to do it.


在 Emacs 中分別用 Anaconda-mode, Elpy, Lsp-mode(Language Server Protocol) 這些熱門的 Python 插件實驗了下。

把游標放在函數上,minibusffer(Emacs底部) 會顯示出 Eldoc 信息。前兩者沒法實現精確定義,比如把游標放在 np.median 上,沒法正確地返回實例的方法的信息,而 Lsp-mode 做到了。

比 Emacs 自帶的全靠正則表達式搜索強多了。而這只是其中一個強項而已,之前很多 Emacs 被詬病的缺陷也將隨著 Lsp 的發展而被解決。


就現在的微軟而言,這東西可能會陷入無人使用的境地


我是neovim狂熱粉絲,目前也在關注neovim內置LSP的支持,如果可以我也會在SpaceVim這個項目中加入相應的支持 ,只能說對這一特性,大讚

可以看我們的項目:

https://github.com/SpaceVim/SpaceVim


不是說了ts就是用這個的嘛…

感覺很多東西就是微軟先出來搞個受好評的模型(產品),然後用著用著發現這個東西有著先天的缺陷,然後再出來一個更好的…

xhr是這樣,ts或許是這樣…

然後我覺得這個也會這樣…還有內置linux的這個(以後應該是直接提供類dock鏡像的東西…)

好想把崇拜者@尤雨溪 邀請過來…某種意義上vue也可以作為一種語言吧233…


微軟還是這個路子,搞出一個東西,聲稱用我這個可以代替你本來用的某某來做某某啦。。大家都來看我這個可以統一啦,我們的既可以搞這個,這個,還有那個……

但是,還是沒多少人用……


推薦閱讀:

Visual Studio 2017 正式版有哪些亮點?
如何評價 Visual Studio 2017?
微軟為什麼用 Silverlight 作為 WP7 和 Xbox 的主流開發技術?
如何看待5月10日微軟在中國開始預售HoloLens?

TAG:微軟Microsoft | 集成開發環境 | 編譯器 |