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

既存ソフトウェア中の
頻出コード片を用いた
コード補完手法の提案
井上研究室
関山 太朗
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