ソースコードの階層構造を考慮した 版管理システム

Download Report

Transcript ソースコードの階層構造を考慮した 版管理システム

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