二次文本差异化的失配问题及其改进算法
2021-12-17公鑫杨春花
公鑫,杨春花
(齐鲁工业大学(山东省科学院)计算机科学与技术学院,济南 250300)
0 引言
现代大型软件的开发一般基于版本管理系统由多人协作完成,开发者每天将变更的代码提交到软件仓库中,而阅读和理解代码变更则成为代码评审以及日常开发和维护工作的基础[1-2]。
当前对代码变更的审阅一般在文本差异化分析(textual code differencing)工具提供的Hunk 集上进行。例如,图1 是典型的文本差异化分析工具GNUDiff 返回的一个Hunk 示例。一个Hunk 由一段连续的被删除(-)和插入(+)的行以及前后1~3 个上下文行构成。一个Hunk 集构成了源代码修改前后的代码变更,变更审阅者只需要查看这些Hunk,就可以知道代码哪里发生了什么改变,不需要人工对比2 个版本的源代码,提高了代码变更的理解效率。
对于复杂的变更,以行为单位的Hunk 结果不能展现Hunk 内部的具体变化。为此,许多工具如Kdiff3 和Beyond Compare 4、GitHub Diff等对Hunk内部的删除行和添加行之间进行二次差异化分析,从而获得细化的变更结果。图2 是Beyond Compare 4 对图1 的Hunk 进行二次差异化分析的结果,该结果展示在并排(side-by-side)窗口中,其中发生变化的行和单词(Token)进行了加亮显示。后文均默认新版本为右侧文本,老版本为左侧文本。Hunk 内的二次差异化分析方便用户快速理解Hunk 内行的具体变化,但是当前的二次差异化分析工具得出的结果存在失配现象,主要体现为行之间的失配和一个完整Token 的拆分现象。根据图2 的展示,老版本(左)的132~134 行被分析为与新版本(右)中第161~163行匹配对应;而新版本(右)中“Constraints”等单词(Token)的部分字符被分析为差异文本。……
