我正在尝试找到一些语义差异/合并实用程序的好例子。比较源代码文件的传统范例通过比较行和字符来工作..但是在比较文件时是否存在实际考虑代码的结构的任何实用程序(对于任何语言)?
例如,现有的差异程序将报告“在第125行的字符2处找到的差异。文件x包含v-o-i-d,其中文件y包含b-o-o-l”。一个专门的工具应该能够报告“返回类型的方法doSomething()从void更改为bool”。
我认为这种语义信息实际上是用户在比较代码时所寻求的,并且应该是下一代编程工具的目标。可用工具中是否有这方面的例子?
答案 0 :(得分:37)
我们开发了一种能够精确处理这种情况的工具。查看http://www.semanticmerge.com
它基于代码结构合并(和差异)而不使用基于文本的算法,这基本上允许您处理类似下面的案例,涉及强重构。它也能够呈现差异和合并冲突,如下所示:
而不是与正在移动的文本块混淆,因为它首先解析,它能够在每个方法的基础上显示冲突(事实上每个元素)。像以前一样的案例甚至不会有手动冲突来解决。
这是一种语言感知的合并工具,最终能够回答这个问题非常棒: - )
答案 1 :(得分:29)
答案 2 :(得分:14)
要做好“语义比较”,你需要比较语法树 语言,并考虑到符号的含义。真的 良好的语义差异将理解语言语义,并实现 当一个代码块在功能上与另一个代码块相同时。展望 到目前为止,这需要一个定理证明器,虽然它会非常 可爱,目前还不适用于真正的工具。
可行的近似就是简单地比较语法树和报告 插入,删除,移动或更改的结构方面的更改。 人们可以报告,更接近“语义比较” 当标识符在代码块中一致地更改时。
查看我们的http://www.semanticdesigns.com/Products/SmartDifferencer/index.html 对于使用多种语言的基于语法树的比较引擎,确实如此 以上近似值。
EDIT 2010年1月:可用于C ++,C#,Java,PHP和COBOL的版本。 该网站显示了其中大部分的具体示例。
2010年5月编辑:添加了Python和JavaScript。
2010年10月编辑:EGL补充道。
EDIT 2010年11月:VB6,VBScript,VB.net添加
答案 3 :(得分:11)
你正在摸索的是“树差异”。事实证明,这比简单的面向行的文本差异更难做,这实际上只是两个平面序列的比较。
“A Fine-Grained XML Structural Comparison Approach”的结论部分与:
我们的理论研究以及我们的实验评估 表明所提出的方法产生了改进的结构相似性结果 尊重现有的替代方案,同时具有相同的时间复杂度(O(N ^ 2))
(强调我的)
事实上,如果您正在寻找更多树差异的示例,我建议您关注XML,因为这一直在推动该领域的实际发展。
答案 4 :(得分:5)
我自己项目的无耻插件:
HTML Tree Diff对xml和html文档进行结构感知比较,用python编写。
答案 5 :(得分:2)
对此的解决方案将基于每种语言。即除非它设计的插件体系结构将代码的大量解析推迟到树中,并且与语言特定的插件进行语义比较,否则支持多种语言将非常困难。您对使用此类工具感兴趣的语言是什么?我个人喜欢C#。
对于C#,有一个反射器的程序集差异加载项,但它只对IL执行差异而不是C#。
答案 6 :(得分:2)
一家名为Zynamics的公司提供二进制级语义差异工具。它使用一种名为REIL的元汇编语言对二进制文件的两个版本进行图形理论分析,并生成一个颜色编码图形来说明它们之间的差异。我不确定价格,但我怀疑它是免费的。
答案 7 :(得分:2)
Pretty Diff缩小每个输入以删除注释和不必要的空白区域,然后在diff算法之前美化代码。无论如何,我想不出更多的代码语义。而且,它编写的JavaScript因此可以直接在浏览器中运行。