動的解析情報を利用したJavaプログラムからのシーケン

Java実行履歴からの
シーケンス図生成ツール
谷口考治†,石尾隆†,神谷年洋‡,
楠本真二†,井上克郎†
†大阪大学大学院情報科学研究科
‡科学技術振興機構さきがけ
2004/1014
ESS2004
1
発表の流れ

背景と動機


シーケンス図生成手法




オブジェクト指向プログラムの動作理解
実行履歴の圧縮
圧縮結果からのシーケンス図の作成
ツールの適用実験
まとめ
2004/1014
ESS2004
2
組み込みソフトウェアとオブジェクト
指向

組み込みソフトウェアの開発においても、オブ
ジェクト指向技術が用いられるようになってきて
いる



Unified Modeling Language (UML)
Java
オブジェクト指向プログラム用の支援環境が必
要になってきている

2004/1014
本ツールはオブジェクト指向プログラムの理解支援を
行う
ESS2004
3
オブジェクト指向プログラムの動作
概要

オブジェクト指向プログラム

複数のオブジェクト間で相互にメッセージをやり取
りすることによってプログラムが動作する
クラスB
B-1
C-1
クラスA
A-1
オブジェクト
メッセージ
クラスC
C-2
D-1
クラスD
2004/1014
ESS2004
4
オブジェクト指向プログラムの理解

オブジェクト指向プログラムの動作理解の問題
点

1つの機能を実現するために、複数のオブジェクトが
協調して動作する


動的に決定する要素が多い


実際にメソッドを実行するオブジェクトが動的に決まる等
メッセージ通信が複雑になる

2004/1014
複数のオブジェクトの動作を追いながら全体を理解しなけれ
ばない
オブジェクト数が増加するにつれて、メッセージ通信の回数
が増え、より複雑になる
ESS2004
5
シーケンス図による動作理解

UMLのシーケンス図




A-1
B-1
C-1
C-2
D-1
通常は設計時に作成される
オブジェクト間の関係を時系
列にそって表現
オブジェクト指向プログラムの
理解に非常に有用
プログラムの動的解析から
シーケンス図を自動作成

シーケンス図
プログラムの動作理解を支援
2004/1014
ESS2004
6
シーケンス図作成手順
解析対象となる機能に対応した入力を決定
実行履歴の取得
1.
2.
プログラムを動作させメソッド呼び出しの実行履
歴を取得

実行履歴を解析
3.
繰り返し構造を圧縮

4.
シーケンス図生成
2004/1014
ESS2004
7
Step2:実行履歴の取得

実行履歴


「メソッドの開始」と「メソッドの終了」の2つのイベント系列
「メソッドの開始」イベントでは以下の情報を記録





メソッドの呼び出しを受けたオブジェクトのID
パッケージ名・クラス名
メソッド名
引数の型
返り値の型

メソッドの終了イベントでは終了記号を記録

実装ではJVMPIを用いて実行履歴を取得
2004/1014
ESS2004
8
Step3:実行履歴の解析


実行履歴中の繰り返しや再帰的な構造になって
いる部分を発見し、圧縮を行う
展開して元の実行履歴も参照できるようにする

2004/1014
圧縮結果から任意の部分を展開することで、一部分
についての詳細な実行情報を得られる
ESS2004
9
提案する圧縮ルール




2004/1014
R1 : 同一系列の繰り返し
R2 : 同一クラスの異なるオブジェクトに対しての繰り
返し
R3 : 欠損を含む系列の繰り返し
R4 : 再帰構造
ESS2004
10
R1:同一部分系列の繰り返し

実行履歴中の完全に同一な繰り返しを圧縮
B(2).b(){
C(3).c(){
}
}
D(4).d(){
}
B(2).b(){
C(3).c(){
}
}
D(4).d(){
}
・・・
2004/1014
B(2).b(){
C(3).c(){
}
}
D(4).d(){
}
ESS2004
n
11
R2:オブジェクトが異なる系列の
繰り返し

オブジェクトのみが異なる繰り返しを圧縮
B(2).b(){
C(3).c(){
}
}
D(4).d(){
}
B(5).b(){
C(6).c(){
}
}
D(7).d(){
}
・・・
2004/1014
B(2,5).b(){
C(3,6).c(){
}
}
D(4,7).d(){
}
ESS2004
n
12
R3:欠損を含む系列の繰り返し

呼び出し構造の一部が欠けている繰り返しを圧縮
B(2).b(){
C(3).c(){
}
}
D(4).d(){
}
B(2).b(){
}
D(4).d(){
}
・・・
2004/1014
B(2).b(){
? C(3).c(){
}
}
D(4).d(){
}
ESS2004
n
13
R4:再帰構造

再帰構造を圧縮

再帰構造全体を簡潔に表現できるように組み替える
A(1).a(){
A(2).a(){
A(3).a(){
B(4).b(){
}
}
B(5).b(){
}
}
B(6).b(){
}
}
2004/1014
A(1,2,3).a(){
recursive A(1,2,3).a(){
}
B(4,5,6).b(){
}
}
ESS2004
14
Step4:シーケンス図の作成

圧縮した実行履歴を元にシーケンス図を
作成

圧縮により、付加された情報をシーケンス図
中に表示

2004/1014
繰り返しになっている部分やその回数など
ESS2004
15
A(1).a(){
B(2).b(){
}
B(2).b(){
}
}
A(1).a(){
B(2).b(){
}
}
A[1]
2
B[2]
a()
b()
2
2004/1014
ESS2004
16
A(1).a(){
B(2).b(){
}
B(3).b(){
}
}
A(1).a(){
B(2,3).b(){
2
}
}
A[1]
B[2,3]
a()
b()
2
2004/1014
ESS2004
17
A(1).a(){
B(2).b(){
C(4).c(){
}
}
B(3).b(){
}
}
A(1).a(){
B(2,3).b(){
? C(4).c(){
2
}
}
}
A[1]
B[2,3]
C[4]
a()
b()
? c()
2
2004/1014
ESS2004
18
A(1).a(){
A(1).a(){
B(2).b(){
}
}
B(2).b(){
}
}
A(1).a(){
recursive A(1).a(){
}
B(2).b(){
}
}
A[1]
B[2]
a()
rec a()
rec a()
2004/1014
b()
ESS2004
19
ツールの適用実験

実験内容

次の4つのプログラムの各機能から実行履歴を取得

jEdit:テキストエディタ


Gemini:コードクローン分析ツール


2004/1014
実行履歴の読み込み、表示、R2の実行
各実行履歴に対してR4→R1→R2→R3の順序で圧縮ルールを適用


日にち指定、スケジュール記述
LogCompactor:本ツールの実行履歴圧縮部


ファイル指定、クローン解析、クローン情報表示
Scheduler:スケジュール管理ツール


テキストファイルの読み込み
それぞれのルールを適用して、実行系列の圧縮率を評価
圧縮結果からシーケンス図を作成
ESS2004
20
圧縮結果
jEdit
250,000
228,764
Gemini
250,000
217,351
200,000
208,360
150,000
150,000
100,000
100,000
50,000
50,000
57,365
16,889
16,510
0
圧縮前
R4
R1
R2
0
R3
圧縮前
Scheduler
5,000
4,500
4,000
3,500
3,000
2,500
2,000
1,500
1,000
500
0
205,483
200,000
178,128
4,398
R4
R1
1,954
1,762
R2
R3
208
105
R2
R3
LogCompactor
14,000
4,398
3,995
12,000
11,994
10,000
8,874
8,426
8,000
6,000
4,000
238
147
2,000
0
圧縮前
2004/1014
R4
R1
R2
圧縮前
R3
ESS2004
R4
R1
21
Schedulerの実行履歴から作成したシーケンス図
2004/1014
ESS2004
22
まとめ

オブジェクト指向プログラムの理解支援として、
動的解析情報からシーケンス図を作成する手
法を提案し、ツールの作成を行った


2004/1014
提案した実行履歴圧縮手法により実行履歴の大
部分を圧縮
圧縮後の実行履歴からシーケンス図を作成
ESS2004
23

終わり
2004/1014
ESS2004
24
2004/1014
ESS2004
25
設計時にはない部分
設計時にはあったが
実装したツールでは
表示されなかった部分
2004/1014
ESS2004
26
private Date date;
シーケンス図の比較

public Date getDate() {
return date;
}
単純なgetterメソッド
設計時のシーケンス図と生成したシーケンス図との比較



ほぼ同様のシーケンスが描画できている
設計時には書かれていないが、実装時に付け足されたメソッド呼
び出しも描画した
メンバ変数をreturnするのみの単純なgetterメソッドが描画でき
なかった


2004/1014
メソッド呼び出しイベントがプロファイラに通知されない
VMかJVMPIの問題
ESS2004
27