代码索引工具调研

Posted by Shi Hai's Blog on January 12, 2023

一、相关协议

1. 语言服务器协议(LSP)

语言服务器协议定义了编辑器或IDE与语言服务器之间使用的协议,该语言服务器提供自动完成、转到定义、查找所有引用等语言功能。 架构设计图

2. 语言服务器索引协议(LSIF)

为了在开发工具或 Web UI 中支持丰富的代码导航,而无需源代码的本地副本。

3. LSP vs Kythe Schema

LSP/LSIF的核心目标是让IDE与工具之间,Web和代码索引之间能定义传输的一套标准协议,通过此协议提升交互效率,即复杂度从O(L*C)降低为O(L+C)。而Kythe的目的是为编程语言代码的语义信息提供一种公共语言来提升语言、客户端、构建系统之间的共享,即复杂度从O(LCB)降低为O(L+C+B),两者考虑问题的出发点有所不同,但最终要达成的目标:降低跨语言、跨平台交互/共享的复杂度 Kythe 领域模型定义

二、相关工具

  • google kythe/grok:Kythe 项目的成立是为了提供和支持工具和标准,以鼓励操作源代码的程序之间的互操作性。在高层次上,Kythe 的主要目标是提供一种标准的、与语言无关的交换机制,允许在源代码上运行的工具,通过定义与语言无关的协议和数据格式,用于将源代码信息表示、访问和查询为数据,Kythe 允许语言分析和索引作为服务运行。中心辐射模型将集成L语言、C 客户端和B构建系统的总体工作从最坏情况的 O(L×C×B)(生态系统规模的组合)减少到 O(L+C+B),有一套自己独立定义的领域模型来存储模型信息。实际在kythe中,在和外围工具交互层面,kythe已经实现了LSP协议 详情
  • 基于LSP协议的工具集
  • Code Search:谷歌在06年测试上线,该产品可以让用户在互联网搜索开放的源代码,交叉引用功能由kythe提供。
  • sourcegraph:可以对代码库进行语义索引和分析,受google codesearch启发。
  • opengrok:oracle发布的源代码搜索和交叉引用引擎,支持多语言,支持API、WEB交互,底层原子工具依赖universal-ctags,只能识别类、函数、变量等的定义位置,而模块间的依赖逻辑无法被识别。

三、功能支持

3.1 代码诊断

比如,python-language-server支持pylint扫描 支持lint,并通过LSP协议返回扫描结果。

三、引用文章