メソッド周辺の識別子と メソッド本体のAPI利用実績に基づいたAPI集合推薦手法

Slides:



Advertisements
Similar presentations
API 呼び出し列の差分を利用した Android アプリケーション比較ツールの 試作 井上研究室 神田 哲也.
Advertisements

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 1 ソフトウェア部品推薦のための.
シーケンス図の生成のための実行履歴圧縮手法
アルゴリズムとデータ構造 2013年6月18日
アルゴリズムとデータ構造1 2005年7月8日
ソースコードの編集内容を用いた ソフトウェア部品の自動推薦手法
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
Object Group ANalizer Graduate School of Information Science and Technology, Osaka University OGAN visualizes representative interactions between a pair.
アルゴリズムとデータ構造 2012年6月14日
動詞に着目した相関ルールを利用するメソッド名の命名支援手法の評価
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
アルゴリズムとデータ構造 2011年6月14日
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
プログラム実行履歴を用いたトランザクションファンクション抽出手法
プログラム実行時情報を用いたトランザクションファンクション抽出手法
相関ルールマイニングを用いた メソッドの命名方法の分析
Javaソフトウェア部品 解析・検索システムSPARS-Jの構築
ソースコード中に出現する 動詞-目的語関係を利用した メソッド名の命名支援手法
類似するコーディングパターンの 利用状況調査ツールの提案
コーディングパターンと キーワードを用いて生成したコードスニペットの推薦
Javaクラスの利用関係を用いた ソフトウェア部品のカテゴリ階層構築法
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
識別子の共起関係に基づく類似コード検索法の提案と 欠陥検出への適用
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
ポインタ解析におけるライブラリの スタブコードへの置換の効果
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
EclipseでWekaのAPIを呼び出す
変数のデータフローを考慮した API利用コード例の検索 井上研究室 竹之内 啓太.
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
只見町 インターネット・エコミュージアムの「キーワード」検索の改善
Javaプログラムの変更を支援する 影響波及解析システム
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードクローンの動作を比較するためのコードクローン周辺コードの解析
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
Webコミュニティ概念を用いた Webマイニングについての研究 A study on Web Mining Based on Web Communities 清水 洋志.
プログラムで多用される 動詞と目的語の関係を利用した メソッド名提案ツール
プログラム理解におけるThin sliceの 統計的調査による有用性評価
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
既存ソフトウェア中の 頻出コード片を用いた コード補完手法の提案
コーディングパターンの あいまい検索の提案と実装
アルゴリズムとプログラミング (Algorithms and Programming)
C#プログラミング実習 第3回.
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
dcNavi:デバッグ支援のための グラフベース推薦システム
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
ソースコードの編集状況に応じた ソフトウェア部品の自動推薦システム
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
ソフトウェア理解支援を目的とした 辞書の作成法
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
コードクローン解析に基づく デザインパターン適用候補の検出手法
メソッド抽出リファクタリングが 行われるメソッドの特徴調査
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
ベイジアンネットワークと クラスタリング手法を用いたWeb障害検知システムの開発
プログラム依存グラフを用いた ソースコードのパターン違反検出法
Presentation transcript:

メソッド周辺の識別子と メソッド本体のAPI利用実績に基づいたAPI集合推薦手法 井上研究室 M2 鬼塚 勇弥

背景 正確で効率的なソフトウェア開発が求められる 様々なライブラリが API を通して機能を提供 社会の様々な場面で使用されるソフトウェアには 信頼性が求められる 技術の進歩が早いため,遅れを取らないために 納期は短くなっている 様々なライブラリが API を通して機能を提供 複数の呼び出しメソッドを組み合わせて開発を行う どの呼び出しメソッドをどのように組み合わせるかを調べたり考えたりするのが難しい

メソッド本体の情報に基づく コード推薦手法[1] メソッド本体に記述したコード片に続くであろう ソースコードの候補を推薦 API がどのように使われるかを開発者に提示 使用する数個の API を記述してから使用 使用すべき API が分からないと使えないのが弱点 private String findPath (String parentPath, String soughtPathElement) { FTPFile[] theFiles = listFiles(parentPath,false); } メソッド本体の一部まで 入力 [1] 山本哲男・吉田則裕・肥後芳樹 (2011) 「ソースコードコーパスを利用したシームレスな再利用支援」

メソッド本体の情報に基づく コード推薦手法[1] メソッド本体に記述したコード片に続くであろう ソースコードの候補を推薦 API がどのように使われるかを開発者に提示 使用する数個の API を記述してから使用 使用すべき API が分からないと使えないのが弱点 private String findPath (String parentPath, String soughtPathElement) { FTPFile[] theFiles = listFiles(parentPath,false); if (theFiles == null) { return null; } ... 入力した文に続く ソースコードを挿入 [1] 山本哲男・吉田則裕・肥後芳樹 (2011) 「ソースコードコーパスを利用したシームレスな再利用支援」

提案手法 記述したメソッド名やその周辺の識別子から, メソッド本体に適した呼び出しメソッドの組を推薦 メソッド本体を記述していない状態で使用 どの API を使うべきかを開発者に提示 メソッド本体を記述していない状態で使用 本体で使用する API が分からない人にも使用可能 private String findPath メソッド名まで 入力

提案手法 記述したメソッド名やその周辺の識別子から, メソッド本体に適した呼び出しメソッドの組を推薦 メソッド本体を記述していない状態で使用 どの API を使うべきかを開発者に提示 メソッド本体を記述していない状態で使用 本体で使用する API が分からない人にも使用可能 private String findPath () { listFiles(); getName(); equalsIgnoreCase(); } メソッド本体の雛形を生成 (開発者が編集して完成させる)

選択した雛形を編集して メソッド本体を完成させる 提案手法の構成 提案手法は2つの仕組みから構成される メソッド本体と識別子の関連の学習 メソッド本体の雛形生成 事前に A を行っておく A.メソッド本体と識別子の関連の学習 B. メソッド本体の雛形生成 ソースコード の情報 解析 雛形DB メソッド本体の 雛形候補リスト 既存のソースコード 選択した雛形を編集して メソッド本体を完成させる

提案手法の構成 A.メソッド本体と識別子の関連の学習 B. メソッド本体の雛形生成 ソースコード の情報 解析 雛形DB メソッド本体の 雛形候補リスト 既存のソースコード

A. メソッド本体と識別子の 関連の学習 大量のソースコードからメソッド周辺の識別子を 取得 取得した識別子集合から,メソッド本体と識別子の関連を抽出 相関ルールマイニングを利用 A.メソッド本体と識別子の関連の学習 クラス名:Stock メソッド名:set ... Stock ⇒ Product ... 雛形DB 抽出した情報 得られた関連 既存のソースコード 解析用計算機 1. 識別子の取得 2. 関連の抽出

1. 識別子の取得 メソッド定義に対して以下の4種の情報を組で取得 入力したソースコード集合の全メソッド定義から取得 クラス名 (親,インターフェイス) メソッド名の動詞,目的語 呼び出しメソッド アクセスしたフィールド名 入力したソースコード集合の全メソッド定義から取得 public class Stock extends AbstractStock { ArrayList products; void setProduct(Product p) { products.add(p); } ① ② 動詞:set, 目的語:Product ④ ③ c: クラス名 mv: メソッド名の動詞 mo: メソッド名の目的語 f: アクセスしたフィールド i. c:Stock mv:set mo:Product ... ii. mv:add f:products

2. 関連の抽出 1 で得られた大量の識別子から,メソッド本体とメソッド周辺の識別子にある関連を抽出 関連は相関ルールマイニングによって抽出

相関ルールとは 同時性や関係性が強い事象間の関係 POS システムの購買履歴での利用が有名 X ⇒ Y: 事象 X のもとで事象 Y が発生する関係 X を条件部,Y を帰結部と呼ぶ 支持度: X と Y の両方を含むデータの割合 確信度: X を含むデータのうち Y を含むものの割合 POS システムの購買履歴での利用が有名 Aさん おにぎり 牛乳 ジャム Bさん パン 雑誌 Cさん お茶 Dさん 牛乳 ⇒パン 支持度: 2/4 確信度: 2/3

ソースコードに対して 相関ルールマイニングを実行 関連の強い識別子の情報を相関ルールとして取得 メソッド周辺の識別子とメソッド本体には どのような関連があるかに着目 帰結部が呼び出しメソッドであるルールのみ抽出 メソッド1 c:DAO mv:update ... メソッド2 mv:add ・c:DAO ・mv:update ・mo:UserInfo ・m:createStatement ・m:executeUpdate ・m:close ⇒ c: クラス名 mv: メソッド名の動詞 mo: メソッド名の目的語 f: アクセスしたフィールド

提案手法の構成 A.メソッド本体と識別子の関連の学習 B. メソッド本体の雛形生成 ソースコード の情報 解析 雛形DB メソッド本体の 雛形候補リスト 既存のソースコード

B. メソッド本体の雛形生成 記述中のソースコードから学習に使用した識別子 を取得 取得した情報でデータベースを検索し,メソッド本体の雛形の候補を生成 雛型の候補を並び替えて開発者に提示 抽出した情報 検索 識別子の抽出 雛形DB クラス名:Stock メソッド名:set ... {executeUpdate, createStatement} {get, update, close} ... 並び替えて提示 呼び出しメソッド集合の候補リスト

1. 識別子の取得 関連の学習で使用した 識別子を記述中のコード から取得 呼び出しメソッドは除く フィールドは定義されているもの全ての名前を取得 public class Stock extends AbstractStock { ArrayList products; void setProduct } ① ③ ② 動詞:set, 目的語:Product c: クラス名 mv: メソッド名の動詞 mo: メソッド名の目的語 f: アクセスしたフィールド c:Stock mv:set mo:Product ...

2. データベースの検索 条件部が1で得られた識別子の部分集合で あるような相関ルールを検索 1ルールの帰結部から1つの候補を生成 定義するメソッドと関連の強い相関ルールを取得 1ルールの帰結部から1つの候補を生成 {Stock, set, Product} => {executeUpdate, createStatement} {Stock} => {get, update, close} 雛形DB c:Stock mv:set mo:Product ... 検索 … {executeUpdate, createStatement} {get, update, close} ...

3. 候補の提示 開発者に雛型の候補リストを提示する 候補リストは支持度,確信度,要素数といった基準を組み合わせて並び替える 開発者はその中から使用したいものを選択し ソースコードに挿入する 開発者はこの雛形を編集してメソッド本体を記述 候補リストは支持度,確信度,要素数といった基準を組み合わせて並び替える 辞書作成とは別のソースコード集合を用いて パラメータチューニング 支持度や条件部の要素数の重みが大きいという結果

本手法を用いたツール 返り値の型とメソッド名を入力

ツールを呼び出すと メソッド本体の候補リストが表示される 本手法を用いたツール ツールを呼び出すと メソッド本体の候補リストが表示される

本手法を用いたツール 選択したメソッド本体の雛型が コメントの形で挿入される

実験 目的 方法 使用したソースコード 評価基準 本ツールで有用な情報を開発者に与えられるか メソッド本体を削除したソースコードに本ツールを使用 ツールで推薦した候補と削除したメソッド本体を比較 使用したソースコード 学習: 約30万ファイルのソースコード 評価: 学習に使用していない1万ファイルのソースコード 評価基準 適合率,再現率

既存のソースコードと推薦結果の 比較方法 public class Stock { public void print(int id) { Product p = products.find(id); if (p == null) { return; } ProductReader pr = new ProductReader(p); while (pr.read() != null) { System.out.println(pr); pr.close();

ソースコードと推薦結果の 比較方法 メソッド本体から 呼び出しメソッドを抽出 (これを正解メソッドとする) 正解メソッド find() public class Stock { public void print(int id) { Product p = products.find(id); if (p == null) { return; } ProductReader pr = new ProductReader(p); while (pr.read() != null) { System.out.println(pr); pr.close(); 正解メソッド find() read() println() close() メソッド本体から 呼び出しメソッドを抽出 (これを正解メソッドとする)

ソースコードと推薦結果の 比較方法 2. メソッド本体を削除し ツールで推薦候補を生成 正解メソッド find() read() public class Stock { public void print(int id) { Product p = products.find(id); if (p == null) { return; } ProductReader pr = new ProductReader(p); while (pr.read() != null) { System.out.println(pr); pr.close(); 正解メソッド find() read() println() close() 2. メソッド本体を削除し ツールで推薦候補を生成 候補1 候補2 候補3 ... find() get() set() read() equals() close() println()

ソースコードと推薦結果の 比較方法 正解メソッドと 推薦された候補を比較 正解メソッド find() read() println() public class Stock { public void print(int id) { Product p = products.find(id); if (p == null) { return; } ProductReader pr = new ProductReader(p); while (pr.read() != null) { System.out.println(pr); pr.close(); 正解メソッド find() read() println() close() 正解メソッドと 推薦された候補を比較 候補1 候補2 候補3 ... find() get() set() read() equals() close() println()

評価基準 2 つの適合率と 1 つの再現率を定義 適合率1: 正解メソッドを1つでも含む候補数 ツールで提示した全候補数 適合率1: 正解メソッドを1つでも含む候補数 ツールで提示した全候補数 開発者の手掛かりとなりそうな候補の割合を調査 適合率2: 正解メソッドと一致した呼び出しメソッド数 提示した全呼び出しメソッド数 候補にどのくらい正解メソッドが含まれるかを調査 再現率: ツールで推薦できた正解メソッド数 全正解メソッド数 正解メソッドのうちツールで推薦できた割合を調査

結果 各順位までの候補における適合率,再現率を調査 適合率1 適合率2 再現率 1位までの候補 0.128 0.133 0.031 5位まで 0.109 0.102 0.078 10位まで 0.096 0.089 0.103 30位まで 0.082 0.068 0.148 候補全体 0.053 0.027 0.290

考察 比較する研究がなく結果の良い/悪いは評価できない どの適合率も低い順位を見るにつれて減少 並び替えによって正解が上位に提示されている 正解を含む候補の元になった相関ルールの条件部を追加調査 条件部にメソッドの動詞をもつ相関ルール 84% に対して条件部にクラス名をもつ相関ルールは 11% しかない 完全一致するクラス名は少ないため,クラス名の情報を 推薦に上手く使えていない 単語ごとに分割して学習や検索を行うことで部分一致する クラスの情報も推薦に使用できる

まとめと今後の課題 まとめ 今後の課題 API 集合を開発者に推薦することで開発効率を向上させる手法を提案 推薦する API 集合は相関ルールマイニングで 学習した API 利用実績を使用 今後の課題 API を集合としてではなく列として推薦 メソッド本体にコードを記述した後に使用できる コード補完手法と連携