[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fUP9SY7XUyn_unhSt1dOmeCpRApaDTJseX3rHT4nIgWo":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},"2d59f625-ead9-4cfd-b944-3d56bd9ea19a","article","AST：AI 为什么不只是在“读代码文本”？","ast-ai-code-understanding","AST 把源代码从一串文本变成一棵结构树，帮助编辑器、静态分析器和 AI 编程工具理解函数、变量、调用与分支之间的关系。","## 代码不是一串字，而是一棵树\n\n很多人第一次使用 AI 编程工具时，会产生一种错觉：模型似乎“看懂了”代码。但从软件工具的角度看，真正的理解并不是把文件从头读到尾，而是先识别代码的结构。AST，也就是 Abstract Syntax Tree，中文通常译为抽象语法树，就是把源代码转换成一棵能表达结构的树。\n\n## AST 到底抽象了什么\n\n假设代码里有一句 `total = price * count`。人眼会把它看成一个计算式，解析器则会把它拆成赋值节点、变量节点和乘法节点。树的根部是赋值，左边是 `total`，右边又是一棵乘法子树，下面挂着 `price` 和 `count`。空格、换行和括号的部分细节可能不会成为核心节点，但“谁给谁赋值”“谁和谁相乘”会被保存下来。\n\n这和纯文本搜索的区别很大。搜索可以找到字符串 `count`，却不一定知道它是变量、注释里的单词，还是另一个对象的属性。AST 则可以回答“这个函数里所有返回值在哪里”“哪些调用传入了用户输入”“这次修改是不是只改变了条件表达式”。\n\n## AI 编程为什么需要它\n\nAI 生成代码时最怕两件事：改错位置，以及误解关系。只把相关文件塞进上下文，模型仍然可能把同名变量当成同一个变量，或者把字符串里的代码误判成真正的调用。结构化表示可以为模型提供更稳定的导航线索：函数、类、导入、调用、返回值和条件分支都能成为可检索的对象。\n\n这也是很多“智能重构”功能比普通文本替换可靠的原因。把变量重命名时，工具不是简单地替换所有同名字符串，而是先定位变量声明，再找到引用它的节点。AI 可以提出修改建议，AST 工具则帮助确认修改落在正确的结构上。\n\n## AST 不是程序的全部含义\n\nAST 仍然只是语法层。它能告诉我们代码长什么样，却不一定知道一个函数返回的对象在业务上代表订单、用户还是缓存。要理解跨文件引用、类型、控制流和数据流，还需要符号表、类型分析或更高层的程序图。因此，AI 看到 AST 并不等于真正理解业务。\n\n## 普通人怎样用这个术语\n\n当 AI 说“我已经理解了整个项目”时，可以追问它理解的是哪一层：文件结构、语法结构、类型关系，还是运行时行为。对于小改动，要求 AI 只修改指定函数并保持公开接口不变；对于大改动，让它先列出将影响的函数和调用方。这个习惯的本质，就是把“读文本”升级成“看结构”。\n\n想进一步了解代码结构如何被解析，可以阅读 [Tree-sitter 的语法树查询文档](https:\u002F\u002Ftree-sitter.github.io\u002Ftree-sitter\u002Fusing-parsers\u002Fqueries\u002F1-syntax.html)。","\u002Fuploads\u002F2026-09-14\u002F529ce69d-c781-4f61-9864-0294ae857718.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},"7c76bfc2-f80f-4ee0-a95d-27bd8708b434","技术","slug",{"id":36,"name":37,"slug":38},"4c2bbea6-eab7-40a8-8447-1de478ff7749","分析","analyse","官方资料","Tree-sitter","https:\u002F\u002Ftree-sitter.github.io\u002Ftree-sitter\u002Fusing-parsers\u002Fqueries\u002F1-syntax.html","published","AST 是什么？AI 编程为什么需要抽象语法树","用直观例子理解 AST、代码结构和 AI 编程工具如何进行结构化修改。",null,false,42,0,"2026-09-14T00:00:00.000Z","2026-09-14T15:01:25.949Z",[52,61,69],{"id":53,"type":6,"title":54,"slug":55,"summary":56,"coverUrl":57,"authorName":14,"sno":58,"publishedAt":59,"createdAt":60},"7cc644a5-e0de-4d7b-802e-9e8b69677e12","AI 生成的代码会不会复制开源项目","ai-code-open-source-reference-license","AI 生成代码不等于天然没有来源。本文区分常见写法与高相似片段，解释代码引用、许可证、依赖供应链和轻量来源检查，帮助团队把合规当成代码质量的一部分。","\u002Fuploads\u002F2026-09-13\u002F920327ad-de7f-4caa-a2f4-816d467c9f9c.jpg",40,"2026-09-13T00:00:00.000Z","2026-09-13T11:55:49.911Z",{"id":62,"type":6,"title":63,"slug":64,"summary":65,"coverUrl":66,"authorName":14,"sno":67,"publishedAt":59,"createdAt":68},"1ff2b0c1-c125-4469-a09c-b8ddbc5bf705","AI 写 SQL 和数据库迁移，为什么必须人工确认","ai-generated-sql-database-migrations","数据库迁移会改变持久数据、锁和应用契约，语法正确不代表上线安全。本文解释 AI 生成 SQL 的风险，介绍扩展、迁移、收缩的兼容策略，以及生产执行前应检查的门槛。","\u002Fuploads\u002F2026-09-13\u002F6e5177d7-f51a-4722-951b-0108e9b7ecae.jpg",41,"2026-09-13T11:55:59.196Z",{"id":70,"type":6,"title":71,"slug":72,"summary":73,"coverUrl":74,"authorName":14,"sno":75,"publishedAt":49,"createdAt":76},"9fba5da0-f476-4388-baca-0ccac55ae74a","CPG：把代码变成一张可以查询的关系图","code-property-graph-ai-code-analysis","代码属性图 CPG 把语法、控制流、数据流和调用关系放在同一张图中，帮助 AI Agent 理解大型代码库。","\u002Fuploads\u002F2026-09-14\u002F09363783-5faa-4365-9bde-fb995d9bbf80.jpg",44,"2026-09-14T15:01:36.014Z"]