BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Codiceのコード認識型マージツールがJavaをサポート

Codiceのコード認識型マージツールがJavaをサポート

原文(投稿日:2013/06/04)へのリンク

Plastic SCM を開発したCodice Softwareが,同社の3ウエイ・コード認識型マージツールであるSemanticMergeベータ版にJava言語のサポートを追加した。このツールについてはInfoQで一度, 4月に記事として取り上げている

SemanticMargeはマージと差分(diff)取得の両方に使用できるツールだ。コードを解析して生成した構文ツリーを差分の基礎として使用することにより,テキストブロックとしてではなく,構造レベルでのマージ処理を実行する。 このアプローチの大きなメリットは,メソッド順序の変更などクラスファイルの構造的な変更に影響されずに,比較処理が実行できる点にある。ツールはさらに,ある程度の "コード認識" 機能も備えている。例えばある開発者がjava.sql.Resultsetのimport (あるいは.NETならばusing) を1行目に追加して,別の開発者が同じimportを10行目に追加したような場合,SemanticMergeはこれらを同じimportであると認識して,追加を1回のみにすることができる。

他の言語用に同じような機能を持った製品も存在する (Altovaの DiffDog はXMLで同様の処理を行う。またJavaの DaisyDiff ライブラリは,HTMLドキュメントをコードレベルで比較可能だ)。しかしCodice Softwareでソフトウェア担当主幹エンジニアを務めるPablo Santos Luaces氏は我々に,"SmeanticMergeのようにソースコードを扱うことのできる,洗練された製品は他にありません" と語っている。"同じような目標を掲げたツールはこれまでにもありました。しかしそれらは結果的に完成しなかったか,あるいは複雑過ぎるシナリオを扱おうとしていると思います。"

Plastic SCMのサポートは当然だが,他にもGit, Subversion, Perforce. ClearCase, Team Foundation Serve, Mercurial, IntelliJなどと連動するような設定も可能だ。

SemanticMerge は今のところWindows用のみである。動作には.NETフレームワーク4.0が必要だ。Codiceでは,MacOS Xには Xamarin Studio,Linuxには Gtk# を利用して,OS XとLinuxに移植することを計画している。いずれもUIはネイティブだが,どちらもC#/Mono上で動作することになる。

InfoQではPablo Santos Luaces氏に詳しい話を聞いた。

InfoQ: C#とVB.NETの発表以降,今回のJavaサポートまでとても早かったのですが,計画中の他の言語 (C, C++, Objective-C, JavaScript) も同じような短期間でフォローできそうですか,あるいは今回の方が難しいのでしょうか?

JavaのサポートはC#やVB.NETとほとんど並行して開発していました。リリースに1ヶ月しか掛からなかったのは,そういった理由からです。現在はCとC++に集中して取り組んでいます。どちらもすでに着手していますが,C++の方が難しいですね。コードの解析には libclang を使用しています。とても便利なのですが,現在サポートしている言語にはないC++の機能を扱うために,マージエンジンのいくつかの部分に手を加えなければならなさそうです。JSについても,一番リクエストの多いもののひとつですので,できる限り早く着手したいと思っています。。

InfoQ: 差分の取得にはどのようなアルゴリズムを用いているのでしょう?

差分とマージのアルゴリズムはどちらも,SemanticMergeでの私たちの開発努力の中核となる部分です。これらは,私たちのXdiffやXmergeのアルゴリズムのようなテキストブロックではなく,"コードの構造"の処理に基づいています。ツールはまず,コードを解析して "文法的な違い" を求めます。最初にベースと一方の提供コード,それからベースともう一方,という順です。これら2つの差異を取りまとめたものを使って,マージ処理を行うのです。

この差分アルゴリズムが本当に面白いのは,メソッドの移動を追跡することができる点です。メソッドの位置が変わっても,それを差分として追いかけることができるのです (この差分がマージ処理のベースになります)。"構文解析" はボディのレベルで停止します。つまりメソッドそのものはテキストとして扱われる訳です。修正された "メソッドがまだ同じ" かどうかを確認する部分には,従来のXdiffのアルゴリズムを使用します。これはLevenshtein距離の計算にいろいろ手を加えたものです。ボディが "ほとんど同じ" で,メソッドの他の要素 (パラメータなど) が一致していれば,同じメソッドであると判断しています。

マージの計算では2つの差分コレクションを使用しています。メソッドが双方で更新されているとコンフリクトが発生します。同じ状況は移動/移動 (例えば違うクラスに移動されたような場合,移動不一致のコンフリクトになります) や変更/削除,他にもたくさんあります。

InfoQ: ベータ版でなくなるのはいつ頃になるのでしょうか?

C# については間もなくだと思います。Javaはローンチしたばかりなので,もう少しかかるでしょうね。C#のコマーシャル向けのローンチについては,7月までには準備したいと思っています。そうは言っても,まだやるべきことはたくさん残っています。

まず,起動時間を改善しなくてはなりません。現在は起動に数秒掛かっていますので,数百のファイルをマージする必要がある場合には問題があります。現実的な開発シナリオを考えれば,これは必要なことでしょう。すでにこの件には数ヶ月間を費やしていますが,何としても修正すべき部分だと思っています。

"自動解析モード" の追加も必要だと思います。現在はSemanticMergeがすべてを自動で行う場合でも,すべてのマージについてユーザのレビューを求めるようになっているからです。これはベータ段階の目的で行ったものなのですが,近いうちには -auto オプションを追加する必要があるでしょう。

リリース版にはもっとよいテキストエディタを追加します。これはユーザからの要求が多かったもののひとつでした。

それから,Macバージョンも完成させたいと思っていますし,その次にはLinux版も ... とにかく,やるべきことはたくさんあります。

価格はまだ設定されていないが,氏はできる限り低価格にしたい,サブスクリプションモデルで3ドル/月程度,無制限プランで60ドル程度を想定している,と我々に語っている。ベータ版は無償で,こちら からダウンロードできる。

この記事に星をつける

おすすめ度
スタイル

BT