Upload
yujiang-yang
View
51
Download
1
Embed Size (px)
DESCRIPTION
日本語バージョン Github: https://github.com/youfbi008/SimilarHighlight Visual Studio Gallery: http://goo.gl/KqtTvY
Citation preview
A Tool to Suggest Similar Program
Element Modifications
早稲田大学 情報理工学研究科 楊 玉江
国立情報学研究所 坂本 一憲
早稲田大学 情報理工学部 鷲崎 弘宜
早稲田大学 情報理工学部 深澤 良彰
研究概要と貢献内容
2
特定のタスクで最少キー入力回数が減少できると
プログラミング手間が減少
プログラミングの生産性が向上
プログラミングタスクは連続した類似作業を必要とする
連続した変更作業、変更すべき箇所を見逃すことが多い
貢献内容:連続した変更作業の支援
類似したプログラム要素検出のアプローチの提案
キーボード操作支援ツールの開発
変更可能な要素をハイライトしてプログラマーに提案
次の変更にキーボード操作の支援、キー入力回数を減少
ツールの利用による生産性向上の評価
研究概要と貢献内容
3
簡易プレビュー(動画)
研究の目的: 類似した要素のパターン
4
類似した要素:類似したソースコード断片に位置と特徴も類似しているプログラム要素
類似した要素に対する代表的なパターン
パターン 1: メソッドのパラメータ(Method parameters)
パターン 2: switchブロックのcase値(Case values)
switch (intSelector) { case 111: this.GetMultiply(local_int_1, strNum[intSelector]); Console.WriteLine("The first case."); break; case 222: this.GetMultiply(local_int_2, strNum[intSelector]); Console.WriteLine("The second case."); break; case 333: this.GetMultiply(local_int_3, strNum[intSelector]); Console.WriteLine("The third case."); break;
....... }
この例、アプローチの紹介にも使用
Method parameters
Case values
研究の目的: 類似した要素のパターン
5
類似した要素における代表的なパターン
パターン 3: 配列の要素(Array elements)
パターン 4: ローカル変数名または値(Local variables)
パターン 5: メソッド名(Method names)
void function_A (int a, int b) { string[] strNum = new string[] { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", }; } void function_B () { int local_int_C = 111; string local_String_D = "Hello world"; }
Method names
Local variables
Array elements
研究の目的: 従来の操作方法
6
要素を変更する操作方法 テキストを消してから入力(BackSpaceキー)
テキストをセレクトしてから入力 (本稿対象)
要素のテキストのセレクト方法 マウス派
Double-Click
Click-and-Drag
キーボード派 [Shift]+arrow
[Ctrl]+[Shift]+[Right arrow] | [Left arrow]
問題: コーディング中のキー操作コスト
7
変更すべき要素が多かったり、ソースコードに散らばっていたりする場合
変更すべき要素を見逃
さないため、時間を要する
次々と要素を見つける
のに、時間を要する
連続したキーボード
操作が面倒
問題: コーディング中のキー操作コスト
8
キーボード派の方を対象とした実験
パターンごとに類似した要素が九つあり、各要素のテキストを書き直し
最少キー入力原則
セレクトと移動操作が全体に占める割合を求め
結果:コーディングの中、セレクトと移動操作のコストが無視できない存在
セレクトと 移動操作
その他の操作 (要素の入力)
全体の33%
SimilarHighlightの全体像
9
Code2Xml ソースコード パーサ
要素の部分木を比較
4
7 8
20 16
候補ノード集合
Visual Studio IDE
dll
1
5
9 10
2 3
4
7 8
6
11 12
構文木
...
...
全ての候補ノードが類似度パターンと比較
要素をハイライト
構文木 に変換
候補ノード タイプ(TOP)
候補ノード網羅
類似した要素 (マッチした要素)
TOP
YYY ZZZ
類似度 パターン
32 24 11
5
9 10
TOP
YYY AAA
Target
TOP
YYY
..
..
構文木に変換、対応するノードの確定
10
ソースコードがCode2Xmlライブラリにより構文木に変更
Console.WriteLine("The first case."); のXMLテキスト(簡略)
<brackets_or_arguments id="257">
<arguments id="276">
<TOKENS id="char_literal279">
<TOKEN id="char_literal279" …>(</TOKEN>
</TOKENS>
<argument_list id="280">
<STRINGLITERAL id="set1275">
<TOKEN id="set1275" startline="86"
startpos="38" end-line="86" endpos="55">
"The first case."</TOKEN>
</STRINGLITERAL>
</argument_list>
<RPAREN id="char_literal281">
<TOKEN id="char_literal281" …>)</TOKEN>
</RPAREN>
</arguments>
</brackets_or_arguments>
位置情報
最外有効先祖(Outermost ancestor) 先祖ノードの中、ほかの直接子ノードがなく一番外側のノード 最外有効先祖のノードタイプ プログラム要素のタイプとみなす
タイプ
argument_list
STRINGLITERAL
"The first case."
TOKEN
構文木中の表現
ノード省略
部分木の比較
11
"The first case." と "The second case."の部分木の比較
構文木に要素に対応するノードの位置の確定
brackets_or_arguments
(
"The first case."
一部ノード省略
Console
.
WriteLine
argument_list )
Console.WriteLine("The second case.");
brackets_or_arguments
(
"The second case."
Console
.
WriteLine
argument_list )
Console.WriteLine("The first case.");
TOKEN TOKEN
類似度パターン: 周囲ノード集合の比較
12
要素の周囲ノード集合の比較
周囲ノード(先祖ノード、兄弟ノード、子孫ノード)の網羅
一部データ省略
ノード集合
[23]:argument_list280
[24]:argument_list>'"
The first case."' [25]:argument_list-'('
[26]:argument_list-')'
[28]:argument_list-
TOKENSchar_literal279(
[29]:argument_list-
RPARENchar_literal281)
ノード集合
[23]:argument_list280
[24]:argument_list>'"
The second case."' [25]:argument_list-'('
[26]:argument_list-')'
[28]:argument_list-
TOKENSchar_literal279(
[29]:argument_list-
RPARENchar_literal281)
"The first case."のノード集合 "The second case."のノード集合
類似度 パターン
[23]:argument_list280
[25]:argument_list-'('
[26]:argument_list-')'
[28]:argument_list-
TOKENSchar_literal279(
[29]:argument_list-
RPARENchar_literal281)
20
類似度パターンにマッチした要素の網羅
13
候補ノードタイプを利用して候補ノードを抽出
候補ノードタイプ(argument_lis)
t
20 16
候補ノード集合 32
24 11
類似度パターン
brackets_or_arguments
(
"The first case."
argument_list )
brackets_or_arguments
(
"The second case."
argument_list )
brackets_or_arguments
( argument_list )
argument_list
各自の周囲ノード集合
候補ノード 抽出
共通データ数 敷値 類似した要素
比較
>
...
11 16 ...
Visual Studioの拡張機能
14
連続してセレクトされた要素に類似した要素を全てハイライト
ショートカットキーの利用により前か次の要素がすぐ見つかり
要素のテキストがセレクトされる状態
• 右側にマーカーバーを追加、要素の相対位置を表示
• “Similar”のアウトプットウィンド
ウを追加、類似した要素の情報を提供
• 機能の有効化または無効化 敷値などの設定機能
評価1: 最少キー入力回数の減少
15
実験1:従来の方法での実験結果と比較
研究目的の実験を再実施
セレクトと移動操作における最少キー入力原則
ツールの利用すると従来方法の比較
結果:セレクトと移動操作がツールの利用によってほとんど70%減少
評価2: 手間の減少による生産性の向上
16
実験2: 10個のcaseブロック、4種類の要素の修正を要する
対象:情報系修士の学生8人
switch(intSelector) {
case 111:
this.GetMultiply(intOne, strNum[intTwo]);
Console.WriteLine("one 1");
break;
case 111:
this.GetMultiply(intOne, strNum[intTwo]);
Console.WriteLine("one 1");
break;
case 111:
this.GetMultiply(intOne, strNum[intTwo]);
Console.WriteLine("one 1");
break;
case 111:
this.GetMultiply(intOne, strNum[intTwo]);
Console.WriteLine("one 1");
break;
…… }
switch (intSelector) {
case 111:
this.GetMultiply(intOne, strNum[intTwo]);
Console.WriteLine("one 1");
break;
case 222:
this.GetMultiply(intTwo, strNum[intThree]);
Console.WriteLine("two 2");
break;
case 333:
this.GetMultiply(intThree, strNum[intFour]);
Console.WriteLine("three 3");
break;
case 444:
this.GetMultiply(intFour, strNum[intFive]);
Console.WriteLine("four 4");
break;
…… }
変更前 変更後
修正点① 修正点② 修正点③
修正点④
評価2: 手間の減少による生産性の向上
17
実験2:一つswitchブロックにcaseブロックが10個ある
ツールの利用すると利用しない場合
時間、キー入力回数を測定
結果:全体的に時間が27%減少、キー入力回数が40%減少
時間
キー 入力回数
被験者
ツール有り ツール無し
評価3: ツールの実行効率
18
RQ2:SimilarHighlightがスムーズに動作するか?
五つソースファイルで五つパターンの実行時間を測定
棒の長さ:平均実行時間(ミリ秒) SLOC: ソースコード行数
棒の上の数値: 類似した要素の数
結果:類似した要素がハイライトされるまで1秒もかからない (ソースコード行数が5000以下の場合)
1000行以下の場合、400ms以下
1秒以下
関連研究
19
コードクローン (Code Clone) 検出のメイン技術
文字列 (string-based)
トークン (token-based)
構文木 (tree-based) 我々のアプローチ
プログラム依存グラフ (PDG-based)
まとめと今後の展望
20
類似したプログラム要素検出のアプローチの提案 SimilarHighlight:キーボード操作支援のツール
変更可能な要素をハイライトしてプログラマーに提案 次の変更にキーボード操作の支援、キー入力回数を減少
評価結果 キーボードのキー入力回数と作業時間の減少を実現、プログラミング生産性の向上に成功
今後の展望
ツールの実行効率の向上 類似した要素の検出精度向上 もっと多くのプログラミング言語の支持 もっと多くの類似した要素のパターンの抽出 類似した要素の修正内容提案の補完機能追加