32

プログラミング言語用の diff/merge ツールはありますか。これは、構文を認識した方法で (XML Diff Tool のように) 動作し、行ごとに比較する以上のことを行います (オプションで空白を無視します)。

私は、実際に言語の構文と区切り記号に従っているプログラム、構文の正確さを損なうことなく変更を提案するプログラム、または複数の行に分割されたステートメントをまとめるプログラムに興味があります。動作例は次のとおりです。

*追加のネスト レベルを導入する an を見つけると、数行下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

セマンティックマージ
Web サイトからサポートされている言語:

C# と Vb.net から始めて、Java を追加しました。現在、C は既にサポートされており、フィードバックに応じて、C++、Objective-C、および JavaScript に焦点を当てます。

于 2013-04-17T21:02:57.723 に答える
14

KDiff3は文法のコンテキストで構文要素を比較しませんが、「行全体が変更された」よりも粒度が高く、行内の変更された部分を正確に強調表示します

私の経験では、変更を検出するための非常に優れたアルゴリズムがあります。上記の例を考えると、そのままで function_A と function_B を正しく比較できます。

function_A と function_B の比較

それでも、たとえば次のように、アルゴリズムが必要なものと一致しない場合:

新旧機能比較_A

比較を実行したい場所に同期マークを配置することで、いつでも手動でオーバーライドできます。

代替案 1:

sync1 を使用した新旧の function_A の比較

代替案 2:

sync2 を使用した新旧 function_A の比較

于 2011-02-25T12:28:29.033 に答える
11

Bram Cohen (BitTorrent 作成者) の Patience Diff アルゴリズム (bazaar バージョン管理システムで使用されている) に興味があるようですね。

The diff problem has been resolvedを参照してください。特に、Patience Diff Advantagesを参照してください。

2 番目のリンクからの抜粋:

忍耐の差分のもう 1 つの利点は、単純に一致してはならない行に一致しないことが多いことです。たとえば、コードのセクションを完全に書き直した場合、このが示すように、各バージョンの空白行と一致しないはずです。最後に、次の例があります。

 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 を比較する前に整形することがサポートされています。2 つの C ファイルを比較する前に、GNU Indent をセットアップして構文を標準化できます。
  • オプションの行の太さ。たとえば、右中かっこなど、マッチングにより高い重みを付けることができます。この機能は試していません。
  • old_variable_name置換。単一のセッションで、左側が右側に置き換えられたすべての場所を無視しnew_variable_nameます。

これは、私が使用した中で最高の差分とマージ ツールです。また、クロス プラットフォームであり、安価 (標準で 30 ドル、プロで 50 ドル) で、非常に寛大な評価期間があるので、試してみる価値があります。

于 2011-03-02T16:28:15.560 に答える
6

Compare++を見てください。

C/C++、Java、C#、Javascript、CSS などの言語を認識した構造化比較を実行できます。オプションで、コメント、純粋な書式設定、空白、および大文字と小文字の変更を無視し、C++ 関数などの移動セクションを整列する独自の機能を備えています。 、Java 名前空間、C# メソッド、CSS セレクター、...

于 2012-03-07T09:37:34.317 に答える
6

SmartDifferencerツールを参照してください。

SmartDifferencer は言語固有であり、製品品質の言語パーサーによって駆動され、AST を構築し、ツリーを比較します。これにより、テキストのレイアウトや介在するコメントから完全に独立したものになります。驚くべきことに、リテラルによって表される実際の値が異なっていなければ、リテラルのテキストの変更 (基数、小数点の移動 + 指数の変更、異なるエスケープ シーケンス) の影響を受けません。結果は、言語構文用語、および妥当な編集アクション (移動、コピー、挿入、削除、ブロック内の名前変更識別子) で報告されます。

C#、Java、C++、Python、およびその他のさまざまな言語のバージョンがあります。これらの各例は、Web サイトにあります。

C 用の SmartDifferencer は存在しますが、完全なコンパイラ コマンド ラインを使用せずに C ファイルを解析すると問題が発生することがあります。この状況を改善するために取り組んでいます。

于 2011-02-26T03:57:17.113 に答える
3

Eclipseを使用している場合、統合された比較エディターは、少なくともJavaの場合、構文に対応した差分/マージを提供します。「一般/比較/パッチ」設定で「構造比較を自動的に開く」にチェックを入れ、比較エディタで「Java構造比較」を選択します。

于 2011-03-03T17:04:15.423 に答える