一句话定义:LSP(Language Server Protocol,语言服务器协议)是编辑器和语言分析程序之间的一套通用通信标准,让补全、跳转定义、报错这些能力"一次实现,到处复用"。
它解决的是什么问题
在 LSP 出现前,M 个编辑器要支持 N 种语言,就得写 M×N 套重复的解析逻辑。微软在 2016 年提出并开源 LSP 后,这件事变成 M+N:做语言的一方只维护一个"语言服务器",做编辑器的一方只接一次协议,两边通过标准消息对话。
打个比方,LSP 像外卖平台的通用接口。餐厅(语言服务器)只管做菜,骑手 App(编辑器)只管送,双方约定的只有菜单格式和取餐窗口。任何餐厅能接任何 App,不用为每家平台重写一遍厨房。协议里的消息,就是点单、出餐、催单这些通知。
对 AI 最有价值的三类消息
- 定义与引用(definition / references):这个符号在哪定义、被谁调用
- 类型信息(hover / typeDefinition):这个变量到底是什么类型
- 诊断(diagnostics):类型检查器和编译器报出的错误与警告
这三类信息有两个共同点:来自真正的编译器前端,而不是靠相似度猜;只包含当前任务需要的那一小块。
和相邻概念的区别
- 对比"把整个仓库塞进上下文":检索出来的代码片段是模糊的,LSP 给出的符号解析是确定的。前者可能捞到十个同名函数,后者明确告诉你"就是这个"。
- 对比 Tree-sitter:Tree-sitter 只回答"语法是否合法",不解析符号归属;LSP 背后往往是完整类型系统,能回答"这个
user是哪个模块的user"。 - 对比 MCP:LSP 管的是编辑器 ↔ 语言服务器,MCP(Model Context Protocol)管的是模型 ↔ 外部工具和数据源。被放在一起讲,是因为思路相同——都用统一接口替代点对点适配。
| 维度 | 整个仓库丢给 AI | 通过 LSP 提供上下文 |
|---|---|---|
| 内容 | 大量未筛选代码 | 定义、类型、引用、诊断 |
| 精准度 | 靠相似度猜 | 编译器判定 |
| 成本 | 上下文大、消耗高 | 只带相关片段 |
| 时效 | 依赖索引快照 | 编辑器实时结果 |
实际意义
对做 AI 编程工具的人,LSP 是一个现成的高信噪比上下文接口,不必自己重造符号解析;对普通开发者,这意味着 AI 补全和修 bug 的表现,越来越取决于它有没有接上你项目里已经在跑的语言服务器,而不只是模型多大。某种意义上,编译器报错信息本身就是最好的提示词——它精确指出了问题所在,还带着位置和类型。
各家语言服务器实际支持哪些能力、编辑器如何暴露给 AI,以官方文档为准。
