メトリクス計測 プラグインプラットフォーム 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
© Copyright 2024 ExpyDoc