32

是否有任何用于编程语言的 diff/merge 工具,它以语法感知的方式工作(如 XML Diff Tool),不仅仅是逐行比较(并且可以选择忽略空格)。

我对一个实际上遵循语言语法和分隔符的程序感兴趣,它在不破坏语法正确性的情况下提出更改建议,或者将语句捆绑在多行中。示例行为是:

*在找到if(){引入额外嵌套级别的一个时,会自动将右括号}与它下面的几行捆绑在一起。)

*将匹配的语法元素保持在一起,避免像删除块这样的愚蠢往往会创建:

 int function_A()
 { 
     int ret;
     ret = something;
     ret += something_else;

      return ret;
  }

  int function_B()
  { 
     if(valid)
     {
         int ret;
         ret = something;
         ret += something_else;

          return ret;
      }

       else return -1;
  }

就个人而言,我很想找到能够处理 C++ 语法的软件,但了解其他语言的解决方案也会很有趣。

4

8 回答 8

20

语义合并
支持的语言,来自网站:

我们从 C# 和 Vb.net 开始,然后添加了 Java。现在已经支持 C,然后我们将专注于 C++、Objective-C 和 JavaScript,具体取决于您的反馈

于 2013-04-17T21:02:57.723 回答
14

虽然KDiff3不比较语法上下文中的语法元素,但它确实比“整行更改”具有更高的粒度,并且它会准确突出显示一行中发生更改的部分。

根据我的经验,它有一个非常好的算法来检测变化。鉴于上面的示例,它正确比较了 function_A 和 function_B 开箱即用:

函数_A和函数_B的比较

即便如此,如果算法无法匹配您想要的,例如如下所示:

新旧功能对比_A

您始终可以通过将同步标记放置在您希望它执行比较的位置来手动覆盖。

备选方案 1:

新旧函数_A与sync1的比较

备选方案 2:

新旧函数_A与sync2的比较

于 2011-02-25T12:28:29.033 回答
11

听起来您可能会对 Bram Cohen(BitTorrent 创建者)的 Patience Diff 算法(用于集市版本控制系统)感兴趣。

请参阅差异问题已解决,尤其是耐心差异优势

摘自第二个链接:

耐心差异的另一个优点是它经常不匹配那些简单不应该匹配的行。例如,如果您完全重写了一段代码,则它不应匹配每个版本中的空白行,如本所示。最后,有这个例子:

 void func1() {
     x += 1
 }

+void functhreehalves() {
+    x += 1.5
+}
+
 void func2() {
     x += 2
 }

这很简单明了,但通常 diff 算法会这样解释:

 void func1() {
     x += 1
+}
+
+void functhreehalves() {
+    x += 1.5
 }

 void func2() {
     x += 2
 }
于 2011-03-03T06:59:55.950 回答
9

Beyond Compare 可以满足您的要求。它不保持语法正确性或一次比较语言块,但它可以执行以下操作:

  • 对语言语法有一定的了解,因此它可以对比较文件进行语法突出显示,它还可以识别并选择性地忽略不重要的差异(如注释,包括多行注释)。
  • 支持使用外部转换程序加载和保存数据。开箱即用,它支持在比较之前使用它来美化 XML 和 HTML。在比较两个 C 文件之前,您可以设置 GNU Indent 以标准化语法。
  • 可选的线宽,让您对匹配给予更高的权重,例如右大括号。我没有尝试过这个功能。
  • 替换,在单个会话中忽略old_variable_name左侧被new_variable_name右侧替换的每个位置。

它是迄今为止我用过的最好的 diff-and-merge 工具。它也是跨平台的,价格便宜(标准版 30 美元,专业版 50 美元),并且评估期非常宽松,因此值得一试。

于 2011-03-02T16:28:15.560 回答
6

请参阅我们的SmartDifferencer工具。

SmartDifferencers 是特定于语言的,由生产质量语言解析器驱动,构建 AST 并比较树。这使得它们完全独立于文本布局和干预评论;值得注意的是,如果由文字表示的实际值没有不同,它们不受文字文本的更改(基数、移动小数点+更改指数、不同的转义序列)的影响。结果以语言语法术语和合理的编辑操作(移动、复制、插入、删除、rename-identifier-within-block)报告。

有 C#、Java、C++、Python 和各种其他语言的版本。网站上有每一个的例子。

C 存在 SmartDifferencer,但在没有完整编译器命令行的情况下解析 C 文件有时会出现问题,因此有时它会失败,您必须回退到更原始的比较工具,例如 diff。我们正在努力改善这种情况。

于 2011-02-26T03:57:17.113 回答
6

请看比较++

它可以对 C/C++、Java、C#、Javascript、CSS 等进行语言感知的结构化比较,并且可以选择忽略注释、纯格式、空白和大小写更改,并具有对齐移动部分(如 C++ 函数)的独特能力, Java 命名空间, C# 方法, CSS 选择器, ...

于 2012-03-07T09:37:34.317 回答
3

如果您使用的是 eclipse,则集成的比较编辑器提供了语法感知差异/合并,至少对于 Java。选中“General/Compare/Patch”首选项下的“Open Structure Compare automatically”,然后在比较编辑器中选择“Java Structure Compare”。

于 2011-03-03T17:04:15.423 回答
1

查看https://en.wikipedia.org/wiki/Comparison_of_file_comparison_tools尤其是列结构化比较。

目前只有两种工具能够理解语言结构。

  • 比较++(适用于 C++)
  • Pretty Diff(用于几种基于 Web 的语言的语言感知代码比较工具。它还美化、缩小和其他一些东西..)

不幸的是,许多工具的这一列仍然是空的。

于 2017-09-04T10:59:21.833 回答