コーディングパターンの あいまい検索の提案と実装

Slides:



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

Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 1 ソフトウェア部品推薦のための.
シーケンス図の生成のための実行履歴圧縮手法
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
シーケンシャルパターンマイニングに基づくオブジェクト指向プログラムのための 欠陥検出手法
メソッド周辺の識別子と メソッド本体のAPI利用実績に基づいたAPI集合推薦手法
ソースコードの編集内容を入力とした ソフトウェア部品の自動検索
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
分散処理を用いた大規模ソフトウェアに対するコーディングパターン検出ツール
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
プログラム実行履歴を用いたトランザクションファンクション抽出手法
プログラム実行時情報を用いたトランザクションファンクション抽出手法
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
類似するコーディングパターンの 利用状況調査ツールの提案
コーディングパターンと キーワードを用いて生成したコードスニペットの推薦
Javaクラスの利用関係を用いた ソフトウェア部品のカテゴリ階層構築法
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
識別子の共起関係に基づく類似コード検索法の提案と 欠陥検出への適用
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
コードクローンの分類に基づいた メソッド引き上げ手順の提案とその有効性評価
動的依存グラフの3-gramを用いた 実行トレースの比較手法
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
変数のデータフローを考慮した API利用コード例の検索 井上研究室 竹之内 啓太.
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
クローンセットに対する主要編集者の分析法の提案と調査
只見町 インターネット・エコミュージアムの「キーワード」検索の改善
Javaプログラムの変更を支援する 影響波及解析システム
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
利用実績に基づくソフトウェア部品検索システムSPARS-J
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
通信機構合わせた最適化をおこなう並列化ンパイラ
オープンソース開発支援のための ソースコード及びメールの履歴対応表示システム
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードクローンの動作を比較するためのコードクローン周辺コードの解析
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作
Javaソフトウェア部品検索システムSPARS-Jの実験的評価
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
パターンマイニング技術を 用いた実時間プログラムの コーディングパターン検出
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
既存ソフトウェア中の 頻出コード片を用いた コード補完手法の提案
プログラムの織り込み関係を可視化するアウトラインビューの提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
分散処理を用いたコーディングパターン検出ツールの実装
ソースコードの編集状況に応じた ソフトウェア部品の自動推薦システム
統合開発環境のための プログラミング言語拡張 フレームワーク
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
ソフトウェア理解支援を目的とした 辞書の作成法
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
コードクローン解析に基づく デザインパターン適用候補の検出手法
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
プログラム理解のための 付加注釈 DocumentTag の提案
プログラム依存グラフを用いた ソースコードのパターン違反検出法
Presentation transcript:

コーディングパターンの あいまい検索の提案と実装                    井上研究室  小笠原康貴

コーディングパターン ソースコード中に分散して出現する定型的なコード片のこと 特定の処理を実装するイディオムなどが当てはまる イディオムの抽出 左下の図は,Iteratorクラスのイディオム的実装の例です.下線部で示した単語がイディオム部分に当たるので、それらを取り出すことで右図のコーディングパターンが形成されます. java.util.Iteratorクラスによる イディオム的実装 形成されるコーディングパターン

コーディングパターンの利用 コーディングパターンを利用できるケース 処理の実装方法の理解 ソフトウェア保守 ソフトウェア固有の処理やAPIの処理など,実装例がドキュメントとして残っていない場合 ソフトウェア保守 同一の処理は同一の実装が好ましい 実装方法のルールを共有することが容易 ソースコード中のコーディングパターンの実装を確認することで,実装方法を理解できます ソフトウェア保守の観点では,同一の処理は同一の実装が好ましいので,コーディングパターンを把握することで実装方法の~

関連研究 シーケンシャルパターンマイニングを用いたコーディングパターン検出[1] API利用例検索ツール[2][3] ソースコード中のコーディングパターンを自動で一括検出できる API利用例検索ツール[2][3] APIの利用例は一種のコーディングパターン 特殊な検索クエリを用いて,ソースコードから調査対象のAPIを利用しているコード片を検出する [1]石尾 隆,伊達 浩典,三宅 達也,井上 克郎.シーケンシャルパターンマイニングを用いたコーディングパターン抽出.情報処理学会論文誌, Vol. 50, No. 2, pp. 860-871,2009. [2]竹之内 啓太,石尾 隆,井上 克郎.プログラミング言語の構造を考慮したapi利用例検索ツール.ソフトウェア工学の基礎23, pp. 23--32, 2016. [3]竹之内 啓太,石尾 隆,井上 克郎.変数のデータフローによるAPI利用コード例の検索.コンピュータソフトウェア, Vol.34, No.4, pp.68--74,2017

関連研究の問題点 シーケンシャルパターンマイニングを用いたコーディングパターン検出 API利用例検索ツール 類似するコーディングパターンの 処理が大きく,特定のコーディングパターンを調査することに向いていない API利用例検索ツール 類似する利用例がまとめて検出されるため,自分に必要な利用例を判断することが難しい 類似するコーディングパターンの 運用状況を提示する必要がある

従来の検出結果 類似する実装が混在 欲しい情報がうまく見つからない可能性 全体において有力な実装がわからない 最適な実装を判断したいが… BufferedReader(); read(); close(); readLine(); 最適な実装を判断したいが… 類似する実装が混在 欲しい情報がうまく見つからない可能性 全体において有力な実装がわからない 従来の検出法により,利用例を実装するコード片が検出できますが,左の図に示すような類似するパターンの実装が混在する可能性があります.その結果,欲しい情報を持つ実装例が検出結果に埋もれてうまく見つからなかっったり,それぞれの実装がどの程度有力であるかがわかりづらいという点がありました.

研究の方針 類似するパターンを別々に提示し,それぞれの出現頻度を把握すれば,判断が容易 BufferedReader(); read(); close(); readLine(); 10% 70% コードブロックの分別を行うキーワード検索を提案し,類似するパターンの分別を行う そこで,類似するコーディングパターンを実装するコード片を別々に提示し,その出現頻度を把握できれば,必要な利用例の判断を手助けできると考えました. 例えばこの例では,~ そのために,本研究では,コードブロックの分別を行うキーワード検索を提案し,類似するパターンの分別を行います 20%

提案手法 ソースコード中の類似するコーディングパターンの 運用状況を提示するためのソースコード検索 検索に一致する結果と一致しない結果の双方を取り出す 検索をコードブロック単位で行う 検索結果を再利用できる 従来の検索と区別するため,提案する検索をあいまい検索と呼称

手法の手順 検索クエリとして任意の文字列を与える ソースコードの構文解析によりコードブロックを抽出 コードブロックの集合に対して検索を実行 検索に一致したコードブロックと,一致しなかったコードブロックをグループ化し,双方を出力

検索対象の抽出 検索対象となるコードブロックの抽出を行う 構文解析による抽出 構文解析 コードブロックの集合 Class class1{ void method1(){ ‥‥ } void method2(){ void method3(){ 構文解析

コードブロックの分別 抽出されたコードブロックの集合に対して検索を実行 検索に一致するコードブロックと一致しないコードブロックをそれぞれグループ化 一致 検索クエリ keyword 不一致

検索結果の再利用 一致グループ 検索 keyword1 不一致グループ コードブロックの集合 別の検索の 対象に利用 一致グループ 検索 提案する検索によりコードブロックを分別することを説明しましたが,分別されたコードブロックのグループを別の検索の対象に再利用することができます.この例では,word1というキーワードによる検索の不一致グループに,word2というキーワードで検索を行っています 検索 keyword2 不一致グループ

コーディングパターンの分別方法 コーディングパターン内のキーワードが幾つかわかれば,それに類似するコーディングパターンを形成するコードブロックを分別可能 keyword1:一致 keyword2:一致 keyword3:一致 keyword1:一致 keyword2:不一致 keyword3:一致 { keyword1; keyword2; keyword3; } { keyword1; keyword3; } この検索を用いてどのように類似するコーディングパターンの分別を行うを説明します. 類似コーディングパターン

提案手法の利用例 出力 本ツール 入力 パターンA:10個 ソースコード word1 word2 word3 50個 一致 35個 不一致 パターンB:5個 word1 word2 word3 15個 一致 35個 一致 パターンを形成する語 Word3を含む? word1 word2 word3 パターンC パターンC:35個 10個 一致 5個 不一致 word1 word2 word3 パターンA パターンB

ケーススタディ 提案手法により,類似するコーディングパターンを形成するコードブロックを,分別して提示できるか確認するために行う 対象は6つのオープンソースソフトウェアのJavaソースコード 既存研究により上記のソースコード中で確認されている,java.sql.ResultSetクラスに関するコーディングパターンを調査

検索方法 検索クエリとして,コーディングパターン例中に出現するResultSetクラスに関するメソッド呼び出しを利用 executeQuery() next() getString() close()

コードブロックの分別結果 A B C D 類似するコーディングパターンを分別して提示することができた 8個 8個 2個 1個 類似するコーディングパターンを分別して提示することができた グループAの8個は全て同じソフトウェアから検出された グループCから,getStringの代わりにgetInt,getBooleanを用いる少数派の実装を発見することができた Aのパターンは,そのソフトウェアの実装のルールであると推測できます 少数派の実装は,従来だと見逃してしまう可能性がありましたが,getStringを用いないコードブロックを分別することで,発見することが容易になりました.

まとめと今後の課題 検索の不一致結果を取り出す検索により,類似するコーディングパターンの分別を行った 従来では確認が難しかった,類似コーディングパターンごとの出現回数などの情報が確認できた 検索の煩雑さの解消 コードブロックの分別行程を自動で行えるように拡張する 検索クエリの記述能力の改善 制御構造やキーワードの順番を考慮できるようにする