既存ソフトウェア中の 頻出コード片を用いた コード補完手法の提案 井上研究室 関山 太朗 1 背景: 開発環境におけるコード補完 キーワードからコード片を生成する機能 コード片: ソースコードの断片 利点 よく使うコード片を素早く利用できる 知らない機能を発見することがある 例:Eclipseのコード補完 “foreach” キーワードからコレクションの各要素を順に処理 するコード片を生成 foreach for ([iterable type] [iterable element] : [iterable]) { } Eclipseコード補完の例 2 パターンに基づくコード補完 パターン 何度も書く類似したコード片 ソフトウェアごとに異なるパターンが存在 既存のコード補完の問題 生成できるコード片の範囲が限定されている ソフトウェア固有のパターンを用いたコード片の生成を行うこ とができない ソフトウェアに存在するパターンはその後も利用する 保守・拡張 ソフトウェアのパターンに基づくコード補完手法を提案 3 提案手法: ソフトウェアのパターンに基づくコード補完手法 開発者が入力 した単語(キーワード) 1.パターンの検索 パターン データベース 開発者が編集して いるソースコード 2.コード片の生成 キーワードに 関連したパターン 3.ソースコード へ挿入 パターンから 生成したコード片 4 パターンの準備 パターンの取得には既存手法[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). 5 パターンの検索 入力キーワードに関連したパターン パターンに入力キーワードと一致する単語が多く出現 一致する単語のうち,重みの大きい単語が多い 単語の重みは自然言語検索で利用されているTF-IDF[2]で決定 検索結果: 入力キーワードに最も関連している 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. 6 コード片の生成: パターン要素の変換 パターンの各要素をプログラム文へ変換 このステップでは参照する変数は未定とする プログラム文 パターン JEditBuffer.isEditable() ???.isEditable(); IF if (???) { JComponent.getToolkit() ???.getToolkit(); Toolkit.beep() ???.beep(); END-IF } 7 コード片の生成: 参照変数の決定 直前で宣言した変数を使用 メソッド呼び出しの戻り値は新しく宣言した変数へ代入 編集中のソースコード JEditBuffer buf = ...; プログラム文 生成したコード片 ???.isEditable(); boolean var0 = buf.isEditable(); if (???) { if (var0) { ???.getToolkit(); JComponent var1; ???.beep(); Toolkit var2 = var1.getToolkit(); var2.beep(); } } 開発者は必要に応じて生成したコード片を編集 8 実装: Eclipseプラグイン コード片 入力キーワード 9 実験: 妥当性の検証 パターンの検索 2. コード片の生成 1. 開発者が入力 した単語(キーワード) 1.パターンの検索 パターン データベース 開発者が編集して いるソースコード 2.コード片の生成 キーワードに 関連したパターン 3.ソースコード へ挿入 パターンから 生成したコード片 10 妥当性の検証: パターンの検索 対象 Pa: jEdit4.3から取得したパターン集合 Pb: Paのうち重みの大きい単語が出現するパターン集合 方法 パターン自身に出現する単語をキーワードとして検索し,順 位を調査 結果 パターンが上位3位以内に含まれる確率 Pa: 0.4371 Pb: 0.9775 11 妥当性の検証: コード片の生成 対象 jEdit4.3のパターンからランダムに選んだ11個のパターン パターンの総数: 7559 方法 1. 2. 3. パターンが出現する既存ソースコードを1つ選び,削除 パターンと削除後のソースコードからコード片を生成 削除した部分と生成したコード片の変数の使用方法を比較 ...; if (!buffer.isEditable()) { getToolkit().beep(); } ...; ...; コード片の生成・置換 生成したコード片 比較 ...; 12 妥当性の検証結果(1/2): コード片の生成 変数の使用方法が 一致するケース 変数の使用方法が 異なるケース 7 4 変数名のrename 変数の初期化 変数の使用方法が一致するケース boolean var0; { StringTokenizer st = ...; while (...) { String keyCodeStr = st.nextToken(); ... ... (st.hasMoreTokens()) ... } while (var0) { java.lang.String var1 = st.nextToken(); boolean var2 = st.hasMoreTokens(); } 既存のソースコード } 生成したコード片 13 妥当性の検証結果(2/2): コード片の生成 変数の使用方法が異なるパターンの特徴 GUIの設定 同じ型の引数を複数とるメソッド呼び出しが出現 基本データ型が出現 int 型など int caret, newCaret; ... { if (...) this.extendSelection(caret, newCaret); else { ... this.selectNone(); } } ... boolean var0; if (var0) { this.extendSelection(newCaret, newCaret); } else { this.selectNone(); } 同じ型の引数を複数とるメソッド呼び出しが出現する例 14 まとめと今後の課題 まとめ ソフトウェアのパターンに基づくコード補完手法を提案 提案手法に対する評価実験を行い,次の妥当性を検証 パターンの検索 コード片の生成 今後の課題 データフロー情報を用いたパターンの検索とコード片の生成 の改善 実際のソフトウェア開発における評価 15
© Copyright 2025 ExpyDoc