ソースコードの木構造を考慮した 差分計算を用いる...
DESCRIPTION
ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案. 早瀬 康裕 , 松下 誠 , 井上 克朗 大阪大学大学院情報科学研究科. 研究の背景. 版管理システム ソースコードやドキュメントなどの開発履歴を保存するシステム CVS に代表される オープンソース開発では、必ずと言ってよいほど使われている CVS の使用例 : FreeBSD, XFree86, PostgreSQL 等. 版管理システム. リポジトリ 開発履歴を 保存する データベース. 自由に 書換えられる ファイル. リポジトリから ファイルを取得. 開発者. - PowerPoint PPT PresentationTRANSCRIPT
1Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
ソースコードの木構造を考慮した差分計算を用いる
版管理システムの提案
早瀬 康裕 , 松下 誠 , 井上 克朗大阪大学大学院情報科学研究科
2Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
研究の背景版管理システム
ソースコードやドキュメントなどの開発履歴を保存するシステムCVS に代表される
オープンソース開発では、必ずと言ってよいほど使われているCVS の使用例 : FreeBSD, XFree86, PostgreSQL
等
3Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
版管理システム
リポジトリ
開発履歴を保存する
データベース
自由に書換えられ
るファイル
自由に書換えられ
るファイル
編集されたファイル
編集されたファイル
編集
リポジトリからファイルを取得
リポジトリへ格納
開発
者
ファイル新しいファ
イル
4Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
版管理システムを用いた複数人での開発
リポジトリXX
X’X’
編集
取得
格納
XX
取得
開発者A
開発者B
編集X’’X’’ X’’’X’’’
格納最新版(X’) の取得
格納出来ない
X
X’
X’’X’’’
版管理システムによるマージ
5Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
問題既存の版管理システムは、マージ ( 変更点の取りこみ ) を行単位で行っていた行単位のマージは、不正確な場合がある
1. 同じ行が変更されていると、衝突しなくて良い変更が衝突する
2. 衝突すべき変更が、行が違うことにより見逃される
システムがマージに失敗したときは、開発者が手で直さねばならず、負担となっている
6Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
問題点 1 不要な衝突開発者 A と B が同じファイルを編集している
同じ行を編集すると変更点が衝突行が同じでも衝突するとは限らない
int refs;
int refs; /* reference count */
int refs=0;
int refs=0; /* reference count */
マージ失
敗
7Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
問題点 2 衝突の見逃し開発者 A と B が同じファイルを編集している
衝突すべき変更を、行が違うために見逃すA が変数を削除B が削除された変数を利用するコードを追加
int num, sum, avg;
int num, sum;
int num, sum;:avg = sum/num;int num, sum, avg;
:avg = sum/num; 不正なマージ結果
8Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
研究の目的精度の高いマージシステムを作り、開発者の負担を軽減する
マージ時の不要な衝突を避ける行よりも細かい単位でマージ処理を行う
マージによって引き起こされる問題を減らす変数の利用と定義が対応していることをチェック
9Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
ソースコードの構造を考慮したマージ
ツリー構造の差分計算とマージ処理
実現方法1.比較するソースコードを解析し、ツリー構造に変
換2.1. で作った 2 つのツリーの差分を、ツリーの差
分計算アルゴリズムで計算3.2. で求めた差分をマージしたいツリーに適用
10Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
1. ソースコードをツリーに変換ソースコードを構文解析し、ツリーにするツリーの頂点には文字列が格納されるツリーから、元のソースコードに戻せるように、空白文字の
頂点も作るツリーの頂点に ID を付ける
ID の付けかた直前のバージョンと頂点の対応を計算して、対応すると判断された頂点同士には同じ ID を付ける頂点の対応については後述
変数を利用している部分から、定義している部分へリンクを張る
Declare
int i variable
Statement
Block{ int i; i;}
空白空白 空白
空白
11Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
2. ツリーの差分計算頂点に ID の付けられたツリーの差分を計算す
るツリーを編集するための編集操作は 4 つ
頂点の追加 : insert( 新 ID, 文字列 , 親 ID, index)葉頂点の削除 : delete(ID)頂点に格納された文字列を更新 : update(ID, 新文字列 )部分木を移動 : move(ID, 移動先の親 ID, index)
編集操作の列を編集スクリプトと呼ぶツリーに適用することで、ツリーを変換する
12Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
差分スクリプトツリー A とツリー B の差分を、 A を B に変換する編集スクリプトで表現する条件を満たす編集スクリプトは無数に存在する
例 : A を B に変換する、ある編集スクリプト S に、 A にも B にも含まれない頂点を追加して削除する操作を加えた編集スクリプト S’ も、 A を B に変換する
条件を満たすスクリプトの中から、無駄の無いものを探す
編集操作にコストを定義する編集スクリプトのコストを、含まれる編集操作のコストの総和とするコストの小さい編集スクリプトが良いスクリプト
既存のアルゴリズム xmdiff と FMES を採用
13Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
xmdiff アルゴリズム最小コストの編集スクリプトを求める、外部記憶用アルゴリズム時間計算量 O(n2)編集操作 : insert, delete, update編集操作のコストは 0 より大きい任意の値
提案手法では以下の値を用いるinsert のコスト = delete のコスト = 頂点の付けられた文字列の長さupdate のコスト = 書換え前後の文字列の長さの和 - 2* 文字列の共通部分の長さ
Edit Graph (動的計画法の表 ) を用いる縦軸横軸に、新旧ツリーの頂点を深さ優先探索順に並べる縦横の辺を insert と delete に、斜めの辺を update に対応辺の重み : 操作のコストに対応原点から対角までの最小コスト経路が、編集スクリプトに対応表をメモリに収まるサイズに分割して効率的に計算
S. Chawathe, "Comparing hierarchical data in external memory," presented at Twentyfifth International Conference on Very Large Data Bases, Philadelphia, PA, 1999.
14Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
FMES アルゴリズム差分スクリプトを求める近似アルゴリズム時間計算量 O(ne+e2) (e は差の大きさ )良い近似を得るための条件 : e << n編集操作は insert, delete, update, move
insert のコスト = delete のコスト = move のコスト =1update のコストは変更前後の値によって 0以上 2以下の値
提案手法では (1 – 文字列の共通部分の長さ *2/ 書換え前後の文字列の長さの和 )*2
2 つの段階に分けられる1. ツリー間での頂点の対応関係の計算
葉と内部頂点を区別類似度が閾値以下の頂点同士は対応しないと仮定
2. 頂点の対応が取れたツリー間で編集スクリプトを計算
S. Chawathe, A. Rajaraman, H. Garcia-Molina, and J. Widom. Change detection in hierarchically structured information. In Proceedings of the ACM SIGMOD International Conference on Management of Data, pages 493-504, Montr'eal, Qu'ebec, June 1996.
15Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
3. マージツリー A とツリー B の差分スクリプト S を、 A でないツリー C に適用することをマージと呼ぶ
問題 : 編集操作は頂点 ID を引数に取るが、 A と C で同じ ID の頂点があるとは限らない
同じ ID を持つ頂点が無いときは、類似した頂点を探す親や子が共通兄弟が共通ラベルが同じ
よく似た頂点が見つかれば、代用してみる見つからなければ編集操作を適用しない
16Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
マージ結果の選択差分計算のアルゴリズムによって、異なった差分スクリプトが出力されうる類似頂点の探し方には、複数の方法がある
マージ結果は複数存在しうるどれが正しいかをシステムが決めることは出来ない
解決方法複数の方法でマージを試す
差分アルゴリズムと類似頂点検索方法の組み合わせ複数のマージ結果が得られた場合には、構文制約などで点数付けして整列し、開発者が 選択する
17Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
マージの例0 if
1 then 4 else
2 doA 5 doB
3 x
A0 if
1 then
2 doA5 doB
3 x
Bupdate(6, i) move(5, 1, 1)delete(4)
0 if
1 then 4 else
2 doA 8 doC
C
6 i
D1 D2
6 y
9 z3 x
update(6, i) move(5, 1, 1)delete(4)
0 if
1 then
2 doA8 doC
9 z 3 x
update(6, i) move(5, 1, 1)delete(4)
update(6, i) move(8, 1, 1)delete(4)
0 if
1 then
2 doA 8 doC
9 z3 x
4 else
0 if
1 then
D3
2 doA
3 x
18Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
システムを使って解決する問題 1
行単位のマージでは、同じ行の編集で衝突していた
int refs;
int refs; /* reference count */
int refs=0;
int refs=0; /* reference count */
マージ失
敗
19Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
問題 1 に提案手法を使った場合
int
Declare
親
refs 0
int
Declare
refs
親
Comment
reference count
int
Declare
refs
親
Comment
reference count0int
Declare
refs
親
元の行
マージ成
功
int refs=0; /* reference count */
ソースコードに変換
20Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
システムを使って解決する問題 2
宣言されていない変数を使う問題を見逃していた
int num, sum, avg;
int num, sum;
int num, sum;:avg = sum/num;int num, sum, avg;
:avg = sum/num; 不正なマージ結果
21Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
問題 2 に提案手法を使った場合
Declare List
int num sum avg
Declare List
int num sum
Declare List
int num sum avg variable
変数の参照先が無いので衝突
Declare List
int num sum variableリンク切れ
22Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
システムの実装方針既存の版管理システム subversion を拡張する
subversionよりよい CVS を目標として新規開発されている版管理シ
ステム特徴
サーバ・クライアント型システムクライアント側での差分計算・マージ処理
ソースコードをツリーに変換した状態でリポジトリに格納ツリー表現には XML を使う
拡張で開発者の作 業手順を変更しない
23Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
システムの概要
subversionサーバ
リポジトリ
subversionクライアント
開発
者
差分適用
頂点対応の計算(FMES の前段階 )
XML へ変換
制約検査して違反数で整列
ソースコードに変換
差分計算FMES, xmdiff
XML のマージ機能
ソースコードと XML の変換
24Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
差分計算FMES, xmdiff 差分適用
制約検査して違反数で整列
取得と格納
subversionサーバ
リポジトリ
subversionクライアント
開発
者
取得したXML ファイ
ル
取得したXML ファイ
ル
編集したソースコ
ード
編集したソースコ
ード
頂点 ID 付き
XML ファイル
頂点 ID 付き
XML ファイル
頂点対応の計算(FMES の前段階 )
XML へ変換頂点 ID 無しXML ファイ
ル
頂点 ID 無しXML ファイ
ル
ソースコードに変換
ソースコード
ソースコード
編集
取得時の処理格納時の処理
25Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
頂点 ID 無しXML ファイ
ル
頂点 ID 無しXML ファイ
ル
マージ
subversionサーバ
リポジトリ
subversionクライアント
開発
者
取得したXML ファイ
ル
取得したXML ファイ
ル
編集したソースコ
ード
編集したソースコ
ード
マージ時の処理
頂点 ID 付き
XML ファイル
頂点 ID 付き
XML ファイル
最新版のXML ファ
イル
最新版のXML ファ
イル
差分計算FMES, xmdiff 差分適用
差分差分差分マージ結果
の XML
マージ結果の XML
マージ結果の XML
マージ結果の
XML( 複数 )
開発者に提 示
頂点対応の計算(FMES の前段階 )
XML へ変換
制約検査して違反数で整列
マージ結果の XML
マージ結果の XML
マージ結果の XML
マージ結果のXML(整列済 )
ソースコードに変換
マージ結果の XML
マージ結果の XML
マージ結果の XML
マージ結果の
ソースコード
(整列済 )
26Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
まとめと今後の課題まとめ
既存の版管理システムの問題点解決法としてソースコードの構造化マージを提案システムの設計について説明今後の課題
システムの実装システムの評価ソースコード以外のドキュメント形式への対応