知识卡片
六类静态信息提取方法的权衡
内容
架构信息获取阶段通常通过静态分析(不运行程序,从源代码/设计文档/目录结构等文档出发)和动态分析(通过一次或多次运行收集程序间依赖关系)来进行,书中重点介绍六类主流静态方法,每一类都有各自的取舍。基于源代码:通过类似词法分析语法分析的手段对源码做文本分析或特征定位,速度快效率高,但如果程序里存在无意义的标识符命名,会直接影响分析结果的精确性——这类方法的准确性某种程度上取决于原作者的代码质量。基于编译构建过程:利用编译中间结果(AST、CFG、RTL文件等)解析函数调用关系,能拿到源码分析拿不到的信息,但这类信息可能存在大量冗余。基于数据流:在不执行程序的前提下分析数据对象间关系、关注定义到使用的过程,对确定系统的逻辑组件及其交互关系很重要,但往往忽略控制流依赖的影响,分析不够全面。基于程序切片:把程序简化到与某个特殊计算相关的语句子集,能帮助找出可能影响某个值的所有语句、揭示程序间乃至语句间的依赖关系,但应用于大型系统时生成的依赖图会过于复杂。基于设计文档:从系统设计文档、UML图、代码注释、用户手册等收集信息,建立对系统的概念认知,能获得需求、业务领域、服务内容、行为轮廓等源代码本身难以直接体现的信息。基于目录结构:把待分析程序的目录结构信息作为其他方法所获取信息的补充,用于提高组件划分的精确度——单独从目录结构出发信息量太少、且不能反映软件内部原始依赖关系,因此这类方法研究数量比较少,通常只是作为辅助手段而非主力方法。这六类方法共同揭示了一个规律:越贴近代码底层(源代码/编译中间结果)的方法越精确但越局部,越贴近人类意图(设计文档)的方法越能体现宏观业务语义但越容易过时失真,实际系统的架构恢复很少只依赖单一方法,而是多种信息来源相互补充校验。
参考来源
- 位置:《软件架构理论与实践》第10章《软件架构恢复》"10.1.2 架构信息提取"节(源文件:_epub-src/OEBPS/text00080.html)
- 结论依据:原文逐一说明基于源代码、编译构建过程、数据流、程序切片、设计文档、目录结构六类方法的做法及各自的优缺点(如"此类方法仅仅进行源代码扫描,速度快、效率高,但如果一个程序存在无意义的标识符,就可能会影响分析结果的精确性"),直接支撑本卡片结论。
- 原始内容:基于源代码(source code):通过构建类似于词法分析和语法分析的平台对程序源代码进行文本分析或特征定位……此类方法仅仅进行源代码扫描,速度快、效率高,但如果一个程序存在无意义的标识符,就可能会影响分析结果的精确性。