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官方搞了一个,代码量太大

C/C++语言的服务器LS调研 (Language Server 实现代码索引 跳转定义 智能提示等功能)相关推荐

  1. 红帽、微软和 Codenvy 联合推出语言服务器协定(Language Server Protocol,LSP)项目

    微软.红帽及容器开发环境供应商Codenvy本周在Red Hat DevNation开放源码大会上宣布将共同发展语言服务器协定(Language Server Protocol,LSP)项目,让不同的 ...

  2. 浅谈 language server LSIF SARIF Babelfish Semantic Tree-sitter Kythe Glean等

    注:本人做过静态代码分析,也算是做过code intelligence,两者互有交叉,所以这里将涉及到的有意思的东西记录下来,未来有精力再依次对这些项目进行介绍 文章目录 什么是language se ...

  3. 最常用计算机语音,计算机常用词汇--语言及服务器篇

    计算机语言指用于人与计算机之间通讯的语言,是人与计算机之间传递信息的媒介.接下来小编为大家整理了计算机常用词汇--语言及服务器篇,希望对你有帮助哦! 一.计算机语言 CSS: Cascading St ...

  4. 服务器常用语言,计算机常用词汇--语言及服务器篇

    计算机语言指用于人与计算机之间通讯的语言,是人与计算机之间传递信息的媒介.接下来小编为大家整理了计算机常用词汇--语言及服务器篇,希望对你有帮助哦! 一.计算机语言 CSS: Cascading St ...

  5. 【Groovy】使用 Groovy 语言开发服务器 Server 和客户端 Client 套接字程序 ( 服务器客户端完整代码示例 | 运行服务器端与客户端效果及过程分析 )

    文章目录 一.服务器端完整代码 Server.groovy 二.客户端完整代码 Client.groovy 三.运行服务器端与客户端效果及过程分析 一.服务器端完整代码 Server.groovy 参 ...

  6. Go语言游戏服务器思维导图

    大家好,今天整理下了游戏服务器开发的知识,不一定限定Go语言:由于本身本人在从事Go语言游戏服务器开发,所以可以认为是以Go语言为例来分析的, 高清图片在: https://github.com/Go ...

  7. 易语言 html 服务器,易语言模拟网页Web服务器源代码

    .版本 2 .支持库 internet .子程序 __启动窗口_创建完毕 ' 实在是无聊,做了一个WEB服务器,可以把对方的网站拿回来模拟 ' 程序运行后在IE地址栏里面打 可以发现网站 ' 如果你简 ...

  8. Eclipse汉化 中文语言包下载安装 Babel Language Pack

    相关链接 Java & Eclipse & Maven 使用配置方法 Eclipse平台上新建Java项目使用Junit测试 如何在Eclipse平台使用git从GitHub上下载文件 ...

  9. r语言 读服务器数据,R语言数据实战 | 安装R语言

    原标题:R语言数据实战 | 安装R语言 1.R的获取和安装 获取和安装R很容易(这也是它"亲民"的地方),具体步骤如下: Step 1: 登陆R语言官方网站https://www. ...

最新文章

  1. 《深入浅出WPF》笔记——事件篇
  2. DPDK源码编译(二十八)
  3. Python 5种方法实现单例模式
  4. MySQL计划任务3(转)
  5. ug中模型不见了怎么办_关于UG参数化建模的定义
  6. React全家桶构建一款Web音乐App实战(五):歌曲状态管理及播放功能实现
  7. 火狐与Chrome浏览器的移动端调试模式(手机页面、自适应)
  8. C++ machine code与随机数 进阶习题
  9. 函数响应式编程及ReactiveObjC学习笔记 (三)
  10. 文本聚类python fcm_机器学习笔记----Fuzzy c-means(FCM)模糊聚类详解及matlab实现
  11. DOS windows PE三者有什么区别
  12. 哲学家就餐问题python_哲学家就餐问题的一种Python解决方案
  13. a标签 vue 动态点击_a链接的href怎么用vue动态生成
  14. 21条黄金法则,全面提升你的领导力
  15. 【教程】关于打开一些exe文件时,打开方式为microsoft store的解决办法
  16. PDF转word之后的结果事图片格式,如何改成.doc或.docx格式
  17. HDU6331Problem M. Walking Plan
  18. 云图科技,长沙VR全景打造旅游业新视角
  19. 抖音中的搞笑BGM如何提取,MP3转换器怎么使用
  20. intouch 开发源程序加密方法

热门文章

  1. EXCEL利用数组公式求多组数据的斜率、截距 或者其他。
  2. 最新mysql8.0.22忘记密码解决大法
  3. EditPlus的安装与破解
  4. 基于 SIMULINK 平面五杆机构运动学仿真
  5. 三、IP和IP地址区别和联系
  6. 数字通信第三章——数字调制方法概念
  7. python的ai写作_使用Python创建AI比你想象的轻松
  8. “超越”(MMCU)中文通用大语言模型测试集预发布
  9. BluePrism视频教程
  10. 动力节点数据结构课堂笔记 2021.11.23-11.29