290 likes | 430 Views
同種の異なる機能を持つプログラムに共通機能を追加する支援システムの構築. 海尻・海谷研究室 07TA595J 本田 俊光. 研究の背景(1). ソフトウェア開発において、開発目的によって 作業の分岐や、システムの統合が行われている。 例えば、新機能の開発と既存機能の保守を分担して作業する場合。 一度変更されてしまったソフトウェアは、違いを見つけて統合するのは困難。 Subversion などのバージョン管理ツールの支援が必要になる。. 研究の背景(2). バージョン管理ツールを使用しても、変更があった一部の機能に関係するコードのみを統合することは困難。
E N D
同種の異なる機能を持つプログラムに共通機能を追加する支援システムの構築同種の異なる機能を持つプログラムに共通機能を追加する支援システムの構築 海尻・海谷研究室 07TA595J 本田 俊光
研究の背景(1) • ソフトウェア開発において、開発目的によって 作業の分岐や、システムの統合が行われている。 例えば、新機能の開発と既存機能の保守を分担して作業する場合。 • 一度変更されてしまったソフトウェアは、違いを見つけて統合するのは困難。Subversion などのバージョン管理ツールの支援が必要になる。
研究の背景(2) • バージョン管理ツールを使用しても、変更があった一部の機能に関係するコードのみを統合することは困難。 例えば、開発者用のバージョンの一部機能を安定化バージョンに追加するような場合。
研究の目的 • 同種の異なる機能を持つプログラムに共通機能を追加する支援システムの構築。 • 開発経験を利用して、システムの機能の一部を、他のシステムに追加することを支援する。
支援システムの機能 • 二つの異なるシステムの機能について、 メソッド呼出の単位で、違を確認できる 機能。 • 機能に関係するファイルの差分について、 確認できる機能。
用語の説明 • 機能に関するテスト 入力データに対する出力結果が仕様どうりか検証すること。 • コールグラフ コールグラフとはメソッド間の呼び出し関係を表現 した有向グラフ。プログラム中のメソッドをノードで、 呼び出し関係をエッジで表現する。
支援システムの概要(1) • 元は同じシステムで、それぞれに変更が加えられた システム1とシステム2がある。 システムのメソッド構成と呼出関係の図: M1 M2 M3 システム1 M4 M1 M2 システム2
支援システムの概要(2) システム1の一部の機能を、システム2に追加する 場合の動作。 • システム1で機能に関係するテストを実行する。 • 実行の記録を解析する。 • コールグラフを生成する。 • 差分リスト表を生成する。
支援システムの構成 Java言語 CUI画面 Java言語 AspectJ 差分リスト システム1 解析システム システム2 Graphviz
支援システムの動作(コールグラフの動的生成)支援システムの動作(コールグラフの動的生成) • AspectJ を使ってメソッド呼出を記録する。 • 記録を辿って呼出の関係をグラフにする。 アスペクト プログラム コールグラフ 呼出先 アドバイス: ファイルにログを書く メソッド呼出 0 1 0 0 0 0 0 0 呼出元 0 1 0 1 1 0 0 0
支援システムの動作 (ファイル差分表の生成)支援システムの動作 (ファイル差分表の生成) • 実行ログからメソッド名を抽出。 • クラスファイルからメソッド名を抽出(Bcel を使用)。 Bcel: Javaのbytecode操作ライブラリ • 対応関係を調べる。 実行ログ(メソッド名) ファイルの保持するメソッド名 対応関係をとる
システムの動作(ファイル差分表の生成) • ファイルのDiff(プログラムの行ごとの差分)をとる。 • 差分からメソッドに関する変更を抽出。 システム1 システム2 ファイル差分表 ファイル1 ファイル2 ・メソッドの内容が容等しい ・メソッドの内容が異なる ・メソッドがない ・メソッド以外の変更がある ・ファイルがない ファイル2 ファイル1 Diff
支援システムの動作(メソッドの差分) • Bcelを使用して、メソッドの先頭と終わりの行をみつけて、 ソースコードの差分(Diff)をとる。 Java ソース Java Bytecode 0: iconst_01: istore_22: iload_23: bipush 1005: if_icmpge 8: invokestatic public void M1() { i++; .. .. } Bcel
支援システムの使い方(1) • システム1でAspectJのプログラムをコンパイル。 • システム1で機能に関するテストを使ってログを記録。 • ログからシステム1のコールグラフを生成。 • システム1とシステム2のファイル差分表を生成。 システム1の機能の一部をシステム2へ移す場合 システム1 システム2
支援システムの使い方(2) • 実装: システム2でM3を定義して、M2を変更する。 システム1 M2 M3 ファイル差分表 システム1、2で M2は内容が異 なる システム2で M3は未定義 システム2 M2 M3
コールグラフ複雑化の問題 • 機能に関係するメソッド数が増えると、コールグラフが複雑化して、理解が困難になる。 • 追加したい機能に関係する変更点は、少ない場合が多い。
深さ優先探索 あるノードから移動できる全方向に、探索を行い、一定距離で探索を打ち切る。 探索結果を保存(1)
有効グラフの転置 有効グラフは二次元の行列に より表されている。 行列の転置行列を逆向きの有効 グラフを作成することができる。
逆方向深さ優先探索 転置により逆向きに なった有効グラフを深さ優先探索を行うことにより、任意のノードより逆方向グラフを求めることができる。 探索結果を保存する(2) 探索を打ち切ったノードを 記録しておく。
有効グラフの任意のノードの近傍表示 (1)と(2)の結果を合わせる
評価方法 • システムを開発する。 • 完成したシステムの一部を変更する。 • 一部の機能を実装開始から単体テストが 合格するまでの時間を計る。 支援システムを使った場合と使わない場合の開発時間の 差比較する。
評価システム 出力 機能 ・中値記法の式の計算。 ・逆ポーランド記法の計算。 ・プログラムリストの表示。 ・時刻の表示。 ・日付の表示。 ・ホスト名の表示。 ・ディレクトリのファイル数を表示。 クラス数: 8 メソッド数: 54 総行数: 663 入力 コントローラ 処理
評価システムに追加する機能 • 1970年からのマイクロ秒を日付に変更。 (メソッド数1) • プログラムリストに行番号を表示させる。 (メソッド数1) • ホスト名を取得。 (メソッド数1) • ディレクトリのファイルの表示する。 (メソッド数2) • 中値記法に関するエラー処理をつける。(メソッド数3)
結果 実験者数4人 支援システム使用 (単位 秒) 支援システム未使用
まとめ • 機能の異なるシステム追加する支援システムを構築した。 • 評価を行い、有効性を確認した。 今後の課題 • 大規模なシステムの適応した場合の検証を 行う。 • 機能追加による影響解析を行う。
コールグラフの遠近表示 • グラフのノードはクラス名とメソッド名で構成されている。 • クラスとメソッドの関係がわかりにくい。 org.apache.log4j.Layout.getFooter org.apache.log4j.Logger.trace org.apache.log4j.Layout.format
コールグラフの遠近表示 Sample.log.trace Sample.Level.info Sample.log.getLog Sample.log.getLog Sample.log.isTrace • あるノードから一定以上にある、ノードをクラスとしてまとめる。
新しいグラフの生成(深さ優先探索) Sample.log 0 1 0 0 Sample.log 0 0 0 0 Sample.log.getLog 0 1 0 1 1 0 0 0 Sample.log • 新しくノードを追加しながら、グラフを作成 • あるノードから一定以上にある、ノードをクラスとしてまとめる。