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


    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个:cqueryccls ,clangd ,它们应该都是基于 Clang的一些模块库组合加工而来的(关于Clang知识,看我这个博客 clang入门大全以及clang全家桶介绍_标biao的博客-CSDN博客

    • cquery:已经好久没有没有更新了,这个开源项目已经停滞了。所以我们不用考虑了
    • ccls:是cquery的续集以及增加新的功能,很不错
    • clangd: Clang 和 LLVM 的团队构建的,可以认为这是Clang官方在维护的

    现在分别来介绍这几种语言服务器的比较,可以参考的博客:

    认真看看上面这些博客,大概就能知道各自的优缺点了,我们总结一下它们的特点如下:

    总结

    由于,ccls是cquery的续集(发扬光大),所以cquery没必要讨论了。

    ccls和clangd 两者的解析都是由 libclang 完成的,但是例如索引实现是不同的。

    ccls

    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),找到三个:

  • 相关阅读:
    screw 一个简洁好用的数据库表结构文档生成工具
    通过java爬取动态网页
    C++ 的时间库:日历和时区
    365天挑战LeetCode1000题——Day 052 逐步求和得到正数的最小值 贪心
    Web3中文|元宇宙在商业中的最佳应用
    BCC源码内容概览(3)
    kafka 消费者 API 使用总结
    puppeteer实现网页截图
    浅谈VR AR MR XR CPS DT
    移植SQLite3、OpenCV到RV1126开发板上开发人脸识别项目
  • 原文地址:https://blog.csdn.net/kangkanglhb88008/article/details/126914648