メトリクス計測 プラグインプラットフォームMASU

メトリクス計測
プラグインプラットフォーム
MASU
肥後 芳樹,山田吾郎,齋藤晃,
三宅 達也
Department of Computer Science,
Graduate School of Information Science & Technology,
Osaka University
研究背景,
MASU作成の動機
Department of Computer Science,
Graduate School of Information Science & Technology,
Osaka University
2008/10/15
MASUセミナー 2008/10/15
2
ソフトウェアメトリクス

ソフトウェアの品質評価や工数・保守コスト予測などに
用いられる尺度
 CKメトリクス,サイクロマチック数など

ソフトウェアの概念的な要素に対して定義される
 プログラミング言語間の記述様式の差異にとらわれない

ソフトウェアメトリクス計測
 ソースコード解析

ソースコード解析を行うためのプログラムは言語依存
 メトリクス値計測

計測のためのビジネスロジックは言語非依存
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
3
ソースコード解析
解析器と呼ばれるプログラムを用いてソースコードの
情報を抽出
 さまざまな目的で用いられる

 QA
( Quality Assurance )
 ソフトウェア工学の研究

問題点
 大きなコストを必要とする

構文解析だけでなく,意味解析が必要
 目的に応じて解析器に要求される情報は異なる
 言語に応じた解析器が必要
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
4
ソフトウェアメトリクス計測ツール
さまざまなソフトウェアメトリクス計測ツールが開発され
ている
 多言語に適用できるツールは少ない
 同一のメトリクスであっても,計測ツールごとに結果
が異なる[Lincke08]
 特定のメトリクスの計測に特化している
 メトリクスごとに計測ツールを探す必要がある
 応用が困難
 新規メトリクスへの対応
 組織独自のロジックを用いた計測
[Lincke08] R. Lincke, J. Lundberg and W. Lowe “Comparing Software
2008/10/15
MASUセミナー
2008/10/15
Metrics Tools” ISSTA’08,
July
20-24, 2008, Seattle, Washington, USA.
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
5
メトリクス計測ツールへの要求
複数言語の解析結果から統一的にメトリクス計測を行
える必要がある
 メトリクス計測のためのロジックを独自に定義可能
 低コストで実装可能


メトリクス計測プラグインプラットフォームMASUを開発
 Metrics
Assessment plug-in platform for Software Unit
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
6
MASUの概要
Department of Computer Science,
Graduate School of Information Science & Technology,
Osaka University
2008/10/15
MASUセミナー 2008/10/15
7
MASUの入出力

入力
 (オブジェクト指向)プログラムのソースコード

出力
 メトリクスの計測結果
 ソースコード解析情報
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
8
MASUの特徴

メトリクス計測ロジックを記述するのみで,計測するメト
リクスを追加できる
 ファイル1つ(数十行程度)を実装するのみでOK

複数のプログラミング言語に対応しており,多言語の
解析結果を統一的に扱える
 現在の対応言語:Java,C#
(version 1)
 C/C++には対応予定(どこまで作り込めるかわからない)

ソースコード解析ツールとして応用可能
 卒論・修論ツールの一部として使える
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
9
MASUのアーキテクチャと処理の流れ
メインモジュール
解析結果
ソースコード
解析結果
ソースコード解析部
解析結果取得用API
解析終了
プ
ラ
グ
ふぇfd
イ
ン
1
プラグイン制御部
プラグイン
実行終了
メトリクス
計測結果
全メトリ
クス値
プ
ラ
グ
イ
ン
2
プ
ラ
グ
イ
ン
3
・・・
メトリクス値格納用API
メトリクス集計部
メトリクス値
MASUセミナー 2008/10/15
メトリクス値
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
10
ソースコード解析部
ソースコード解析部
ソース
コード

 言語非依存のASTを構築
AST構築部
言語
非依存
AST
 各言語ごとに用意

AST解析部
 言語非依存な共通データを構築

AST解析部
AST
解析
データ
AST構築部

データ構造構築部
 各データ間の関係を解析

解析
結果
データ構造構築部
クラス,メソッド,フィールドなどの
情報

メソッドの呼び出し関係
変数の宣言と参照情報
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
11
ソースコード解析部~AST構築部~
言語非依存なAST
ソースコード
class SampleClass extends SuperClass{
public void sample(String arg) {
System.out.println( arg );
}
}
Java
Class SampleClass Inherits SuperClass
Public Sub Sample(arg as String)
Console.WriteLine( arg )
End Sub
End Class
VB
A
S
T
構
築
部
class SampleClass : SuperClass {
public void sample(String arg){
Console.WriteLine( arg );
}
}
C#
MASUセミナー 2008/10/15
CLASS_DEFINITION
NAME
SampleClass
INHERITANCE
SuperClass
CLASSBLOCK_START
METHOD_DEFINITION
MODIFIERS
public
RETURN_TYPE
void
NAME
sample
PARAMETERS
METHOD_PARAM_DEF
TYPE
String
NAME
arg
BLOCK_START
EXPRESSION
METHOD_CALL
・
2008/10/15
・
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
12
言語間の差異の吸収

構文的差異の吸収
 共通ノードを定義

トークンの違いを吸収
 状態定義ノードの埋め込み


出現順の違いを吸収
意味的に等価な異なる概念の差異を吸収
 異なる部分木を等価な部分木に変換
例



C#やVBのプロパティ > アクセサメソッド
C#などのストラクチャ > データ管理クラス
VBなどのサブルーチン > void 型のメソッド
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
13
構文的差異の吸収例~共通ノードを定義~
言語非依存なAST
ソースコード
class SampleClass extends SuperClass{
public void sample(String arg) {
System.out.println( arg );
}
}
Java
Class SampleClass Inherits SuperClass
Public Sub Sample(arg as String)
Console.WriteLine( arg )
End Sub
End Class
VB
class SampleClass : SuperClass {
public void sample(String arg){
Console.WriteLine( arg );
}
}
C#
A
S
T
構
築
部
トークンの
違いを吸収
MASUセミナー 2008/10/15
CLASS_DEFINITION
NAME
SampleClass
INHERITANCE
SuperClass
CLASSBLOCK_START
METHOD_DEFINITION
MODIFIERS
public
RETURN_TYPE
void
NAME
sample
PARAMETERS
METHOD_PARAM_DEF
TYPE
String
NAME
arg
BLOCK_START
EXPRESSION
METHOD_CALL
・
2008/10/15
・
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
14
構文的差異の吸収例~状態定義ノードの埋め込み~
型 > 名前の順で定義
言語非依存なAST
ソースコード
class SampleClass extends SuperClass{
public void sample(String arg) {
System.out.println( arg );
}
}
Java
Class SampleClass Inherits SuperClass
Public Sub Sample(arg as String)
Console.WriteLine( arg )
End Sub
End Class
VB
CLASS_DEFINITION
METHOD_PARAM_DEF
NAME
String
SampleClass
INHERITANCE
arg
A
S
T
構
築
部
名前 > 型の順で定義
class SampleClass : SuperClass {
public void sample(String arg){
METHOD_PARAM_DEF
Console.WriteLine( arg );
} arg
}
String
C#
記述順序の
違いを吸収
MASUセミナー 2008/10/15
SuperClass
CLASSBLOCK_START
METHOD_DEFINITION
MODIFIERS
public
RETURN_TYPE
void
NAME
sample
PARAMETERS
METHOD_PARAM_DEF
TYPE
String
NAME
arg
BLOCK_START
EXPRESSION
METHOD_CALL
・
2008/10/15
・
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
15
言語間の差異の吸収

構文的差異の吸収
 共通ノードを定義

トークンの違いを吸収
 状態定義ノードの埋め込み


出現順の違いを吸収
意味的に等価な異なる概念の差異を吸収
 異なる部分木を等価な部分木に変換
例



C#やVBのプロパティ > アクセサメソッド
C#などのストラクチャ > データ管理クラス
VBなどのサブルーチン > void 型のメソッド
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
16
ソースコード解析部~AST解析部~
言語共通要素解析器
AST解析部
クラス情報解析器
 目的に応じた解析対象要
言語共通要素
素の変更
解析器群
メソッド情報解析器
変数情報解析器
・
・
・
 高い拡張性を提供
Java特有要素解析器
言語特有要素
 解析対象要素の追加
解析器群
 特定の言語に特化した解析
連携
アノテーション情報解析器
・
・
・
C#特有要素解析器
プロパティ情報解析器
構築中データ管理部
MASUセミナー 2008/10/15
・
・
・
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
17
プラグインの作成
Department of Computer Science,
Graduate School of Information Science & Technology,
Osaka University
2008/10/15
MASUセミナー 2008/10/15
18
プラグインの特徴

各プラグインは1つのメトリクスを計測
 メトリクス計測ロジックのみを記述

メトリクス計測対象となる要素
 クラス,メソッド,フィールド,ファイル

計測の流れ
 解析結果取得用APIを用いてメインモジュールの解
析した情報を取得
 メトリクス計測ロジックの実行
 メトリクス格納用APIを用いて計測結果を登録
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
19
セキュリティの安全性
アクセス制御をスレッド単位で動的に行うセ
キュリティマネージャを提供
プラグインとメインモジュール間のアクセス制
御
 プラグイン側からメインモジュールの構築した情報を不正
に変更することを禁止
各プラグイン間のアクセス制御
 あるプラグインが他のプラグインの構築した情報を不正
に変更することを禁止
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
20
MASUのプラグイン関連部分
MASU提供部
AbstractPlugin
・・・・・・・
メインモジュールと協調するためのAPI
AbstractClassMetricPlugin
AbstractMethodMetricPlugin
・・・・・・・
・・・・・・・
measureClassMetricメソッド
measureMethodMetricメソッド
ユーザ記述部(Plugin実装)
CBOPlugin
・・・・・・・
CyclomaticPlugin
・・・・・・・
measureClassMetricメソッド
(計測ロジックを実装)
measureMethodMetricメソッド
(計測ロジックを実装)
・・・・・
登録
(ファルダ内に配置)
Pluginsフォルダ
CBOPlugin.jar
AOASIA3
CyclomaticPlugin.jar
MASUセミナー 2008/10/15
・・・・・
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
21
プラグイン作成手順
1.
メトリクス計測ロジックを実装する
 AbstractXXXMetricPlugin

の子クラスとする
XXX:Class,Method,Field,Fileのいずれか
 いくつかのメソッドをオーバーライドする

Eclipse を使うとオーバーライドしなければならないメソッドがすぐに
わかる
コンパイルをとおす
3. Jarファイルにする
4. pluginsフォルダにJarファイルを置く
2.

2.3.4.は既存プラグインのbuild.xmlを用いると簡単
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
22
プラグイン作成の例:RFCメトリクス

RFCメトリクスとは・・・
メトリクスの1つ,クラスの応答(Response)を
表す
 ローカルメソッドの数とリモートメソッドの数の和
 CK
 ローカルメソッドとは,計測対象クラスに定義されているメ
ソッド
 リモートメソッドとは,ローカルメソッド内で呼び出されてい
るメソッド
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
23
RFCプラグインの説明
RFCプラグイン(117行)
/**
* RFCを計測するプラグインクラス.
*
* @author rniitani
*/
public class RfcPlugin extends AbstractClassMetricPlugin {
/**
* 詳細説明文字列定数
*/
private final static String DETAIL_DESCRIPTION;
AbstractClassMetricsPluginを継承
public class RFCPlugin extends AbstractClassMetricPlugin {
/**
* メトリクスの計測.
*
* @param targetClass 対象のクラス
*/
@Override
protected Number measureClassMetric(TargetClassInfo targetClass) {
// この数が RFC
final Set<MethodInfo> rfcMethods = new HashSet<MethodInfo>();
// 現在のクラスで定義されているメソッド
final Set<TargetMethodInfo> localMethods = targetClass.getDefinedMethods();
rfcMethods.addAll(localMethods);
// localMethods で呼ばれているメソッド
for (final TargetMethodInfo m : localMethods) {
rfcMethods.addAll(m.getCallees());
}
return new Integer(rfcMethods.size());
}
/**
* このプラグインの簡易説明を1行で返す
* @return 簡易説明文字列
*/
@Override
protected String getDescription() {
return "Measuring the RFC metric.";
}
/**
* このプラグインの詳細説明を返す
* @return 詳細説明文字列
*/
@Override
protected String getDetailDescription() {
return DETAIL_DESCRIPTION;
}
/**
* メトリクス名を返す.
*
* @return メトリクス名
*/
@Override
protected String getMetricName() {
return "RFC";
}
/**
* このプラグインがメソッドに関する情報を利用するかどうかを返すメソッド.
* trueを返す.
*
* @return true.
*/
@Override
protected boolean useMethodInfo() {
return true;
}
/**
* このプラグインがメソッド内部に関する情報を利用するかどうかを返すメソッド.
* trueを返す.
*
* @return true.
*/
@Override
protected boolean useMethodLocalInfo() {
return true;
}
static {
// DETAIL_DESCRIPTION 生成
{
StringWriter buffer = new StringWriter();
PrintWriter writer = new PrintWriter(buffer);
writer.println("This plugin measures the RFC (Response for a Class) metric.");
writer.println();
writer.println("RFC = number of local methods in a class");
writer.println(" + number of remote methods called by local methods");
writer.println();
writer.println("A given remote method is counted by once.");
writer.println();
writer.flush();
メトリクス計測ロジックを実装(13行)
@Override
protected Number measureClassMetric (TargetClassInfo t) {
・・・
}
その他のメソッドをオーバーライド(各1行程度)
@Override protected String getDescription() {・・・}
@Override protected String getDetailDescription() {・・・}
@Override protected String getMetricName() {・・・}
@Override protected boolean useMethodInfo() {・・・}
@Override protected boolean useMethodLocalInfo() {・・・}
DETAIL_DESCRIPTION = buffer.toString();
}
}
}
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
24
クラスのAPIの例
jp.ac.osaka_u.ist.sel.metricsltool.main.data.target.TargetClassInfo
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
25
メソッドのAPIの例
jp.ac.osaka_u.ist.sel.metricstool.main.data.target.MethodInfo
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
26
ソースコード解析ツール
としての利用
Department of Computer Science,
Graduate School of Information Science & Technology,
Osaka University
2008/10/15
MASUセミナー 2008/10/15
27
解析ツールとしての利点

MASUのソースコード解析情報を利用したツー
ルの実装
 低コストで実装可能
 質の高い機能を実装可能
 MASUの対応している言語全てに対して適用可能
検出ツール
Java
C#
MASU
VB
MASUセミナー 2008/10/15
変換ツール
・
・
・
・
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
28
利用方法
1.
解析ツールのmainメソッドを定義するクラスを,MetricsToolク
ラスの子クラスとして定義
2.
解析に必要な情報をSettingsクラスに与える

対象言語,対象ソースファイルなど
3.
MetricsToolクラスに定義されているanalyzeTargetFilesメソッ
ドを呼び出し,対象ソースファイルを解析
4.
解析結果を利用

DataManagerから,ClassInfoManager, MethodInfoManager,
FieldInfoManager, FileInfoManagerを取得
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
29
簡単な例(要素名の出力)
public class Simple01 extends MetricsTool {
public static void main(String[] args) {
// 解析用設定
Settings.getInstance().setLanguage("java");
Settings.getInstance().setTargetDirectory(
"H:\\eclipse\\eclipse-3.5\\workspace\\masu");
Settings.getInstance().setVerbose(true);
// 対象ファイルの解析
final Simple01 simple = new Simple01();
simple.readTargetFiles();
simple.analyzeTargetFiles();
// 対象クラス一覧を取得
final Set<TargetClassInfo> classes = DataManager.getInstance()
.getClassInfoManager().getTargetClassInfos();
for (final TargetClassInfo classInfo : classes) {
System.out.println(classInfo.getFullQualifiedName("."));
}
// 対象メソッド一覧を取得
final Set<TargetMethodInfo> methods = DataManager.getInstance()
.getMethodInfoManager().getTargetMethodInfos();
for (final TargetMethodInfo method : methods) {
System.out.println(method.getMethodName());
}
// 対象フィールド一覧を取得
final Set<TargetFieldInfo> fields = DataManager.getInstance()
.getFieldInfoManager().getTargetFieldInfos();
for (final TargetFieldInfo field : fields) {
System.out.println(field.getName());
}
// 対象ファイル一覧を取得
final Set<FileInfo> files = DataManager.getInstance()
.getFileInfoManager().getFileInfos();
for (final FileInfo file : files) {
System.out.println(file.getName());
}
}
}
1. MetricsToolクラスを継承
public class Simple01 extends MetricsTool {
2. 解析に必要な情報をセット
Settings.getInstance().setLanguage("java");
Settings.getInstance().setTargetDirectory(
"H:\\eclipse\\eclipse-3.5\\workspace\\masu");
Settings.getInstance().setVerbose(true);
3. ファイルを登録し,解析
final Simple01 simple = new Simple01();
simple.readTargetFiles();
simple.analyzeTargetFiles();
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
30
簡単な例(要素名の出力)
public class Simple01 extends MetricsTool {
public static void main(String[] args) {
// 解析用設定
Settings.getInstance().setLanguage("java");
Settings.getInstance().setTargetDirectory(
"H:\\eclipse\\eclipse-3.5\\workspace\\masu");
Settings.getInstance().setVerbose(true);
// 対象ファイルの解析
final Simple01 simple = new Simple01();
simple.readTargetFiles();
simple.analyzeTargetFiles();
// 対象クラス一覧を取得
final Set<TargetClassInfo> classes = DataManager.getInstance()
.getClassInfoManager().getTargetClassInfos();
for (final TargetClassInfo classInfo : classes) {
System.out.println(classInfo.getFullQualifiedName("."));
}
// 対象メソッド一覧を取得
final Set<TargetMethodInfo> methods = DataManager.getInstance()
.getMethodInfoManager().getTargetMethodInfos();
for (final TargetMethodInfo method : methods) {
System.out.println(method.getMethodName());
}
// 対象フィールド一覧を取得
final Set<TargetFieldInfo> fields = DataManager.getInstance()
.getFieldInfoManager().getTargetFieldInfos();
for (final TargetFieldInfo field : fields) {
System.out.println(field.getName());
}
// 対象ファイル一覧を取得
final Set<FileInfo> files = DataManager.getInstance()
.getFileInfoManager().getFileInfos();
for (final FileInfo file : files) {
System.out.println(file.getName());
}
}
}
4. 対象クラス一覧を取得して,その完全限定名を出力
final Set<TargetClassInfo> classes =
DataManager.getInstance().getClassInfoManager().getTarget
ClassInfos();
for (final TargetClassInfo classInfo : classes){
System.out.println(classInfo.getFullQualifiedName("."));
}
5. 対象メソッド一覧を取得
final Set<TargetMethodInfo> methods =
DataManager.getInstance().getMethodInfoManager() .getTarg
etMethodInfos();
6. 対象フィールド一覧を取得
final Set<TargetFieldInfo> fields =
DataManager.getInstance().getFieldInfoManager().getTargetFi
eldInfos();
7. 対象ファイル一覧を取得
final Set<FileInfo> files =
DataManager.getInstance().getFileInfoManager().getFileInfos(
);
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
31
MASUの利用について
Department of Computer Science,
Graduate School of Information Science & Technology,
Osaka University
2008/10/15
MASUセミナー 2008/10/15
32
SourceForgeで公開

SourceForge上でのURL
 http://sourceforge.net/projects/masu/
 配布パッケージを公開中

ソースコードはsubversionでチェックアウト


svn co https://masu.svn.sourceforge.net/svnroot/masu/svnroot/main masu
ライセンスはEPL (Eclipse Public License)
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
33
バグ,要望レポート

MASUを利用して,バグや要望を見つけた場合
は,是非報告をお願いします
 [email protected]

近い将来組み込まれる予定の機能
 コメント情報の取得
 アノテーション情報の取得
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
34
MASU利用者メーリングリスト

アドレス
 [email protected]

登録されている人たち
 現在のところ,開発者(肥後,山田,齋藤)と利用者数名(楠
本研,井上研,菊野研の学生)

利用目的
 開発者から利用者へ向けての更新情報

登録希望の人は,肥後まで連絡ください
 連絡先:[email protected]
MASUセミナー 2008/10/15
2008/10/15
Department of Computer Science, Graduate School of Information Science & Technology, Osaka University
35