图解 · 运行过程 · 工程取舍

代码检索不能只靠“语义相近”

动态图解约 1 千字1 组分步图解

grep、AST、LSP、调用图各自看到什么?

配套正文:F30基础课

动态图解 · F30

代码检索不能只靠“语义相近”

grep、AST、LSP、调用图各自看到什么?

同一个函数名可能出现在注释、字符串、不同模块的同名函数中。文本搜索先定位线索,语法分析区分结构,语言服务帮助解析具体符号,运行和测试才告诉你这条路径是否真的触发。它们像不同视角的检查,不是越多越好地全部跑一遍。

AST按语言语法组织的代码结构树。
LSP让编辑器查询符号、引用和诊断等信息的协议。
调用图以函数为节点、可能的调用为边的关系图。

输入与适用条件:以foo为教学符号,不指向用户仓库。调用图可能受动态调用、条件编译与运行配置影响。

1 / 6 · 文本搜索

第1步,共6步

窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。

代码检索不能只靠“语义相近”:文本搜索文本搜索找到字符串 foo语法结构AST区分函数定义与注释符号解析LSP确定引用实际绑定哪个定义调用关系查谁调用它、受什么条件控制版本与环境核对当前源码和依赖配置测试与运行用执行证据验证候选原因教学流程;高亮表示当前步骤,不表示真实耗时比例。

搜索命中不代表命中的是实际执行的函数。

本步状态由图形与说明共同给出。

默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。

逐步说明与计算记录

以下解释全部展开,与播放器使用同一份数据;不是另换输入的第二个算例。

1.文本搜索

搜索命中不代表命中的是实际执行的函数。

2.语法结构AST

“# foo”是注释,不应算成调用。

3.符号解析LSP

同名函数需要结合模块、导入和类型环境判断。

4.调用关系

调用图提供候选影响范围;动态语言可能有静态分析看不到的边。

5.版本与环境

旧commit的引用关系不能当成当前工作区的事实。

6.测试与运行

读到代码是证据的一种;执行路径与回归结果能进一步排除错误解释。

为什么需要

用代码自身结构减少无关阅读与误定位。

怎样实现

从最便宜且准确的路径/符号检索开始,证据不足再扩大。

可能的代价与误解

一上来全库语义扫描可能漏精确符号,同时浪费上下文。

如何判断是否做对

对已知缺陷记录实际入口、定义、调用者、版本和失败测试是否一致。

输入关键词即可检索。

↑ ↓ 选择 Enter 打开Esc 关闭 · 仅本地搜索

阅读设置

阅读设置仅保存在本机浏览器,不上传任何数据。