web-dev-qa-db-ja.com

セマンティック差分ユーティリティ

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

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

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

105
jasonmray

このシナリオを正確に処理できるツールを開発しました。チェック http://www.semanticmerge.com

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

enter image description here

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

enter image description here

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

36
pablo

Eclipse はこの機能を長い間持ってきました。 「Structure Compare」と呼ばれ、とてもいいです。 Javaのスクリーンショットの例を次に示し、XMLファイルの別のスクリーンショットを示します。

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

Eclipse's Java Structure ComparerEclipse's XML Structure Comparer

29
Hosam Aly

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

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

上記の概算を行う、多くの言語で機能する構文ツリーベースの比較エンジンについては、 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を追加

14
Ira Baxter

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

" Aきめの細かいXML構造比較アプローチ "の結論は次のとおりです。

私たちの理論的研究と実験的評価は、提案された方法が、同じ時間の複雑さ(O(N ^ 2))

(強調鉱山)

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

12
bendin

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

HTML Tree Diffは、Pythonで記述されたxmlおよびhtmlドキュメントの構造を意識した比較を行います。

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

5

http://prettydiff.com/

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

2
austincheney

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

C#の場合、ReflectorへのAssembly diffアドインがありますが、C#ではなくILでの差分のみを行います。

Diffアドイン here [Zip]をダウンロードするか、codeplexサイト here のプロジェクトに移動できます。

2
Jonathan Parker

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

2
David V McKay