Mastery:支持代码移位感知的结构化合并算法
1. 引言
随着Git和SVN等版本控制系统的广泛应用,三方合并已成为现代软件开发中不可或缺的任务。三方合并场景包含程序的三个版本:基础版本(base)、左分支版本(left)和右分支版本(right)。左分支和右分支可能由不同开发者独立从基础版本演变而来。三方合并算法的目标是整合两个分支的更改,生成一个合并后的目标版本。当两个分支引入相互矛盾的更改时,算法会报告冲突,由开发者手动解决。
传统的无结构合并方法将程序视为纯文本行的序列,由于忽略了上下文无关语法,合并准确性欠佳,会出现一些本可避免的虚假冲突,增加了开发者手动解决冲突的负担。为提高合并准确性,近年来结构化合并方法受到了广泛关注,这种方法将程序表示为抽象语法树(AST)。结构化合并算法以不同程序版本之间的映射集作为输入,计算出合并后的版本作为输出,这些映射通过AST差异(也称为AST匹配)算法获得。
以往的结构化合并方法采用自上而下的顺序遍历AST,这种方式虽然自然直观,但难以检测和合并代码移位情况。为了在自上而下的方式中识别代码移位,可搜索最大公共嵌入子树,但该问题是NP难问题,在一般情况下难以近似求解。虽然有更可扩展的语法感知前瞻匹配方法,但前瞻仅适用于少数类型的AST节点,且为了效率考虑,最大前瞻距离较短,并且如何正确合并移位代码仍然是一个问题。
相反,自下而上的遍历顺序是更好的选择。检测代码移位的关键是允许跨AST层级的节点映射,自下而上的方式更自然且更容易实现这一点。同时,自上而下的合并无法处理跨层级映射,因此自下而上的合并是匹配阶段的必要后续步骤。不过,仅采用自下而上的访问有时会导致冗余计算。因此,本文结合了自上而下的剪枝过程和自下而上的过
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



