知识卡片
五类架构恢复技术与自动化工具的精度天花板
内容
在拿到信息之后,架构恢复阶段主要有五类技术把这些低层次信息逐步抽象成组件。基于领域知识:借助领域知识理解源代码或架构设计、识别标准组件,可自顶向下(从设计文档用户手册出发整理架构)或自底向上(从代码的注释/文件名/变量名声明出发运用领域知识恢复架构),但需要大量人工参与,只适合小型项目。基于聚类:目前自动化架构恢复中最主流的技术,把没有类别标示的实现级实体(文件、类、函数)按某种准则划分为若干子集,相似的归一类、不相似的归不同类,早期简单分割聚类算法效果并不理想,近年DSM、WCA、Bunch等算法被提出改进效果。基于机器学习:从源代码提取实体特征后用数据训练集训练组件识别,一般不单独使用、而是作为聚类算法的补充精度提升手段,问题在于训练集(通常是已知架构的软件或既有版本)获取比较困难。基于概念分析:基于形式概念分析(FCA)从源代码识别概念结构,把具有共同特征的对象集合成组件,应用格理论识别特征、模式和模块。基于模式匹配:把恢复过程建模为高层模式图(来自专家知识和设计文档)与实体关系图(源代码系统实体表示)之间的图模式匹配问题,是半自动化技术,需要人工参与,且图匹配本身消耗大量计算资源和时间。国际上最具代表性的自动化技术包括ACDC(模式匹配+聚类)、WCA(层次化聚类,用特征向量聚类实现级实体)、LIMBO(层次化聚类,用概要制品聚类)、Bunch(爬山算法聚类,追求最大功能实体分割)、ZBR(文本信息+分层算法+权重方案)、ARC(文本信息+机器学习+层次聚类)。但一项对这六种技术的实测评价给出了一个值得警惕的结论:对Bash系统(C语言,70KLOC)和ArchStudio系统(Java,280KLOC)做架构恢复时,主流方法对C语言系统的恢复精度普遍在60%以下、对Java语言系统的精度普遍在80%以下——依赖关系信息越简单(如只用include依赖),恢复精度越差;信息越详尽(如用符号依赖),精度越好。而对于近千万行代码的超大型项目(如Chromium),架构恢复往往需要上百小时的CPU时间,效率会大打折扣。这组数据说明架构恢复技术目前远未成熟到可以完全替代人工理解或权威文档,它更适合作为辅助手段而非唯一依据。