セマンティック差分ユーティリティ [終了]
-
22-08-2019 - |
質問
セマンティック 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用のサンプルのスクリーンショットは、次のとおりです。
(上のペインに表示されるメソッドのマイナスとプラスのアイコンに注意してください。)
「意味の比較」を行うためにも、あなたはの構文木を比較する必要があります 言語、およびアカウントへの記号の意味を取ります。本当に 良いセマンティック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を、より良く行うことがはるかに困難であることが判明します。
:と一部で、結論「の比較アプローチ私たちの理論的研究だけでなく、私たちの実験的評価 提案された方法の収率が有する構造的類似性の結果を改善することを示しました 既存の代替に関して、同一の時間複雑度を有しながらの(O(N ^ 2))の
(強調鉱山)
あなたは木の差分のより多くの例を探している場合には、その地域での実用的な発展を推進していますので、実際のところ、私はXMLに焦点を当て勧めます。
私自身のプロジェクトのための恥知らずなプラグ:
HTMLツリー差分はPythonで書かれたXMLおよびHTML文書の構造を意識した比較を行います。
Zynamicsという会社は、バイナリレベルのセマンティック差分ツールを提供しています。これはバイナリの2つのバージョンのグラフ理論的分析を実行するためにライルと呼ばれるメタアセンブリ言語を使用して、それらの間の違いを説明するための色分けされたグラフを生成します。私は価格のわからないが、私はそれが自由である疑います。
プリティ差分minifiesコメントや不要な空白を削除し、前差分アルゴリズムにコードを美化するために、各入力。私はこれよりもセマンティック多くのコードになるために、とにかく考えることはできません。そして、それので、その書かれたJavaScriptはブラウザで直接実行されます。