変数のデータフローを考慮した API利用コード例の検索 井上研究室 竹之内 啓太.

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 1 ソフトウェア部品推薦のための.
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 保守支援を目的とした コードクローン情報検索ツール.
シーケンス図の生成のための実行履歴圧縮手法
情報理工学部 情報システム工学科 ラシキアゼミ 3年 H 井奈波 和也
Riding the Design Wave II
メソッド周辺の識別子と メソッド本体のAPI利用実績に基づいたAPI集合推薦手法
AGMアルゴリズムを用いた ギャップを含むコードクローン情報の生成
情報爆発A01支援班 マイサーチエンジン開発環境支援グループ 中村聡史, 大島裕明, 田中克己, 喜連川優
情報伝播によるオブジェクト指向プログラム理解支援の提案
剽窃 他人の作品や論文を盗んで,自分のものとして発表すること. プログラムが剽窃される事例もある. Aさんのプログラム Xさんのプログラム
変数のスコープの設計判断能力 を育成するプログラミング教育
JavaBeans とJSP データベース論 第5回.
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
類似するコーディングパターンの 利用状況調査ツールの提案
JDBC J2EE I 第4回 /
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
ソードコードの編集に基づいた コードクローンの分類とその分析システム
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
コードクローンの分類に基づいた メソッド引き上げ手順の提案とその有効性評価
ポインタ解析におけるライブラリの スタブコードへの置換の効果
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
JDBC データベース論 第12回.
Javaによる Webアプリケーション入門 第7回
環境リスクマネジメントに関する 検索システム
只見町 インターネット・エコミュージアムの「キーワード」検索の改善
Javaプログラムの変更を支援する 影響波及解析システム
社会シミュレーションのための モデル作成環境
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
オープンソース開発支援のための ソースコード及びメールの履歴対応表示システム
柔軟に変更可能な字句解析機構を持つ コードクローン検出ツールの開発
プログラム実行履歴を用いたコードクローン検出手法
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
JDBC J2EE I (データベース論) 第5回 /
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
Javaソフトウェア部品検索システムSPARS-Jの実験的評価
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
オブジェクト・プログラミング 第8回.
JDBC ソフトウェア特論 第3回.
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
既存ソフトウェア中の 頻出コード片を用いた コード補完手法の提案
コーディングパターンの あいまい検索の提案と実装
インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
同期処理のモジュール化を 可能にする アスペクト指向言語
C#プログラミング実習 第3回.
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
Javaによる Webアプリケーション入門 第4回
オープンソースソフトウェアに対する コーディングパターン分析の適用
ソースコードの編集状況に応じた ソフトウェア部品の自動推薦システム
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
容易に使用可能な grep風コードクローン検索ツール
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
コードクローン解析に基づく デザインパターン適用候補の検出手法
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
プログラム理解のための 付加注釈 DocumentTag の提案
GluonJ を用いたビジネスロジックからのデータベースアクセスの分離
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
Presentation transcript:

変数のデータフローを考慮した API利用コード例の検索 井上研究室 竹之内 啓太

研究背景: API の利用 Application Programming Interface (API) とは 再利用可能なコンポーネント群 「ライブラリ」など 第三者が作成したものを再利用し,開発の効率化につながる しかし,API の利用は必ずしも容易はない[1] それに対し,コード検索による API 理解は頻繁に行われている[1] 一方で,結果には有益でないものが含まれやすい [1] M. P. Robillard, “What makes APIs hard to learn? Answers from developers”, IEEE Software, vol. 26, no. 6, pp. 26–34, 2009.

Statement#executeQuery の戻り値 ResultSet の扱い方を知りたい 研究背景:コード例検索 要望 Statement#executeQuery の戻り値 ResultSet の扱い方を知りたい 「executeQuery」 というキーワードで検索 有益でないコード例 – コメント行  // invoke executeQuery next 有益でないコード例 – メソッドの宣言部  public Resultset executeQuery(String sql){  ... } 有益でないコード例 – メソッド呼び出し直後に return return stmt.executeQuery();

Statement#executeQuery の戻り値 ResultSet の扱い方を知りたい 研究背景:コード例検索 要望 Statement#executeQuery の戻り値 ResultSet の扱い方を知りたい 「executeQuery」 というキーワードで検索 有益なコード例 ResultSet rs に対し, next getString close を呼ぶ流れが分かる ResultSet rs = stmt.executeQuery("SELECT ..."); while (rs.next()) { String commenter = rs.getString(2); String comment = rs.getString(3); String date = rs.getString(4); ... } rs.close(); このようなコード例を狙って提示したい

本研究のアプローチ API 理解のために何が有益か? API と (クライアントサイドの)変数の関係 有益なコード例を提示するため, 仮説 API 理解のために何が有益か? API と (クライアントサイドの)変数の関係 代入 ResultSet rs = stmt.executeQuery("SELECT ..."); while (rs.next()) { String commenter = rs.getString(2); String comment = rs.getString(3); String date = rs.getString(4); ... } rs.close(); 使用 使用 使用 使用 使用 提案手法 有益なコード例を提示するため, 「変数のデータフロー」を指定して検索する

検索クエリの仕様 基本は検索対象となるプログラミング言語のトークン列 これだけを用いて検索すると タイプ1 のクローン検出 3つの特殊なトークン (ワイルドカード) を追加 $変数 _ (アンダースコア) ?? 検索クエリはコードを直感的に抽象化したものであり, 「変数のデータフロー」 を意識しなくても書ける設計

特殊トークン①:$変数 $ から始まる識別子名 任意の1つの変数名にマッチ データフローを追いたい変数に使用 検索クエリ① 検索結果① ResultSet $a = stmt.executeQuery 検索結果① ResultSet rs = stmt.executeQuery(...); 検索クエリ② $sb = new StringBuilder 検索結果② StringBuilder builder = new StringBuilder();

特殊トークン②: _ 1文内の括弧の対応が取れたトークン列にマッチ データフローに興味がない変数に使用 検索クエリ 検索結果① 検索結果② ResultSet $a = _.executeQuery 検索結果① ResultSet rs = stmt.executeQuery(...); 検索結果② ResultSet rs = getStmt().executeQuery(...);

特殊トークン③:?? 任意長のトークン列にマッチ $変数の生存区間 において最長マッチ 検索クエリ 検索結果 $a = _.executeQuery ?? $a 検索結果 ResultSet rs = stmt.executeQuery("SELECT ..."); while (rs.next()) { String commenter = rs.getString(2); String comment = rs.getString(3); String date = rs.getString(4); ... } rs.close();

特殊トークン③:?? 任意長のトークン列にマッチ $変数の生存区間 において最長マッチ 有益なコード例 検索クエリ $a = _.executeQuery ?? $a 有益なコード例 ResultSet rs = stmt.executeQuery("SELECT ..."); while (rs.next()) { String commenter = rs.getString(2); String comment = rs.getString(3); String date = rs.getString(4); ... } rs.close(); ResultSet rs = stmt.executeQuery("SELECT ..."); while (rs.next()) { String commenter = rs.getString(2); String comment = rs.getString(3); String date = rs.getString(4); ... } rs.close();

特殊トークン③:?? 任意長のトークン列にマッチ $変数の生存区間 において最長マッチ 有益でないコード例 – コメント行 検索クエリ 有益でないコード例 – コメント行 $a = _.executeQuery ?? $a  // invoke executeQuery next 有益でないコード例 – メソッドの宣言部  public Resultset executeQuery(String sql){  ... } 有益でないコード例 – 直後に return return stmt.executeQuery();

?? のマッチする区間 検索クエリ $変数の生存区間 $変数のスコープが有効 再代入が行われない 検索対象 マッチするコード片 $a = _.executeQuery ?? $a 検索対象 マッチするコード片 private void foo(){ rs = stmt.executeQuery(sql); ... rs.close(); } private void bar(){ rs = stmt.executeQuery(sql1); rs = getStmt().executeQuery(sql2); rs = stmt.executeQuery(sql); ... rs.close(); 異なるブロック rs = stmt.executeQuery(sql1); ... rs.close(); rs = getStmt().executeQuery(sql2); ... rs.close(); 再代入

アルゴリズムの概要 有限オートマトンベースのマッチング (詳細は論文参照) 有限オートマトン _ ?? $a = . $a 1 2 3 4 検索対象のトークン列 検索クエリ import java . sql . * ・・・ $a = _.executeQuery ?? $a Statement s = conn ・・・ ResultSet rs . executeQuery 変換 先頭トークンから入力 有限オートマトン _ ?? executeQuery $a = . $a 1 2 3 4 5

実装 Webアプリケーションとして実装 既存のコード検索エンジンからコード片をダウンロード メソッド名・クラス名 コード検索エンジン searchcode.com ソースコード その結果… ツール導入の手間なし さまざまな API の検索に対応

評価実験 被験者実験により,提案手法を評価 被験者 : 研究室のM1・M2学生4人ずつ,計8人 比較対象 : 既存のコード検索エンジン 比較対象 : 既存のコード検索エンジン 実験タスク : API を利用するプログラミングタスク(2題) 先行研究[2] のものをそのまま使用 1タスクにつき40分 使用するクラス名・インターフェース名をヒントとして記載 searchcode.com [2] Laura Moreno, Gabriele Bavota, Massimiliano Di Penta, Rocco Oliveto, and Andrian Marcus. “How can I use this method?”, ICSE 2015

調査項目と結果 調査項目は3つ 「検索クエリの記述は容易か?」 実験後,8人中7人が 「どちらかというと容易」と回答. 「使っているうちに理解してきた」という意見が多かった 「検索にかかる時間はどれくらいか?」 結果 平均で 5 秒程度.インタラクティブな検索にも対応 「提案手法は API 理解支援として有用か?」 この後,説明 結果

提案手法は API 理解支援として有用か? タスク2 は「static メソッドの利用方法」について ・・・既存手法 得点率(%) ・・・提案手法 ・・・平均値 タスク1 タスク2 タスク2 は「static メソッドの利用方法」について そもそもメソッドの利用はあまり難しくない

タスク1の検索例 1. HttpClient インターフェースの execute メソッドを用いて, 指定された URL から PDF ファイルをダウンロードしてください. はじめに直面する問題 HttpClient インターフェースのどの実装クラスを使用すべきか HttpClient I DecompressingHttpClient C CachingHttpClient C C A CloseableHttpClient AutoRetryHttpClient C C MinimalHttpClient C A AbstractHttpClient C InternalHttpClient C DefaultHttpClient C ContentEncodeingHttpClient C SystemDefaultHttpClient

タスク1の検索例 1. HttpClient インターフェースの execute メソッドを用いて, 指定された URL から PDF ファイルをダウンロードしてください. HttpClient インターフェースのどの実装クラスを使用すべきか 検索クエリ execute まずはメソッド名を指定

タスク1の検索例 1. HttpClient インターフェースの execute メソッドを用いて, 指定された URL から PDF ファイルをダウンロードしてください. HttpClient インターフェースのどの実装クラスを使用すべきか 検索クエリ $a.execute レシーバとなる変数を $a で表現

タスク1の検索例 1. HttpClient インターフェースの execute メソッドを用いて, 指定された URL から PDF ファイルをダウンロードしてください. HttpClient インターフェースのどの実装クラスを使用すべきか 検索クエリ $a = ?? $a.execute $a に代入される部分を見たい

タスク1の検索例 HttpClient $a = ?? $a.execute 1. HttpClient インターフェースの execute メソッドを用いて, 指定された URL から PDF ファイルをダウンロードしてください. HttpClient インターフェースのどの実装クラスを使用すべきか $a の宣言型は HttpClient 検索クエリ HttpClient $a = ?? $a.execute 実際に見られた検索クエリ

実装クラス DefaultHttpClient を使用 タスク1の検索例 1. HttpClient インターフェースの execute メソッドを用いて, 指定された URL から PDF ファイルをダウンロードしてください. 検索クエリ HttpClient $a = ?? $a.execute 検索結果 1: HttpClient httpClient = new DefaultHttpClient(); 2: HttpGet httpget = new HttpGet(service + id); 3: httpget.setHeader("Accept", "application/json"); 4: HttpResponse response = httpClient.execute(httpget); 1: HttpClient httpClient = new DefaultHttpClient(); 2: HttpResponse response = httpClient.execute(httpPost); 実装クラス DefaultHttpClient を使用

まとめと今後の展望 本研究では,変数のデータフローによる API 利用コード例の検索手法を提案した. 独自の検索クエリを導入 Webアプリケーションとして実装 既存のコード検索エンジンから検索対象を取得 評価実験では,提案手法が有効にはたらく例を確認した 今後の展望としては Webアプリケーションを一般に公開する 利用者からのフィードバックを収集する