Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "既存ソフトウェア中の 頻出コード片を用いた コード補完手法の提案"— Presentation transcript:

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

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

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

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

5 パターン の準備 パターンの取得には既存手法[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 (2008).

6 パターンの検索 入力キーワードに関連したパターン 検索結果: 入力キーワードに最も関連している 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 Term Weighting Approaches in Automatic Text Retrieval. Technical Report. UMI Order Number: TR , Cornell University.

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

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

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

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

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

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

13 妥当性の検証結果(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 復元の例:元のソースコードとコード片を表示 既存のソースコード 生成したコード片

14 同じ型の引数を複数とるメソッド呼び出しが出現する例
妥当性の検証結果(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(); } } ... 異なるパターンの例も示す 話す必要はなし 同じ型の引数を複数とるメソッド呼び出しが出現する例

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


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

Similar presentations


Ads by Google