ソースコードの木構造を考慮した 差分計算を用いる...

26
1 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University ソソソソソソソソソソソソソソソ ソソソソソソソソ ソソソソソソソソソソ ソソ ソソ , ソソ ソ , ソソ ソソ ソソソソソソソソソソソソソソ

Upload: louvain

Post on 18-Jan-2016

38 views

Category:

Documents


0 download

DESCRIPTION

ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案. 早瀬 康裕 , 松下 誠 , 井上 克朗 大阪大学大学院情報科学研究科. 研究の背景. 版管理システム ソースコードやドキュメントなどの開発履歴を保存するシステム CVS に代表される オープンソース開発では、必ずと言ってよいほど使われている CVS の使用例 : FreeBSD, XFree86, PostgreSQL 等. 版管理システム. リポジトリ 開発履歴を 保存する データベース. 自由に 書換えられる ファイル. リポジトリから ファイルを取得. 開発者. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

1Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

ソースコードの木構造を考慮した差分計算を用いる

版管理システムの提案

早瀬 康裕 , 松下 誠 , 井上 克朗大阪大学大学院情報科学研究科

Page 2: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

2Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

研究の背景版管理システム

ソースコードやドキュメントなどの開発履歴を保存するシステムCVS に代表される

オープンソース開発では、必ずと言ってよいほど使われているCVS の使用例 : FreeBSD, XFree86, PostgreSQL

Page 3: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

3Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

版管理システム

リポジトリ

開発履歴を保存する

データベース

自由に書換えられ

るファイル

自由に書換えられ

るファイル

編集されたファイル

編集されたファイル

編集

リポジトリからファイルを取得

リポジトリへ格納

開発

ファイル新しいファ

イル

Page 4: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

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’’’

版管理システムによるマージ

Page 5: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

5Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

問題既存の版管理システムは、マージ ( 変更点の取りこみ ) を行単位で行っていた行単位のマージは、不正確な場合がある

1. 同じ行が変更されていると、衝突しなくて良い変更が衝突する

2. 衝突すべき変更が、行が違うことにより見逃される

システムがマージに失敗したときは、開発者が手で直さねばならず、負担となっている

Page 6: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

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 */

マージ失

Page 7: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

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; 不正なマージ結果

Page 8: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

8Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

研究の目的精度の高いマージシステムを作り、開発者の負担を軽減する

マージ時の不要な衝突を避ける行よりも細かい単位でマージ処理を行う

マージによって引き起こされる問題を減らす変数の利用と定義が対応していることをチェック

Page 9: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

9Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

ソースコードの構造を考慮したマージ

ツリー構造の差分計算とマージ処理

実現方法1.比較するソースコードを解析し、ツリー構造に変

換2.1. で作った 2 つのツリーの差分を、ツリーの差

分計算アルゴリズムで計算3.2. で求めた差分をマージしたいツリーに適用

Page 10: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

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;}

空白空白 空白

空白

Page 11: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

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)

編集操作の列を編集スクリプトと呼ぶツリーに適用することで、ツリーを変換する

Page 12: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

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 を採用

Page 13: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

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.

Page 14: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

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.

Page 15: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

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 を持つ頂点が無いときは、類似した頂点を探す親や子が共通兄弟が共通ラベルが同じ

よく似た頂点が見つかれば、代用してみる見つからなければ編集操作を適用しない

Page 16: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

16Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

マージ結果の選択差分計算のアルゴリズムによって、異なった差分スクリプトが出力されうる類似頂点の探し方には、複数の方法がある

マージ結果は複数存在しうるどれが正しいかをシステムが決めることは出来ない

解決方法複数の方法でマージを試す

差分アルゴリズムと類似頂点検索方法の組み合わせ複数のマージ結果が得られた場合には、構文制約などで点数付けして整列し、開発者が 選択する

Page 17: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

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

Page 18: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

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 */

マージ失

Page 19: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

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 */

ソースコードに変換

Page 20: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

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; 不正なマージ結果

Page 21: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

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リンク切れ

Page 22: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

22Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

システムの実装方針既存の版管理システム subversion を拡張する

subversionよりよい CVS を目標として新規開発されている版管理シ

ステム特徴

サーバ・クライアント型システムクライアント側での差分計算・マージ処理

ソースコードをツリーに変換した状態でリポジトリに格納ツリー表現には XML を使う

拡張で開発者の作 業手順を変更しない

Page 23: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

23Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

システムの概要

subversionサーバ

リポジトリ

subversionクライアント

開発

差分適用

頂点対応の計算(FMES の前段階 )

XML へ変換

制約検査して違反数で整列

ソースコードに変換

差分計算FMES, xmdiff

XML のマージ機能

ソースコードと XML の変換

Page 24: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

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 ファイ

ソースコードに変換

ソースコード

ソースコード

編集

取得時の処理格納時の処理

Page 25: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

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

マージ結果の

ソースコード

(整列済 )

Page 26: ソースコードの木構造を考慮した 差分計算を用いる 版管理システムの提案

26Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

まとめと今後の課題まとめ

既存の版管理システムの問題点解決法としてソースコードの構造化マージを提案システムの設計について説明今後の課題

システムの実装システムの評価ソースコード以外のドキュメント形式への対応