質問

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

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

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

役に立ちましたか?

解決

私たちは、まさにこのシナリオに対処することが可能であるツールを開発しました。チェック http://www.semanticmerge.comする

これは、マージ(および差分)コード構造に基づいており、基本的にあなたが強いリファクタリングを含む、次のようなケースに対処することを可能にするテキストベースのアルゴリズムを使用していません。また、あなたは以下を参照することができますような違いとマージの競合の両方をレンダリングすることができます:

ここに画像の説明を入力します

、代わりにテキストブロックと混乱のは、それが最初に解析するので、(実際には要素ごと)メソッドごとに競合を表示することができる、移動されます。以前のようなケースでも解決するために、マニュアル競合を持っていません。

ここに画像の説明を入力します

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

他のヒント

Eclipseのに長い時間のために、この機能を持っていました。 「構造コンペア」と呼ばれ、それは非常にうれしいですです。ここでは、XMLファイルのために別のに続いて、Java用のサンプルのスクリーンショットは、次のとおりです。

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

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

「意味の比較」を行うためにも、あなたはの構文木を比較する必要があります 言語、およびアカウントへの記号の意味を取ります。本当に 良いセマンティックdiffは、言語の意味を理解し、理解するであろう コードの1つのブロックが相互に機能的に同等であった場合。行き これは、はるかに定理証明を必要とし、それは非常になりながら、 かわいい、実際のツールのために現在は実用的ではありません。

このの実行可能な近似は、単に構文木を比較し、報告しています 構造面での変化は、挿入、削除、移動、または変更されました。 「セマンティック比較」にやや近づいて、一つは報告可能性があり 識別子はコードのブロックを横切って一貫して変更されたときに

私たちの http://www.semanticdesigns.com/Products/SmartDifferencer/indexを参照してください。 .htmlをする 多くの言語で動作する構文木をベースと比較エンジンのために、それはありません 上記の近似ます。

EDIT 2010年1月:C ++、C#、Javaの、PHP、およびCOBOLで利用可能なバージョン。 ウェブサイトは、これらのほとんどのための具体的な例を示します。

EDIT 2010年5月:PythonとJavaScriptが追加

EDIT 2010年10月:EGLは追加

EDIT 2010年11月:VB6は、VBScriptの、VB.netを追加

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

AファイングレインXML構造

:と一部で、結論「の比較アプローチ
  

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

(強調鉱山)

あなたは木の差分のより多くの例を探している場合には、その地域での実用的な発展を推進していますので、

実際のところ、私はXMLに焦点を当て勧めます。

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

HTMLツリー差分はPythonで書かれたXMLおよびHTML文書の構造を意識した比較を行います。

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

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

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

diff アドインをダウンロードできます ここ [zip] または codeplex サイトのプロジェクトに移動します ここ.

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

http://prettydiff.com/する

プリティ差分minifiesコメントや不要な空白を削除し、前差分アルゴリズムにコードを美化するために、各入力。私はこれよりもセマンティック多くのコードになるために、とにかく考えることはできません。そして、それので、その書かれたJavaScriptはブラウザで直接実行されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top