[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$frzRUvhae2t6y6AUFFcdi3Cn2DlEQ2Oafz_mmkrx7gb0":3},{"item":4,"related":51},{"id":5,"type":6,"title":7,"slug":8,"summary":9,"body":10,"coverUrl":11,"productScreenshots":12,"productLinks":13,"authorName":14,"authorUrl":15,"authorSubject":16,"category":17,"tags":22,"sourceLabel":39,"sourceName":40,"sourceUrl":41,"status":42,"seoTitle":43,"seoDescription":44,"canonicalUrl":45,"isFeatured":46,"sno":47,"sortOrder":48,"publishedAt":49,"updatedAt":50,"createdAt":50},"3317cf19-7a7e-453c-93bc-a210533d00bd","article","LSP 是编辑器和编程语言之间的共同语言","lsp-language-server-protocol-ai-coding","LSP 把编辑器与语言服务器之间的通信标准化，解释代码补全、跳转定义和 AI 编程工具的符号级理解从何而来。","## LSP 是编辑器和编程语言之间的共同语言\n\n代码补全、跳转定义、查找引用、悬停查看类型，这些功能看起来属于编辑器，其实很多智能都来自另一套程序：语言服务器。LSP，也就是 Language Server Protocol，把编辑器和语言服务器之间的通信方式标准化了，因此同一个语言服务器可以服务多个编辑器。\n\n## 没有 LSP 时会怎样\n\n如果每个编辑器都要自己实现一套 JavaScript、Python、Rust 的理解能力，工具厂商和语言社区都要反复开发相同功能。一个编辑器要支持十种语言，就可能需要维护十套深度集成。LSP 把问题拆成两部分：编辑器负责展示和交互，语言服务器负责理解某种语言。\n\n它们通过 JSON-RPC 等消息交换信息。编辑器可以询问“光标所在位置是什么类型”“这个符号在哪里定义”“这里有哪些可用补全”，语言服务器返回结构化结果。这样，编辑器不需要自己重建整个编译器前端。\n\n## AI 编程 Agent 为什么关心 LSP\n\n一个只会读取文件的模型，看到的是文本；一个能调用语言服务的 Agent，还可以获得符号级事实。它可以先请求某个函数的定义，再追踪调用方，最后只修改实际影响范围。这种信息比模型凭经验猜“可能在某个文件里”可靠得多。\n\nLSP 也能成为模型输出后的检查器。AI 提议新增一个参数后，语言服务器可以立即报告类型不匹配；AI 移动一个类后，工具可以列出失效引用。模型负责提出候选改动，语言服务负责提供一部分确定性反馈，两者形成互补。\n\n## LSP 的边界在哪里\n\nLSP 主要描述语言工具能力，不负责理解产品需求，也不能保证运行时数据正确。动态语言、代码生成、复杂宏和反射机制，都会让静态信息不完整。即使补全和跳转都正常，业务逻辑仍然可能是错的。\n\n## 使用时应该看什么\n\n如果 AI 编程工具声称“理解代码库”，可以观察它是否能准确跳转定义、列出引用、识别类型，并在修改后及时报告诊断。若它只能做全文搜索和文本替换，就不要把它的“理解”当成编译器级别的理解。\n\nLSP 的设计目标和协议细节可见 [Microsoft 官方 Language Server Protocol 页面](https:\u002F\u002Fmicrosoft.github.io\u002Flanguage-server-protocol\u002F)。","\u002Fuploads\u002F2026-09-14\u002F6522edcd-4aa3-47ff-a741-29ff201dcc2d.jpg",[],[],"Foundit","https:\u002F\u002Ffoundit.cn","foundit-ai-editorial",{"id":18,"name":19,"slug":20,"description":21},"6179d3b6-dc34-4483-9ded-3cd9f1b37a47","科普","abbreviation","介绍各领域新兴概念",[23,27,31,35],{"id":24,"name":25,"slug":26},"0848beb4-db26-4fb8-b391-f852a11be192","AI编程","ai-coding",{"id":28,"name":29,"slug":30},"144abe77-0dc6-4f66-a176-20bddb1c0bfa","编程","coding",{"id":32,"name":33,"slug":34},"a202d639-99a6-488a-a712-4d4c6ffd7e15","开发","dev",{"id":36,"name":37,"slug":38},"7c76bfc2-f80f-4ee0-a95d-27bd8708b434","技术","slug","官方资料","Microsoft Language Server Protocol","https:\u002F\u002Fmicrosoft.github.io\u002Flanguage-server-protocol\u002F","published","LSP 是什么？为什么 AI 编程工具需要语言服务器","从代码补全和跳转定义出发，理解 LSP 如何连接编辑器、语言服务器与 AI Agent。",null,false,53,0,"2026-09-14T00:00:00.000Z","2026-09-14T15:01:27.583Z",[52,60,68],{"id":53,"type":6,"title":54,"slug":55,"summary":56,"coverUrl":57,"authorName":14,"sno":58,"publishedAt":49,"createdAt":59},"54d83c94-d588-400d-9d13-42daa20331e2","CAS：文件的身份可以由内容决定","content-addressable-storage-ai-coding","内容寻址存储 CAS 用内容摘要识别文件和构建产物，解释 AI 编程工具、容器和缓存为什么能复用结果。","\u002Fuploads\u002F2026-09-14\u002F3fab23b3-8bcd-4a3b-bf5a-2ab895ce3a10.jpg",41,"2026-09-14T15:01:41.114Z",{"id":61,"type":6,"title":62,"slug":63,"summary":64,"coverUrl":65,"authorName":14,"sno":66,"publishedAt":49,"createdAt":67},"1be15b45-ad30-4bbf-b711-718a9ffc58b3","Tree-sitter：为什么编辑器不用每次重读整个文件？","tree-sitter-incremental-parsing-ai-coding","Tree-sitter 用增量解析和语法树帮助编辑器与 AI 编程工具只处理代码变化的局部，让搜索、补全和结构化修改更高效。","\u002Fuploads\u002F2026-09-14\u002Fc4a4730d-34e0-43bb-8d5c-bd79b20e1969.jpg",47,"2026-09-14T15:01:26.675Z",{"id":69,"type":6,"title":70,"slug":71,"summary":72,"coverUrl":73,"authorName":14,"sno":74,"publishedAt":49,"createdAt":75},"373f9a49-3705-46dc-823c-7ef1923f1b54","OpenAPI 如何让 AI 同时写前后端不“各说各话”？","openapi-ai-frontend-backend-contract","AI 可以分别生成前端和后端，却容易在字段、错误和时间格式上互相错位。本文解释 OpenAPI 如何把接口输入输出变成共同契约，再连接生成代码和契约测试。","\u002Fuploads\u002F2026-09-14\u002F4e99751f-020c-45dd-a87d-1a9fbb8f0f83.jpg",48,"2026-09-14T11:00:08.021Z"]