语义差异实用程序

时间:2009-02-07 06:37:08

标签: language-agnostic diff semantics

我正在尝试找到一些语义差异/合并实用程序的好例子。比较源代码文件的传统范例通过比较行和字符来工作..但是在比较文件时是否存在实际考虑代码的结构的任何实用程序(对于任何语言)?

例如,现有的差异程序将报告“在第125行的字符2处找到的差异。文件x包含v-o-i-d,其中文件y包含b-o-o-l”。一个专门的工具应该能够报告“返回类型的方法doSomething()从void更改为bool”。

我认为这种语义信息实际上是用户在比较代码时所寻求的,并且应该是下一代编程工具的目标。可用工具中是否有这方面的例子?

8 个答案:

答案 0 :(得分:37)

我们开发了一种能够精确处理这种情况的工具。查看http://www.semanticmerge.com

它基于代码结构合并(和差异)而不使用基于文本的算法,这基本上允许您处理类似下面的案例,涉及强重构。它也能够呈现差异和合并冲突,如下所示:

enter image description here

而不是与正在移动的文本块混淆,因为它首先解析,它能够在每个方法的基础上显示冲突(事实上每个元素)。像以前一样的案例甚至不会有手动冲突来解决。

enter image description here

这是一种语言感知的合并工具,最终能够回答这个问题非常棒: - )

答案 1 :(得分:29)

Eclipse已经有这个功能很长一段时间了。它被称为“结构比较”,它非常好。下面是Java的示例屏幕截图,后面是另一个XML文件:

(请注意上部窗格中方法的减号和加号图标。)

Eclipse's Java Structure Comparer Eclipse's XML Structure Comparer

答案 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编写。

http://pypi.python.org/pypi/html-tree-diff/0.1.0

答案 5 :(得分:2)

对此的解决方案将基于每种语言。即除非它设计的插件体系结构将代码的大量解析推迟到树中,并且与语言特定的插件进行语义比较,否则支持多种语言将非常困难。您对使用此类工具感兴趣的语言是什么?我个人喜欢C#。

对于C#,有一个反射器的程序集差异加载项,但它只对IL执行差异而不是C#。

您可以下载差异加载项here [zip]或转到codeplex网站here上的项目。

答案 6 :(得分:2)

一家名为Zynamics的公司提供二进制级语义差异工具。它使用一种名为REIL的元汇编语言对二进制文件的两个版本进行图形理论分析,并生成一个颜色编码图形来说明它们之间的差异。我不确定价格,但我怀疑它是免费的。

答案 7 :(得分:2)

http://prettydiff.com/

Pretty Diff缩小每个输入以删除注释和不必要的空白区域,然后在diff算法之前美化代码。无论如何,我想不出更多的代码语义。而且,它编写的JavaScript因此可以直接在浏览器中运行。