如何評價微軟的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 | 集成開發環境 | 編譯器 |