图解 · 运行过程 · 工程取舍
代码检索不能只靠“语义相近”
grep、AST、LSP、调用图各自看到什么?
配套正文:F30基础课
动态图解 · F30
代码检索不能只靠“语义相近”
grep、AST、LSP、调用图各自看到什么?
同一个函数名可能出现在注释、字符串、不同模块的同名函数中。文本搜索先定位线索,语法分析区分结构,语言服务帮助解析具体符号,运行和测试才告诉你这条路径是否真的触发。它们像不同视角的检查,不是越多越好地全部跑一遍。
AST按语言语法组织的代码结构树。
LSP让编辑器查询符号、引用和诊断等信息的协议。
调用图以函数为节点、可能的调用为边的关系图。
输入与适用条件:以foo为教学符号,不指向用户仓库。调用图可能受动态调用、条件编译与运行配置影响。
1 / 6 · 文本搜索
第1步,共6步
窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。
搜索命中不代表命中的是实际执行的函数。
本步状态由图形与说明共同给出。默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。
逐步说明与计算记录
以下解释全部展开,与播放器使用同一份数据;不是另换输入的第二个算例。
1.文本搜索
搜索命中不代表命中的是实际执行的函数。
2.语法结构AST
“# foo”是注释,不应算成调用。
3.符号解析LSP
同名函数需要结合模块、导入和类型环境判断。
4.调用关系
调用图提供候选影响范围;动态语言可能有静态分析看不到的边。
5.版本与环境
旧commit的引用关系不能当成当前工作区的事实。
6.测试与运行
读到代码是证据的一种;执行路径与回归结果能进一步排除错误解释。
为什么需要
用代码自身结构减少无关阅读与误定位。
怎样实现
从最便宜且准确的路径/符号检索开始,证据不足再扩大。
可能的代价与误解
一上来全库语义扫描可能漏精确符号,同时浪费上下文。
如何判断是否做对
对已知缺陷记录实际入口、定义、调用者、版本和失败测试是否一致。