LS是什么
先说一下LSP(Language Server Protocol),它是语言服务器协议,是一种被用于编辑器或集成开发环境 与 支持比如自动补全,定义跳转,查找所有引用等语言特性的语言服务器(LS,(Language Server)之间的一种协议(采用的是JSON-RPC协议)。只要IDE和LS都遵循这个协议,那么各种各样得LS都能与IDE快速进行集成使用了。不然,两者不通,导致给IDE的插件生态非常不好了。
LSP的官网:https://microsoft.github.io/language-server-protocol/ 这玩意是微软搞出来的,vscode就实践得很好。
所以,LS其实是一个后台运行的exe,为前端编辑器或者IDE提供自动完成、转到定义、查找所有引用、语法检查和修正建议的一个工具软件。
LS的官网:https://langserver.org/
因此,每种编程语言的分析,都可以有一个对应LS,这个官网列出了当前所有语言可用的所有LS。大家自己去看看
C/C++语言的语言服务器LS现状
从LS的官网的列表中可以看出(LSP的官网也有个列表做了介绍),C/C++语言的语言服务器LS最常用的主流的只有3个:cquery,ccls ,clangd ,它们应该都是基于 Clang的一些模块库组合加工而来的(关于Clang知识,看我这个博客 clang入门大全以及clang全家桶介绍_标biao的博客-CSDN博客)
- cquery:已经好久没有没有更新了,这个开源项目已经停滞了。所以我们不用考虑了
- ccls:是cquery的续集以及增加新的功能,很不错
- clangd: Clang 和 LLVM 的团队构建的,可以认为这是Clang官方在维护的
现在分别来介绍这几种语言服务器的比较,可以参考的博客:
- 使用ccls:C++ language server - 知乎 写这个知乎博客的人就是ccls的作者(好像还是clangd的主要贡献者),是咱们国人。这里面讲了当前C++代码索引工具现状,写得很好,值得看看,但是是18年写的了,时间有点久了。里面提到了在代码索引方面有两个流派,ctags,和Clang派。我下一篇博客就讲ctags的调研。clang入门大全以及clang全家桶介绍_标biao的博客-CSDN博客
- ccls, clangd, cquery, 你更看好谁? - 闲聊灌水 - Emacs China 谈论了这3个语言服务器的优缺点
- 最终,我看向了clangd - 知乎 讲了clangd的配置啥的
- Comparison with clangd · Issue #880 · MaskRay/ccls · GitHub 在ccls官方github网址,比较了ccls和clangd,是最新的,值得看看
- https://www.reddit.com/r/cpp/comments/cafj21/ccls_clangd_and_cquery/ 也谈论了这3个语言服务器的优缺点
认真看看上面这些博客,大概就能知道各自的优缺点了,我们总结一下它们的特点如下:
总结
由于,ccls是cquery的续集(发扬光大),所以cquery没必要讨论了。
ccls和clangd 两者的解析都是由 libclang 完成的,但是例如索引实现是不同的。
ccls
- 代码建立索引的速度方面,好像更快一点
- 性能方面,高一些
- 支持的c++语言最新特性,更加新
- 没有编译好的exe,windows系统上需要自己编译构建,所以跑起来会特别麻烦 Why not provide binary release? · Issue #291 · MaskRay/ccls · GitHub
clangd
- 功能更丰富,代码补全等更强大一些,比如有clang-tidy 建议(检查和错误和错误修复的工具)等
- 这个开源项目的更新速度发展速度,更快,而且是clang官方团队在维护
- 使用资料,更加丰富
- 在各大主流IDE(QtCreator,keil等),广泛应用
所以,有专研探索精神,选ccls。省事,就选clangd,也最有前景
这些LS都实现了标准的LSP协议,所以我们就不要去关系如何给它们发命令行来操作它们了,我们只需要按照标准的LSP实现一个封装器(也叫client,网上去搜一下,应该能找到各种实现好的,直接移植过来用即可),然后操控这个client即可。
如果我们想就通过命令行操作这些LS,那么就需要了解它们的命令行选项了,事实上,clangd的命令行选项(命令行.\clangd.exe -help 的第一行就说了,不是给直接调用的,而是给插件用的,),也没有文档介绍(无论是官网文档还是别的地方),ccls也是同样的情况,它们压根就不是通过命令行选项来交互的,天生就是为LSP来交互的。然后我还试了clang.exe,它的文档都是关于编译命令行选项的介绍,也没有关于代码提示这方面的。
clang.exe可能曾经的版本是带了代码提示等命令行选项的,但是后面的版本,文档都没发现这些选项,说明clang的代码智能提示等语言服务功能全部迁移到clangd.exe里面去了,鼓励大家用clangd.exe,clang.exe专门干编译器相关的工作了。
所以,想用上clangd.exe,那么就得先实现LSP,我们先看看有没有开源代码,避免重复造轮子。
LSP开源代码
找了很多开源代码,想找一个基于Qt实现LSP协议的源码(即lsp client),找到三个:
- GitHub - cpeditor/lsp-cpp: An Easy to use C++ Language Server Client Library in Qt 做了一个做竞赛题的IDE,代码写得挺清晰的
- https://github.com/Tomatower/lsptest 也做了一个吧,说是最小化的,代码量较小,但是好像不是很清晰
- https://github.com/qt/qtlanguageserver qt官方搞了一个,代码量太大