プログラム理解における thin slice の 統計的 調査による有用性評価

16
e Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka Un プププププププププププ Thin slice プ プププププププププププププ プププププ ププ ププ 1

Upload: niel

Post on 05-Feb-2016

57 views

Category:

Documents


0 download

DESCRIPTION

プログラム理解における Thin slice の 統計的 調査による有用性評価. 井上研究室 秦野 智臣. 背景. ソフトウェアの保守作業において,開発者はプログラム理解に多くの時間を費やしている 変数の値を調べる メソッドの呼び出し関係を調べる プログラム理解の時間を減らすための技術として,プログラムスライシングがある. プログラムスライシング. プログラム内 のある文に影響を与える可能性のあるすべての文を抽出 する技術. ソースコード 1 void main() { 2 int sum = 0; 3 int i = 1; - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: プログラム理解における Thin slice の 統計的 調査による有用性評価

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

プログラム理解における Thin slice の統計的調査による有用性評価

井上研究室秦野 智臣 

1

Page 2: プログラム理解における Thin slice の 統計的 調査による有用性評価

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

背景

• ソフトウェアの保守作業において,開発者はプログラム理解に多くの時間を費やしている– 変数の値を調べる– メソッドの呼び出し関係を調べる

• プログラム理解の時間を減らすための技術として,プログラムスライシングがある

2

Page 3: プログラム理解における Thin slice の 統計的 調査による有用性評価

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

プログラムスライシング

• プログラム内のある文に影響を与える可能性のあるすべての文を抽出する技術

3

ソースコード 1 void main() { 2 int sum = 0; 3 int i = 1; 4 while (i <= 10) { 5 sum = sum + i; 6 i = i + 1; 7 } 8 print(i);   9 }

プログラムスライス 1 void main() { 3 int i = 1; 4 while (i <= 10) { 6 i = i + 1; 7 } 8 print(i);   9 }

スライシング基準8 行目の変数 i の値を知りたい場合に開発者の読むコードが減少

スライシング

Page 4: プログラム理解における Thin slice の 統計的 調査による有用性評価

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

プログラムスライスの平均値

• プログラムスライスのサイズの平均値は,プログラム内のすべての文の約30%である [1]

– 100 万行のプログラムのある文について,プログラムスライシングを実行しても,平均約30 万行は残る

– 大規模プログラムではスライスサイズが大きくなってしまう

[1] D. Binkley, N. Gold, and M. Harman. An empirical study of static program slice size. ACM Trans. Softw. Eng. Methodol., Vol. 16, No. 2, pp. 1-32, 2007. 4

プログラム理解に有用であるとは言い難い

Page 5: プログラム理解における Thin slice の 統計的 調査による有用性評価

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

Thin slicing[2]

• プログラム内のある文で使用しているデータについて,そのデータを生成した文のみを抽出する技術– 変数の値を計算したり,コピーしている文

• 変数の値に着目し抽出される文を少なくする– プログラム理解に対する効果が期待できる

• Thin slicing を利用して,プログラム理解の時間が大きく減少した例が 22 個示されている [2] 5

[2]M. Sridharan, S. J. Fink, and R. Bodik. Thin slicing. In Proceedings of the 2007 ACM SIGPLAN Conference on PLDI, pp. 112–122., 2007.

Page 6: プログラム理解における Thin slice の 統計的 調査による有用性評価

1 package sample; 2 public class Main { 3 public static void main(String[] args) { 4 A a = new A(); 5 int id; 6 if (args.length > 0) 7 id = 1; 8 else 9 id = 0; 10 a.addData( ); 11 System.out.println( ); 12 } 13 } 14 class A { 15 B b = new B(); 16 void addData(int id) { 17 b.addData( ); 18 } 19 }

20 class B { 21 int max = 4; 22 X x = new X(); 23 void addData(int id) { 24 if (id >= 0 && id <= max) 25 x.addData( ); 26 } 27 } 28 class Data { 29 int[] idList = new int[16]; 30 int count = 0; 31 void addData(int id) { 32 idList[count++] = ; 33 } 34 }

6

id

id

id

ida

メソッドの呼び出し関係Main#main A#addData B#addData Data#addData⇒ ⇒ ⇒

Thin slice の効果が高い例

Page 7: プログラム理解における Thin slice の 統計的 調査による有用性評価

1 package sample; 2 public class Main { 3 public static void main(String[] args) { 4 A a = new A(); 5 int id; 6 if (args.length > 0) 7 id = 1; 8 else 9 id = 0; 10 a.addData( ); 11 System.out.println( ); 12 } 13 } 14 class A { 15 B b = new B(); 16 void addData(int id) { 17 b.addData( ); 18 } 19 }

20 class B { 21 int max = 4; 22 X x = new X(); 23 void addData(int id) { 24 if (id >= 0 && id <= max) 25 x.addData( ); 26 } 27 } 28 class Data { 29 int[] idList = new int[16]; 30 int count = 0; 31 void addData(int id) { 32 idList[count++] = ; 33 } 34 }

7

id

id

id

ida

3210 17

7

9

25

文を頂点としたグラフでThin slice を計算する

データの生成元

この部分だけを見れば変数 id の値が分か

Page 8: プログラム理解における Thin slice の 統計的 調査による有用性評価

1 package sample; 2 public class Main { 3 public static void main(String[] args) { 4 A a = new A(); 5 int id; 6 if (args.length > 0) 7 id = 1; 8 else 9 id = 0; 10 a.addData( ); 11 System.out.println( ); 12 } 13 } 14 class A { 15 B b = new B(); 16 void addData(int id) { 17 b.addData( ); 18 } 19 }

20 class B { 21 int max = 4; 22 X x = new X(); 23 void addData(int id) { 24 if (id >= 0 && id <= max) 25 x.addData( ); 26 } 27 } 28 class Data { 29 int[] idList = new int[16]; 30 int count = 0; 31 void addData(int id) { 32 idList[count++] = ; 33 } 34 }

8

id

id

id

ida

メソッドの呼び出し関係Main#main A#addData B#addData Data#addData⇒ ⇒ ⇒

Thin slice の効果が低い例

同じメソッド内で使用

Page 9: プログラム理解における Thin slice の 統計的 調査による有用性評価

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

研究目的と方法

• 目的– プログラム理解における Thin slicing の有用

性を評価する• Thin slice のサイズは平均的に十分小さくなるか• Thin slice はプログラム理解において,どれくら

い効果の高いものであるか

• 方法– Java を対象とした Thin slicing を実装し, 7

個のプログラムで Thin slice に関する指標を計測する

9

Page 10: プログラム理解における Thin slice の 統計的 調査による有用性評価

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

実験対象

• DaCapo benchmark– 多数の Java プログラムが含まれている

10

プログラム名

クラス数 メソッド数 頂点数 スライシング基準数

tomcat 261 2,389 54,468 12,120

luindex 560 4,180 123,191 23,554

sunflow 657 4,609 190,526 32,996

avrora 1,838 9,304 211,343 36,325

pmd 2,369 16,439 448,722 86,904

xalan 2,805 22,377 815,861 124,232

batik 4,417 28,818 968,470 149,169

Page 11: プログラム理解における Thin slice の 統計的 調査による有用性評価

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

計測する指標• Thin slice のサイズを計算するため

– Thin slice の頂点数• 値が小さい⇒抽出される文が少ない

• Thin slice のプログラム理解に対する効果を調査するため– Thin slice がまたがるメソッド数

• 値が大きい⇒データが多くのメソッドを経由する– Thin slice のうちデータの生成元に相当する頂

点数• 値が小さい⇒データの生成元の数が少ない

11

これらの指標を,データを使用しているすべての頂点をスライシング基準として計測する

Page 12: プログラム理解における Thin slice の 統計的 調査による有用性評価

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

実験結果 (1/3)

• Thin slice の頂点数の平均は,プログラム全体の約 1 %

• 複数のメソッドにまたがる Thin slice が全スライスの約 80 %

12

1 2 4 6 8 10 12 14 16 18 200%

10%20%30%40%50%60%70%80%90%

100%

tomcatluindexsunflowavrorapmdxalanbatik

Thin sliceがまたがるメソッド数

全スライスに占める割合

Page 13: プログラム理解における Thin slice の 統計的 調査による有用性評価

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

0.0010.0020.0030.0040.0050.0060.0070.0080.009 0.01 0.0110.0120.0130.0140.0150%

10%20%30%40%50%60%70%80%90%

100%

データの生成元の数の度数分布pmd

全頂点数に占めるデータの生成元の数の割合

実験結果 (2/3)

13

0.002

0.006 0.0

10.014

0.018

0.022

0.026 0.0

30.034

0.038

0%10%20%30%40%50%60%70%80%90%

100%

tomcatluindexsunflowavrorapmdxalanbatik

最大値

・データの生成元の数がその最大値手前であるThin slice が約 10 ~ 20 %・残りの 80 %以上はデータの生成元の数が少ない範囲に分布(この範囲内に着目)

Page 14: プログラム理解における Thin slice の 統計的 調査による有用性評価

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

実験結果 (3/3)

• 全 Thin slice の約半分について,データの生成元の数が 6 以下である

• その約半分の Thin slice のうち,複数のメソッドにまたがるものが約 60 %である

14

1 2 3 4 5 6 7 8 9 100%

10%20%30%40%50%60%70%80%90%

100%

tomcatluindexsunflowavrorapmdxalanbatikAVERAGE

データの生成元の数

全スライスに占める割合

Page 15: プログラム理解における Thin slice の 統計的 調査による有用性評価

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

考察

• Thin slice のサイズは平均的に十分小さいと言える– 通常のスライスの平均サイズが約 30 %であ

るのに対し, Thin slice の平均サイズは約1 %である

• データを使用している場所のうち約 30 %で,メソッド呼び出しをたどってデータの生成元を探す作業の簡略化が期待できる– 全 Thin slice の約半分でデータの生成元の数

が少なく,うち約 60 %が複数のメソッドにまたがる

15

Page 16: プログラム理解における Thin slice の 統計的 調査による有用性評価

Department of Computer Science, Graduate School of Information Science and Technology, Osaka University

まとめ

• Thin slice に関する指標を計測し,プログラム理解における有用性を評価した– Thin slice のサイズは平均的に十分小さくな

る– データの使用場所の約 30 %で,データの生

成元をたどる作業の簡略化が期待できる• 今後の応用

– Thin slice を利用したプログラム理解支援ツールの作成• 実際のソフトウェア開発で Thin slice を利用する

16