当前位置:  开发笔记 > 编程语言 > 正文

语义差异实用程序

如何解决《语义差异实用程序》经验,为你挑选了5个好方法。

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

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

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



1> pablo..:

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

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

在此输入图像描述

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

在此输入图像描述

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



2> Hosam Aly..:

Eclipse已经有很长一段时间了.它被称为"结构比较",它非常好.以下是Java的示例屏幕截图,其后是XML文件的另一个屏幕截图:

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

Eclipse的Java结构比较器 Eclipse的XML结构比较器


Structure Compare是否允许您像其他源代码控制合并编辑器一样合并更改?即将此方法从此版本复制到另一个版本.

3> Ira Baxter..:

要做好"语义比较",你需要比较语言的语法树,并考虑符号的含义.一个非常好的语义差异将理解语言语义,并实现当一个代码块在功能上与另一个代码块相同时.走这么远需要一个定理证明器,虽然它非常可爱,但对于真正的工具来说,目前还不实用.

一个可行的近似方法是简单地比较语法树,并报告插入,删除,移动或更改的结构方面的变化.更接近"语义比较",可以报告何时在一段代码中一致地更改标识符.

请参阅我们的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补充说


嗨艾拉,你有关于你的差异算法的论文吗?我找不到树编辑距离差异文献.谢谢,特伦斯.
@Terence:我们的diff算法没有出版物.它是Levenstein最小距离计算,使用后缀树来识别相同的子树,并使用一些huerstics来处理重命名.IIRC,杨在软件实践和经验方面有一篇关于此的论文.我们和杨的是diff2,而不是diff3.

4> bendin..:

你正在摸索的是一个"树差异".事实证明,这比简单的面向行的文本差异更难做,这实际上只是两个平面序列的比较.

" 细粒度XML结构比较方法 "的结论部分包括:

我们的理论研究以及我们的实验评估表明,所提出的方法相对于现有的替代方案产生了改进的结构相似性结果,同时具有相同的时间复杂度(O(N ^ 2))

(强调我的)

实际上,如果你正在寻找更多树差异的例子,我建议关注XML,因为这推动了该领域的实际发展.



5> Christian Ou..:

我自己项目的无耻插件:

HTML Tree Diff对用xthon编写的xml和html文档进行结构感知比较.

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

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有