我试图找到一些语义差异/合并实用程序的好例子.比较源代码文件的传统范例通过比较行和字符来工作..但是有没有任何实用程序(对于任何语言)在比较文件时实际考虑代码结构?
例如,现有的差异程序将报告"在第125行的字符2处找到的差异.文件x包含void,其中文件y包含bool".一个专门的工具应该能够报告"返回类型的方法doSomething()从void更改为bool".
我认为这种类型的语义信息实际上是用户在比较代码时所寻求的,并且应该是下一代编程工具的目标.可用工具中是否有这方面的例子?
我们开发了一种能够精确处理这种情况的工具.查看http://www.semanticmerge.com
它基于代码结构合并(和差异)而不使用基于文本的算法,这基本上允许您处理类似下面的案例,涉及强大的重构.它还能够呈现差异和合并冲突,如下所示:
而不是与被移动的文本块混淆,因为它首先解析,它能够在每个方法的基础上显示冲突(事实上每个元素).像以前一样的案例甚至不会有手动冲突来解决.
它是一种语言感知的合并工具,最终能够回答这个问题很棒:-)
Eclipse已经有很长一段时间了.它被称为"结构比较",它非常好.以下是Java的示例屏幕截图,其后是XML文件的另一个屏幕截图:
(请注意上部窗格中方法的减号和加号图标.)
要做好"语义比较",你需要比较语言的语法树,并考虑符号的含义.一个非常好的语义差异将理解语言语义,并实现当一个代码块在功能上与另一个代码块相同时.走这么远需要一个定理证明器,虽然它非常可爱,但对于真正的工具来说,目前还不实用.
一个可行的近似方法是简单地比较语法树,并报告插入,删除,移动或更改的结构方面的变化.更接近"语义比较",可以报告何时在一段代码中一致地更改标识符.
请参阅我们的http://www.semanticdesigns.com/Products/SmartDifferencer/index.html ,了解适用于多种语言的基于语法树的比较引擎,它可以进行上述近似.
编辑2010年1月:可用于C++,C#,Java,PHP和COBOL的版本.该网站显示了其中大部分的具体示例.
编辑2010年5月:添加了Python和JavaScript.
编辑2010年10月:EGL补充道.
编辑2010年11月:VB6,VBScript,VB.net补充说
你正在摸索的是一个"树差异".事实证明,这比简单的面向行的文本差异更难做,这实际上只是两个平面序列的比较.
" 细粒度XML结构比较方法 "的结论部分包括:
我们的理论研究以及我们的实验评估表明,所提出的方法相对于现有的替代方案产生了改进的结构相似性结果,同时具有相同的时间复杂度(O(N ^ 2))
(强调我的)
实际上,如果你正在寻找更多树差异的例子,我建议关注XML,因为这推动了该领域的实际发展.
我自己项目的无耻插件:
HTML Tree Diff对用xthon编写的xml和html文档进行结构感知比较.
http://pypi.python.org/pypi/html-tree-diff/0.1.0