20
A Tool to Suggest Similar Program Element Modifications 早稲田大学 情報理工学研究科 楊 玉江 国立情報学研究所 坂本 一憲 早稲田大学 情報理工学部 鷲崎 弘宜 早稲田大学 情報理工学部 深澤 良彰

SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

Embed Size (px)

DESCRIPTION

日本語バージョン Github: https://github.com/youfbi008/SimilarHighlight Visual Studio Gallery: http://goo.gl/KqtTvY

Citation preview

Page 1: SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

A Tool to Suggest Similar Program

Element Modifications

早稲田大学 情報理工学研究科 楊 玉江

国立情報学研究所 坂本 一憲

早稲田大学 情報理工学部 鷲崎 弘宜

早稲田大学 情報理工学部 深澤 良彰

Page 2: SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

研究概要と貢献内容

2

特定のタスクで最少キー入力回数が減少できると

プログラミング手間が減少

プログラミングの生産性が向上

プログラミングタスクは連続した類似作業を必要とする

連続した変更作業、変更すべき箇所を見逃すことが多い

貢献内容:連続した変更作業の支援

類似したプログラム要素検出のアプローチの提案

キーボード操作支援ツールの開発

変更可能な要素をハイライトしてプログラマーに提案

次の変更にキーボード操作の支援、キー入力回数を減少

ツールの利用による生産性向上の評価

Page 3: SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

研究概要と貢献内容

3

簡易プレビュー(動画)

Page 4: SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

研究の目的: 類似した要素のパターン

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

Page 5: SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

研究の目的: 類似した要素のパターン

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

Page 6: SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

研究の目的: 従来の操作方法

6

要素を変更する操作方法 テキストを消してから入力(BackSpaceキー)

テキストをセレクトしてから入力 (本稿対象)

要素のテキストのセレクト方法 マウス派

Double-Click

Click-and-Drag

キーボード派 [Shift]+arrow

[Ctrl]+[Shift]+[Right arrow] | [Left arrow]

Page 7: SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

問題: コーディング中のキー操作コスト

7

変更すべき要素が多かったり、ソースコードに散らばっていたりする場合

変更すべき要素を見逃

さないため、時間を要する

次々と要素を見つける

のに、時間を要する

連続したキーボード

操作が面倒

Page 8: SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

問題: コーディング中のキー操作コスト

8

キーボード派の方を対象とした実験

パターンごとに類似した要素が九つあり、各要素のテキストを書き直し

最少キー入力原則

セレクトと移動操作が全体に占める割合を求め

結果:コーディングの中、セレクトと移動操作のコストが無視できない存在

セレクトと 移動操作

その他の操作 (要素の入力)

全体の33%

Page 9: SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

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

..

..

Page 10: SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

構文木に変換、対応するノードの確定

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

構文木中の表現

ノード省略

Page 11: SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

部分木の比較

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

Page 12: SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

類似度パターン: 周囲ノード集合の比較

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)

Page 13: SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

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 ...

Page 14: SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

Visual Studioの拡張機能

14

連続してセレクトされた要素に類似した要素を全てハイライト

ショートカットキーの利用により前か次の要素がすぐ見つかり

要素のテキストがセレクトされる状態

• 右側にマーカーバーを追加、要素の相対位置を表示

• “Similar”のアウトプットウィンド

ウを追加、類似した要素の情報を提供

• 機能の有効化または無効化 敷値などの設定機能

Page 15: SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

評価1: 最少キー入力回数の減少

15

実験1:従来の方法での実験結果と比較

研究目的の実験を再実施

セレクトと移動操作における最少キー入力原則

ツールの利用すると従来方法の比較

結果:セレクトと移動操作がツールの利用によってほとんど70%減少

Page 16: SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

評価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;

…… }

変更前 変更後

修正点① 修正点② 修正点③

修正点④

Page 17: SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

評価2: 手間の減少による生産性の向上

17

実験2:一つswitchブロックにcaseブロックが10個ある

ツールの利用すると利用しない場合

時間、キー入力回数を測定

結果:全体的に時間が27%減少、キー入力回数が40%減少

時間

キー 入力回数

被験者

ツール有り ツール無し

Page 18: SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

評価3: ツールの実行効率

18

RQ2:SimilarHighlightがスムーズに動作するか?

五つソースファイルで五つパターンの実行時間を測定

棒の長さ:平均実行時間(ミリ秒) SLOC: ソースコード行数

棒の上の数値: 類似した要素の数

結果:類似した要素がハイライトされるまで1秒もかからない (ソースコード行数が5000以下の場合)

1000行以下の場合、400ms以下

1秒以下

Page 19: SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

関連研究

19

コードクローン (Code Clone) 検出のメイン技術

文字列 (string-based)

トークン (token-based)

構文木 (tree-based) 我々のアプローチ

プログラム依存グラフ (PDG-based)

Page 20: SimilarHighlight(A Tool to Suggest Similar Program Element Modifications)

まとめと今後の展望

20

類似したプログラム要素検出のアプローチの提案 SimilarHighlight:キーボード操作支援のツール

変更可能な要素をハイライトしてプログラマーに提案 次の変更にキーボード操作の支援、キー入力回数を減少

評価結果 キーボードのキー入力回数と作業時間の減少を実現、プログラミング生産性の向上に成功

今後の展望

ツールの実行効率の向上 類似した要素の検出精度向上 もっと多くのプログラミング言語の支持 もっと多くの類似した要素のパターンの抽出 類似した要素の修正内容提案の補完機能追加