108

セマンティック diff/merge ユーティリティの良い例をいくつか見つけようとしています。ソースコードファイルを比較する従来のパラダイムは、行と文字を比較することによって機能します..しかし、ファイルを比較するときにコードの構造を実際に考慮するユーティリティはありますか?

たとえば、既存の diff プログラムは、「125 行目の 2 文字目に違いが見つかりました。ファイル x には void が含まれ、ファイル y には bool が含まれています」と報告します。特殊なツールは、「メソッド doSomething() の戻り値の型が void から bool に変更されました」と報告できるはずです。

このタイプのセマンティック情報は、ユーザーがコードを比較するときに実際に探しているものであり、次世代のプログラミング ツールの目標であるべきだと私は主張します。利用可能なツールにこれの例はありますか?

4

8 に答える 8

37

このシナリオを正確に処理できるツールを開発しました。http://www.semanticmerge.com を確認してください

テキストベースのアルゴリズムを使用せず、コード構造に基づいてマージ (および差分) します。これにより、基本的に、強力なリファクタリングを伴う次のようなケースに対処できます。以下に示すように、相違点とマージの競合の両方をレンダリングすることもできます。

ここに画像の説明を入力

また、移動するテキスト ブロックに混乱する代わりに、最初に解析するため、競合をメソッドごと (実際には要素ごと) に表示できます。前のようなケースでは、手動で競合を解決する必要さえありません。

ここに画像の説明を入力

これは言語対応のマージ ツールであり、最終的にこの SO の質問に答えることができたことは素晴らしいことです :-)

于 2013-04-23T07:15:12.793 に答える
30

Eclipseには長い間この機能がありました。それは「構造比較」と呼ばれ、とてもいいです。これは、Javaのサンプルスクリーンショットと、それに続くXMLファイルのスクリーンショットです。

(上部ペインのメソッドのマイナスアイコンとプラスアイコンに注意してください。)

EclipseのJava構造比較器 EclipseのXML構造比較子

于 2009-03-07T08:55:45.993 に答える
14

「意味比較」をうまく行うには、言語の構文木を比較し、記号の意味を考慮する必要があります。本当に優れたセマンティック差分は、言語のセマンティクスを理解し、コードの1つのブロックが別のブロックと機能的に同等である場合を認識します。ここまで進むには定理証明者が必要であり、非常にかわいいですが、現在のところ実際のツールには実用的ではありません。

これの実行可能な概算は、構文ツリーを比較し、挿入、削除、移動、または変更された構造に関する変更を報告することです。「セマンティック比較」にいくらか近づくと、コードのブロック全体で識別子が一貫して変更されたときに報告できます。

上記の近似を行う、多くの言語で動作する構文ツリーベースの比較エンジンについては、 http://www.semanticdesigns.com/Products/SmartDifferencer/index.htmlを参照してください。

2010年1月の編集:C ++、C#、Java、PHP、およびCOBOLで使用可能なバージョン。Webサイトには、これらのほとんどの具体例が示されています。

2010年5月の編集:PythonとJavaScriptが追加されました。

2010年10月編集:EGLが追加されました。

2010年11月編集:VB6、VBScript、VB.netが追加されました

于 2009-06-17T09:53:09.957 に答える
12

あなたが探しているのは「ツリー差分」です。これは、単純な行指向のテキスト diff (実際には 2 つのフラット シーケンスの比較にすぎません) よりもうまく行うのがはるかに難しいことがわかります。

" A Fine-Grained XML Structural Comparison Approach " は、次のように結論付けています。

私たちの理論的研究と実験的評価は、提案された方法が、同じ時間複雑性(O(N^2))を持ちながら、既存の選択肢に関して改善された構造的類似性の結果をもたらすことを示しました。

(私のものを強調)

実際、ツリー差分の例をさらに探しているのであれば、XML に焦点を当てることをお勧めします。XML は、この分野での実用的な開発を推進してきたからです。

于 2009-03-07T08:27:15.937 に答える
5

私自身のプロジェクトのための恥知らずなプラグイン:

HTML Tree Diff は、python で書かれた xml と html ドキュメントの構造を意識した比較を行います。

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

于 2011-02-09T16:55:23.230 に答える
2

これに対する解決策は、言語ごとになります。つまり、コードのツリーへの解析と言語固有のプラグインとのセマンティック比較の多くを延期するプラグインアーキテクチャで設計されていない限り、複数の言語をサポートすることは非常に困難です。そのようなツールを使用するためにどの言語に興味がありますか。個人的にはC#用のものが欲しいです。

C#の場合、Reflectorへのアセンブリdiffアドインがありますが、C#ではなくILでのみdiffを実行します。

ここからdiffアドインをダウンロードするか、ここからcodeplexサイトのプロジェクトにアクセスできます

于 2009-03-07T07:41:43.003 に答える
2

http://prettydiff.com/

Pretty Diff は、各入力を縮小してコメントと不要な空白を削除し、diff アルゴリズムの前にコードを美しくします。とにかく、これよりもコードのセマンティックになることは考えられません。また、JavaScript が記述されているため、ブラウザで直接実行されます。

于 2011-06-30T20:14:30.990 に答える
2

Zynamics という会社は、バイナリレベルのセマンティック差分ツールを提供しています。REIL と呼ばれるメタアセンブリ言語を使用して、バイナリの 2 つのバージョンのグラフ理論分析を実行し、それらの違いを示すために色分けされたグラフを生成します。価格はわかりませんが、無料だとは思えません。

于 2010-01-19T21:09:01.037 に答える