既存ソフトウェア中の 頻出コード片を用いた コード補完手法の提案

Slides:



Advertisements
Similar presentations
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 1 ソフトウェア部品推薦のための.
Advertisements

シーケンス図の生成のための実行履歴圧縮手法
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
JavaScript プログラミング入門 2006/11/10 神津.
シーケンシャルパターンマイニングに基づくオブジェクト指向プログラムのための 欠陥検出手法
ソースコードの編集内容を用いた ソフトウェア部品の自動推薦手法
メソッド周辺の識別子と メソッド本体のAPI利用実績に基づいたAPI集合推薦手法
ソースコードの編集内容を入力とした ソフトウェア部品の自動検索
情報伝播によるオブジェクト指向プログラム理解支援の提案
Object Group ANalizer Graduate School of Information Science and Technology, Osaka University OGAN visualizes representative interactions between a pair.
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
分散処理を用いた大規模ソフトウェアに対するコーディングパターン検出ツール
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
プログラム実行履歴を用いたトランザクションファンクション抽出手法
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
類似するコーディングパターンの 利用状況調査ツールの提案
コーディングパターンと キーワードを用いて生成したコードスニペットの推薦
Javaクラスの利用関係を用いた ソフトウェア部品のカテゴリ階層構築法
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
ソードコードの編集に基づいた コードクローンの分類とその分析システム
暗黙的に型付けされる構造体の Java言語への導入
コードクローンの分類に基づいた メソッド引き上げ手順の提案とその有効性評価
ポインタ解析におけるライブラリの スタブコードへの置換の効果
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
インラインスクリプトに対するデータフロー 解析を用いた XHTML 文書の構文検証
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
雑音環境下における 非負値行列因子分解を用いた声質変換
Javaプログラムの変更を支援する 影響波及解析システム
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
オープンソース開発支援のための ソースコード及びメールの履歴対応表示システム
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
コードクローンの動作を比較するためのコードクローン周辺コードの解析
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作
Javaソフトウェア部品検索システムSPARS-Jの実験的評価
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
パターンマイニング技術を 用いた実時間プログラムの コーディングパターン検出
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
アルゴリズムとプログラミング (Algorithms and Programming)
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
オープンソースソフトウェアに対する コーディングパターン分析の適用
メソッドの同時更新履歴を用いたクラスの機能別分類法
分散処理を用いたコーディングパターン検出ツールの実装
ソースコードの編集状況に応じた ソフトウェア部品の自動推薦システム
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
ソフトウェア理解支援を目的とした 辞書の作成法
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
複雑度メトリクスを用いた JAVAプログラム品質特性の実験的評価
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
コードクローン解析に基づく デザインパターン適用候補の検出手法
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
プログラム理解のための 付加注釈 DocumentTag の提案
Presentation transcript:

既存ソフトウェア中の 頻出コード片を用いた コード補完手法の提案 井上研究室 関山 太朗 既存ソフトウェア中の頻出コード片を用いたコード補完手法の提案と題しまして,井上研究室の関山が発表させていただきます.

背景: 開発環境におけるコード補完 キーワードからコード片を生成する機能 例:Eclipseのコード補完 コード片: ソースコードの断片 利点 よく使うコード片を素早く利用できる 知らない機能を発見することがある 例:Eclipseのコード補完 “foreach” キーワードからコレクションの各要素を順に処理するコード片を生成 まず研究の背景について説明します. コード補完はキーワードからコード片を生成する機能です. コード補完を使うと,開発者はよく使うコード片を素早く利用できたり,開発者が知らないコード片を発見できるようになります. 例えば,統合開発環境Eclipseのコード補完では,foreachというキーワードからコレクションの各要素を順に処理するコード片を生成することができます.しかし,補完可能なコード片はEclipseがあらかじめ用意した範囲に限定されます. このように,コード補完ではforeachのようなどんなプログラムにも適用できるコード片を生成することができますが,ソフトウェアごとに頻出するコード片を生成することはできません. Eclipseコード補完の例 foreach for ([iterable type] [iterable element] : [iterable]) { }

パターンに基づくコード補完 パターン 既存のコード補完の問題 ソフトウェアに存在するパターンはその後も利用する 何度も書く類似したコード片 ソフトウェアごとに異なるパターンが存在 既存のコード補完の問題 生成できるコード片の範囲が限定されている ソフトウェア固有のパターンを用いたコード片の生成を行うことができない ソフトウェアに存在するパターンはその後も利用する 保守・拡張 ソフトウェアのパターンに基づくコード補完手法を提案 プログラムに頻出するコード片はパターンとよばれています.このようなコード片はモジュール化されていなかったり,モジュール化できないので,関数のように1つにまとめることができません. そのため,開発者がパターンを使うときには,パターンの雛形をコピーし,ソースコードに貼り付けますといったことを行います. パターンはforeachのようなどんなプログラムにも適用できるものだけではなく,ソフトウェア独自のパターンもあり,その中にはソースコードを記述するときに再利用できるパターンも含まれています. 私達の研究グループではこれまでにソースコード群からパターンを抽出する手法を提案してきました. 既存のコード補完機能ではソフトウェアごとに存在するパターンを使ってコード補完を行うことができません.しかし,これまでに頻繁に書かれたコードはこれからも利用すると考えられます.そこで,本研究ではコードを再利用するために,ソフトウェアのパターンに基づくコード補完手法を提案します.

提案手法: ソフトウェアのパターンに基づくコード補完手法 1.パターンの検索 2.コード片の生成 3.ソースコード へ挿入 開発者が入力 した単語(キーワード) 開発者が編集して いるソースコード キーワードに 関連したパターン パターンから 生成したコード片 パターン データベース 提案手法はこのようになります. 本手法ではコード補完時のキーワードは開発者が入力した単語となります.このキーワードを使ってパターンの検索を行い,キーワードに関連したパターンを取得します. 次に取得したパターンからコード片を生成します.このとき開発者が編集しているソースコードからコード片で参照する変数を決定します.生成したコード片は開発者が編集しているソースコードへ挿入し,開発者へ提示します. それではパターンの検索とパターンからコード片を生成する方法について詳しくみていきます.

パターン の準備 パターンの取得には既存手法[1]を使用 パターンを保存したデータベースを用意 メソッド呼び出しと制御文の開始と終了の列 パターン の準備 パターンの取得には既存手法[1]を使用 メソッド呼び出しと制御文の開始と終了の列 パターンを保存したデータベースを用意 テキストエディタjEditのパターン JEditBuffer.isEditable() IF JComponent.getToolkit() Toolkit.beep() END-IF テキストが編集できなければ 音を鳴らしてユーザーに通知 [1] Ishio, T., Date, H., Miyake, T. and Inoue, K.:Mining Coding Patterns to Detect Crosscutting Concerns in Java Programs. Inproceedings of 15th Working Conference on Reverse Engineering, pp.123-132 (2008).

パターンの検索 入力キーワードに関連したパターン 検索結果: 入力キーワードに最も関連している k 個のパターン パターンに入力キーワードと一致する単語が多く出現 一致する単語のうち,重みの大きい単語が多い 単語の重みは自然言語検索で利用されているTF-IDF[2]で決定 検索結果: 入力キーワードに最も関連している k 個のパターン 実装したツールでは k = 3 パターンの検索ではキーワードに関連したパターンを検索します.どのようなパターンがキーワードに関連しているかを決定するために,本手法では2つの方針を定めました.1つはキーワードで指定された単語に一致する単語がパターンに多く出現すること.もう1つは一致した単語の重みがより大きいことです.単語の重みはTF-IDFによって求めました. 以上の方法でキーワードに最も関連していると判断したk個のパターンから,コード片を生成します.本手法を適用するために実装したツールではkの値を3としています. [2]Term Frequency – Inverse Document Frequency, Salton G. and Buckley, C. 1987 Term Weighting Approaches in Automatic Text Retrieval. Technical Report. UMI Order Number: TR87-881., Cornell University.

コード片の生成: パターン要素の変換 パターンの各要素をプログラム文へ変換 このステップでは参照する変数は未定とする パターン プログラム文 JEditBuffer.isEditable() IF JComponent.getToolkit() Toolkit.beep() END-IF ???.isEditable(); if (???) { ???.getToolkit(); ???.beep(); } これはコード片生成の具体例です.この例では右側のパターンからIteratorクラスの変数が宣言されているソースコードが与えられたときに,左側のコード片を生成しています. パターンの最初の要素は,コード片ではiteratorオブジェクトのhasNextメソッドに対応し,2番目の要素はwhile文の開始に対応します.以降の要素についても,生成したコード片に対応していることがわかります.

コード片の生成: 参照変数の決定 直前で宣言した変数を使用 メソッド呼び出しの戻り値は新しく宣言した変数へ代入 開発者は必要に応じて生成したコード片を編集 編集中のソースコード JEditBuffer buf = ...; プログラム文 生成したコード片 ???.isEditable(); if (???) { ???.getToolkit(); ???.beep(); } boolean var0 = buf.isEditable(); if (var0) { JComponent var1; Toolkit var2 = var1.getToolkit(); var2.beep(); }

実装: Eclipseプラグイン コード片 入力キーワード パフォーマンス キーワード 10コのとき 全てが該当: 検索:1200,全体:1500 適当: 検索:600, 全体:1000 キーワード5コのとき 全てが該当: 検索:700, 全体:1000 適当: 検索:300, 全体:600

実験: 妥当性の検証 パターンの検索 コード片の生成 開発者が入力 した単語(キーワード) 開発者が編集して いるソースコード 1.パターンの検索 2.コード片の生成 3.ソースコード へ挿入 パターン データベース キーワードに 関連したパターン パターンから 生成したコード片

妥当性の検証: パターンの検索 対象 方法 結果 Pa: jEdit4.3から取得したパターン集合 Pb: Paのうち重みの大きい単語が出現するパターン集合 方法 パターン自身に出現する単語をキーワードとして検索し,順位を調査 結果 パターンが上位3位以内に含まれる確率 Pa: 0.4371 Pb: 0.9775

妥当性の検証: コード片の生成 対象 方法 jEdit4.3のパターンからランダムに選んだ11個のパターン 比較 パターンの総数: 7559 パターンが出現する既存ソースコードを1つ選び,削除 パターンと削除後のソースコードからコード片を生成 削除した部分と生成したコード片の変数の使用方法を比較 本研究では,生成したコード片が妥当であることを検証するための実験を行いました.テキストエディタjEditから11個のパターンをランダムに選択し,そのパターンから生成したコード片と,そのパターンが実際に利用されているソフトウェアのソースコードにおける変数の使用方法の違いについて調査しました. 包含関係にない11個のパターン 対象と方法が ...; if (!buffer.isEditable()) { getToolkit().beep(); } ...; 生成したコード片 コード片の生成・置換 比較

妥当性の検証結果(1/2): コード片の生成 変数の使用方法が一致するケース 7 4 変数の初期化 変数名のrename 異なるケース 7 4 変数の使用方法が一致するケース 変数の初期化 変数名のrename { StringTokenizer st = ...; while (...) { String keyCodeStr = st.nextToken(); ... ... (st.hasMoreTokens()) ... } boolean var0; while (var0) { java.lang.String var1 = st.nextToken(); boolean var2 = st.hasMoreTokens(); } 実験結果,変数の使用方法が一致するのは11件中7件のパターンで,異なるのは4件でした. この結果から,生成したコード片がそのまま適用できることも多いことが確認できました. 変数の使用方法が異なるパターンは,GUIの設定を行うもの,同じ型の引数を複数とるメソッドが登場する,組込型が出現するといった特徴が見られました. このような場合でも開発者がそのまま利用できるようなコード片を生成するために,パターンが実際に利用されているソースコード上のデータフロー情報などが利用できると考えています. 2010/02/19 復元の例:元のソースコードとコード片を表示 既存のソースコード 生成したコード片

同じ型の引数を複数とるメソッド呼び出しが出現する例 妥当性の検証結果(2/2): コード片の生成 変数の使用方法が異なるパターンの特徴 GUIの設定 同じ型の引数を複数とるメソッド呼び出しが出現 基本データ型が出現 int 型など boolean var0; if (var0) { this.extendSelection(newCaret, newCaret); } else { this.selectNone(); } int caret, newCaret; ... { if (...) this.extendSelection(caret, newCaret); else { ... this.selectNone(); } } ... 異なるパターンの例も示す 話す必要はなし 同じ型の引数を複数とるメソッド呼び出しが出現する例

まとめと今後の課題 まとめ 今後の課題 ソフトウェアのパターンに基づくコード補完手法を提案 提案手法に対する評価実験を行い,次の妥当性を検証 パターンの検索 コード片の生成 今後の課題 データフロー情報を用いたパターンの検索とコード片の生成の改善 実際のソフトウェア開発における評価 最後にまとめと今後の課題についてですが,本研究ではソフトウェアのパターンに基づくコード補完手法を提案しました.また,提案手法に対する評価実験を行い,生成したコード片の変数の使用方法が多くのケースで妥当であることを確認しました. 今後の課題としては,データフロー情報を利用したコード片生成方法の考案や,パターンの検索精度の向上,ツールの利便性の向上,実際に本手法を実装したツールを開発者に利用してもらう実験を行うことを考えています. 以上で発表を終わらせていただきます.ありがとうございました.