セマンティック差分ユーティリティ[終了]


105

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

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

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


3
木の編集距離についていくつかの調査が行われたようです。それをASTに適用することは、最初に試すことのようです。(誰かがこの種のものを書きたいと思ったなら。)
ジェイ・コミネック2009

2
それが本当に役立つかどうかはわかりません。あなたが言及したような違いがより簡単にあなたは違いの強調表示ツール持っている場合は特に、読むよりも、見ている内にラインを。変更されていないコードが移動されたかどうかを認識する機能は、より簡単で便利です。
UncleZeiv 2009

2
@UncleZeiv機能がツールの性質から自然に続くことを願っています。また、静的メソッドがグループ化されているので、誰かが経て、例えば、中括弧やインデントのスタイルを変更、またはファイルを並び替える場合は変更、など。が存在しないことを検出することができるだろう
jasonmray

8
Visual Studioでこれが必要になりました。チーム内の開発者にdiffを容易にするために同じフォーマット構造を使用することを強いることは、後方に考えています。コードはチェックイン時に標準にフォーマットする必要があり、開発者がファイルを開くときは常に、好みに合わせてフォーマットする必要があります。このような考え方は今のところあまり広まっていません。
ラングドン、

3
私見これはSOにとって素晴らしいトピックです。これに同意する場合は、「再開」に投票してください
Ira Baxter

回答:


37

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

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

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

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


SVNと統合することは可能ですか?
以前の

1
ただし、LinuxとMacのバージョンは古いものです。
Michael Piefel

29

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

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

EclipseのJava構造比較 EclipseのXML構造比較ツール


3
構造比較では、他のソース管理マージエディターのように変更をマージできますか?つまり、このバージョンから他のバージョンにこのメソッドをコピーします。
ジョナサンパーカー

1
はい、変更または差異を(上部または下部のペインで)選択すると、ツールバーのボタン(スクリーンショットに表示)を使用して、変更を左から右に、またはその逆にコピーすることができます。
Hosam Aly

1
残念ながら、スクリーンショットは(最高に支持され承認された)回答に表示されなくなりました。もう一度提出してもらえますか?
blubb

@blubbご連絡ありがとうございます。Java Comparerイメージのエラーを修正しました。XML構造比較ツールのスクリーンショットをすぐに追加してみます。
Hosam Aly 2013

1
そして、それはJava以外の言語でも機能しますか?
einpoklum 2017年

14

「セマンティック比較」を正しく行うには、言語の構文ツリーを比較し、記号の意味を考慮する必要があります。非常に優れたセマンティック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を追加


2
こんにちはイラ、あなたはあなたの差分アルゴリズムに関する論文を発表しましたか?ツリー編集の距離の差分の文献を見つけるのに苦労しています。ありがとう、テレンス。
Terence Parr

具体的には、単純なdiff2ではなくdiff3を探します
Terence Parr

2
@テレンス:差分アルゴリズムの公開はありません。これは、サフィックスツリーを使用して等しいサブツリーを識別し、名前変更を処理するためのいくつかのヒューリスティックスを使用したレベンシュタイン最小距離計算です。IIRC、Yangはこれに関するソフトウェアの実践と経験に関する論文を発表しました。私たちとヤンはdiff2ではなく、diff3です。
Ira Baxter

@IraBaxterリンクは現在壊れており、Googleリンクから開いたときにサイトがダウンしているようです。
–RăzvanFlavius Panda 2017

サイトはバックアップされています。リンクに問題はありません。
Ira Baxter

12

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

きめの細かいXML構造比較アプローチ」は、次のようにまとめています

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

(強調鉱山)

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


リンクをありがとう。セマティックdiffツールを実装するためのいくつかの異なるアプローチを考えることができます、そしてあなたは正しいです-ほとんどは「ツリーdiff」に抽象化することができます。より複雑な状況では、「グラフの差分」に抽象化する必要がある場合もあります。
jasonmray 2009年

うん。IBMのRational Modeler(Eclipse上に構築)は、UMLモデル(2つのモデルの違いをグラフィカルに表示)でこれを実行しようとします。あまり使わないので、結果の有用性についてはコメントできません。
ベンディン2009年

他の構造(Javaコードなど)を表すためのスキーマを簡単に思い付き、XMLベースのツリー差分を使用してコード差分を実装できるので、XMLが出発点として適していることに同意します。
jasonmray 2009年

「これを行う」=>「グラフの差分」のようなものを実行します。
ベンディン2009年

1
多くの言語で機能する構文ツリーベースの比較エンジンについては、semdesigns.com / Products / SmartDifferencer / index.htmlを参照してください。
Ira Baxter、


2

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

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

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


1
言語プラグインスタイルを正確に使用して、多くの言語で機能する構文ツリーベースの比較エンジンについては、semdesigns.com / Products / SmartDifferencer / index.htmlを参照してください。まだリリースされていませんが、C#バージョンは非常に近いです。
Ira Baxter

2010年1月:C#Smart Differencerがリリースされました。
Ira Baxter

2

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


バイナリレベルのセマンティック差分へのリンク:zynamics.com/bindiff.html
emallove

2

http://prettydiff.com/

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


5
それからあなたは限られた想像力を持っています!ファイル内の2つのメソッドの位置を変更せずに入れ替えるのはどうですか?リファクタリングはどうですか?
Robin Green

(この方法では、Javaでのデータ宣言を入れ替えることはできませんが、イニシャライザにより同等であることに変わりはありません。C#にも同様の問題があると思います)。純粋なセマンティックdiffを使用する場合は、チューリングマシンの同等性を解決しようとしています。純粋なテキストマッチングよりも優れた範囲があり、チューリングが不可能である場合よりも多くの範囲があります。
Ira Baxter

@IraBaxterツールは、概念的には明らかに、実際には同等である同等のものだけを表示します。適切にコード化されていれば、あなたが言及している問題の種類はありません。
–RăzvanFlavius Panda 2017

「適切にコーディングされた」とは、究極のツールが必要な場合にアルゴリズムの同等性を証明することを意味します。アルゴリズムの等価性の証明は、一般にチューリングが難しいため、実際にはそのようなツールを入手することはできません。あなたが得るかもしれないのは、単なる構文の変更以外のいくつかの同等物を処理するツールです。今日まで、そのようなツールを構築しようとする人を見たことがありません。
Ira Baxter
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.