...

任意のプログラム言語に自動適応する重複 コード検出

by user

on
Category: Documents
8

views

Report

Comments

Transcript

任意のプログラム言語に自動適応する重複 コード検出
平成 26 年度
修士学位論文
任意のプログラム言語に自動適応する重複
コード検出ツールの開発
Development of a duplicate code detection tool that
automatically adapts to arbitrary programming
languages
1175065
今井 達朗
指導教員
高田喜朗
2015 年 2 月 27 日
高知工科大学大学院 工学研究科 基盤工学専攻
情報システム工学コース
要 旨
任意のプログラム言語に自動適応する重複コード検出ツールの
開発
今井 達朗
ソースコード中の複数箇所に存在する同一,もしくは類似したコードの一部を重複コード
と呼ぶ.もし修正が必要なコードの一部が重複コード上に見つかった場合,その重複コード
と対応するコードは同様の修正を行うべき可能性が高く,修正を検討する必要がある.
これまでに重複コードを自動的に検出するさまざまな手法が提案されている.その手法の
一つにソースコード中の字句の列に基づいて重複コードを検出する手法があり,その代表的
なツールとして CCFinderX がある.
しかし,これまでに提案されている重複コードを検出するツールは対象とする言語が決め
られており,その言語以外はツールを改造しない限り重複コードを検出できない.そこで本
研究では任意のプログラム言語に自動適応する重複コード検出手法を提案する.提案手法で
は,前処理でソースコードをトークン列にした後,出現するトークンのうち出現数の上位い
くらかを予約語,それ以外を識別子と判定する.適切な予約語数を選ぶことで,識別子は異
なるが意味的に近いコード同士を重複コードとして検出できると考えられる.CCFinderX
と提案手法の出力の比較を行い,適切な予約語数を調べた.また,CCFinderX で検出した
重複コードはほとんど提案手法でも検出できることが目視により確認できた.一方,提案手
法では検出する必要のない実用的ではない重複コードを検出することもわかった.さらに,
適切な予約語数がソースコード中のトークンの種類数と比例関係にあるのではないかという
仮説について検討した.その結果,実験対象としたオープンソースソフトウェアにおいては
比例関係は見られなかった.
–i–
キーワード
重複コード,ソフトウェア保守,CCFinderX
– ii –
Abstract
Development of a duplicate code detection tool that
automatically adapts to arbitrary programming languages
Tatsuro IMAI
We call a part of the same or similar code that exists in two or more places in the
source code the duplicate code. If some problems are found on the duplicate code, it is
likely to make the same modifications on all of the duplicate code.
Methods for automatically detecting duplicate code have been proposed so far.
As one of the methods, there is a technique to detect a duplicated code based on the
sequence of tokens in a source code. CCFinderX is the typical implementation of that
technique.
However, duplicate code detection tools proposed so far have a fixed input language
and cannot detect duplicate code of other languages unless we do not modify the tool.
Hence, in this study, we propose a duplicate code detection tool that automatically
adapts to arbitrary programming languages. This tool preprocesses the sequence of
tokens in a source code, and it considers the tokens with high frequency to be reserved
words. It is expected that we can detect semantically similar codes as a duplicate
code by choosing the appropriate number of words considered to be reserved words.
We compared the output of CCFinderX and the proposed method and examined the
appropriate number of reserved words. Moreover, we confirmed that the proposed
method can detect most of the duplicate codes that was detected by CCFinderX. On
the other hand, we found that the proposed method also detected impractical, needless
– iii –
duplicate codes. Furthermore, we examined a hypothesis that an appropriate number
of reserved words has a correlation to the number of the different tokens in a source
code, and we could not find such correlation in the open-source softwares used in an
experiment.
key words
duplicate code, software maintenance, CCFinderX
– iv –
目次
第1章
序論
1
1.1
研究目的とその背景 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.2
論文の構成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
背景知識
3
第2章
2.1
重複コードの種類
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
2.2
CCFinderX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
第3章
提案手法
7
第4章
測定実験
9
4.1
実験手順 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
4.2
実験対象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
4.3
実験結果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
考察
15
5.1
実用的ではない重複コード . . . . . . . . . . . . . . . . . . . . . . . . . .
15
5.2
CCFinderX と提案手法で検出した重複コードの比較 . . . . . . . . . . . .
16
5.3
予約語数とトークンの種類数
17
第5章
第6章
. . . . . . . . . . . . . . . . . . . . . . . .
おわりに
22
6.1
まとめ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
6.2
今後の課題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
謝辞
24
参考文献
25
–v–
図目次
2.1
7zip のクローン散布図
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
4.1
測定実験の流れ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
4.2
NBR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
4.3
RSA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
4.4
RSI
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
4.5
CVR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
4.6
RNR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
4.7
7zip を対象とした CCFinderX と提案手法の比較 . . . . . . . . . . . . . .
12
4.8
H2 Database Engine を対象とした CCFinderX と提案手法の比較 . . . . .
13
4.9
JavaAPI を対象とした CCFinderX と提案手法の比較 . . . . . . . . . . . .
13
4.10 Jetty を対象とした CCFinderX と提案手法の比較 . . . . . . . . . . . . . .
14
5.1
意味を持たない重複コードの例 . . . . . . . . . . . . . . . . . . . . . . . .
16
5.2
同様の構造が原因の重複コード [7] . . . . . . . . . . . . . . . . . . . . . .
17
5.3
意図的に複製された重複コード [7] . . . . . . . . . . . . . . . . . . . . . .
17
5.4
CCFinderX で検出したときのクローン散布図 . . . . . . . . . . . . . . . .
18
5.5
提案手法で検出したときのクローン散布図 . . . . . . . . . . . . . . . . . .
19
5.6
トークンの種類数と最適な予約語数の比例図 . . . . . . . . . . . . . . . . .
20
5.7
総バイト数と最適な予約語数の比例図
. . . . . . . . . . . . . . . . . . . .
20
5.8
ソースファイル数と最適な予約語数の比例図 . . . . . . . . . . . . . . . . .
21
5.9
ステップ数と最適な予約語数の比例図
21
– vi –
. . . . . . . . . . . . . . . . . . . .
表目次
2.1
重複コードの種類 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
2.2
ファイルメトリクス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
4.1
実験対象としたオープンソースソフトウェア . . . . . . . . . . . . . . . . .
10
5.1
2 回以上出現するトークンの種類数 . . . . . . . . . . . . . . . . . . . . . .
19
– vii –
第1章
序論
1.1
研究目的とその背景
ソフトウェアの保守を困難とする要因の一つとして重複コードが挙げられる.重複コード
はコードクローンとも呼ばれ,ソースコード中の複数箇所に存在する同一,もしくは類似し
たコードの一部を指す.重複コードはコピー&ペーストによって生成されたり,定型的な処
理が複数箇所に現れたりすることなどによって発生する.もし修正が必要なコードの一部が
重複コード上に見つかった場合,その重複コードと対応するコードは同様の修正を行うべ
き可能性が高く,修正を検討する必要がある.また,ソフトウェアの機能拡張を行うアップ
デートの際も同様に修正を検討する必要がある.さらに,重複コードが多いと相対的にソー
スコードの総量も増加するため,理解しづらいソースコードとなる.そのため,重複コード
の変更箇所が複数にわたると,修正や拡張を行うことが困難となり,結果ソフトウェア保守
が困難になる.
これまでに重複コードを自動的に検出するさまざまな手法が提案されている.その手法の
一つにソースコード中の字句の列に基づいて重複コードを検出する手法があり,その代表的
なツールとして CCFinderX[1] がある.CCFinderX はソースコード中にある同一, もしく
は類似の字句の列を検索することで高速に重複コードを検出できる.
しかし,これまでに提案されている重複コードを検出するツールは対象とする言語が決め
られており,その言語以外はツールを改造しない限り重複コードを検出することができな
い.そのため,例えば新しい言語が登場した際や利用者の少ない言語を使用している場合,
すぐに適用することができない.そこで本研究では任意のプログラム言語に自動適応する重
–1–
1.2 論文の構成
複コード検出手法を提案する.
1.2
論文の構成
本論文は,本章を含め 6 章で構成される.第 2 章では,背景技術について述べる.第 3 章
では,提案手法について述べる.第 4 章では,測定実験について述べる.第 5 章では,考察
について述べる.第 6 章では,まとめと今後の課題について述べる.
–2–
第2章
背景知識
2.1
重複コードの種類
重複コードのはっきりとした定義はされていないが,いくつかの種類に分類できる.Roy
らは重複コードを表 2.1 の4種類に分類している [2]. CCFinderX ではタイプ 3 までの重複
コードを検出することができる.
表 2.1
種類
重複コードの種類
説明
タイプ 1
空白,レイアウト,コメントの差を除いて同一の重複コード
タイプ 2
タイプ 1 に加え,識別子,リテラル,型名の差を除いて
構文的に同一の重複コード
2.2
タイプ 3
タイプ 2 に加え,文の変更,追加,削除が行われた重複コード
タイプ 4
同一の処理を実行するが,構文の実装が異なる重複コード
CCFinderX
CCFinderX は入力されたソースコードを字句の列に変換し重複コードの検出を行う.こ
れまでに提案されている重複コードを検出する手法の中でも CCFinderX は高速に重複コー
ドを検出することが可能である.
CCFinderX は以下の手順で重複コード検出を行う.
–3–
2.2 CCFinderX
1. ソースコードを読み込み,トークン列にする.
2. 実用的ではない重複コードを取り除き,またリテラルや変数名を同一のトークンに置き
換える.
3. マッチングアルゴリズムにより重複コードを検出する.
4. 重複コードの位置を出力する.
CCFinderX はリテラルや変数名を同一トークンに置き換えることによって,それらのみ
が異なるコードの一部を重複コードとして検出できる. どの字句がリテラルや変数名である
かを判別するため,CCFinderX は各対象言語の字句解析部を備えており,新しい言語に適
用するためにはその言語用の字句解析部を作成しなければならない.
CCFinderX はソースコード上に存在する重複コードの位置を示すクローン散布図を表示
する機能を備えている.CCFinderX による解析結果は通常図 2.1 のようなクローン散布図
で表される.図 2.1 はオープンソースソフトウェアである 7zip[3] の重複コードを検出した
際のクローン散布図である.縦軸・横軸はともにソースコード中の位置を表す.黒色の点が
重複コードを示しており,対応する水平・垂直の位置のコードが類似していることを意味
する.
また,CCFinderX は重複コードのメトリクスの表示,およびメトリクスによる重複コー
ドやソースファイルの絞り込み機能を備えている.表 2.1 はソースファイルに関するメトリ
クスの種類である.
–4–
2.2 CCFinderX
図 2.1 7zip のクローン散布図
–5–
2.2 CCFinderX
表 2.2
ファイルメトリクス
種類
説明
NBR
当該ファイルとの間に重複コードを持って
いるファイルの数
RSA
当該ファイルのテキストが,そのファイル
以外との間の重複コードによって占められて
いる割合
RSI
当該ファイルのテキストが,そのファイル内
の重複コードによって占められている割合
CVR
当該ファイルのテキストが,何らかの
重複コードによって占められている割合
RNR
非繰り返し率.1 − (当該ファイルの
テキストに含まれる繰り返し部分の割合)
–6–
第3章
提案手法
CCFinderX の字句解析部では,対象言語の構文仕様に基づいて,リテラルや変数名を
識別子,それ以外を予約語に字句の列を分類する.一方,提案手法では,前処理でソース
コードをトークン列にした後,出現するトークンのうち出現数の上位いくらかを予約語,
それ以外を識別子と判定する.予約語数を numOfReserved としたとき,numOfReserved
を大きくした場合は,ソースコード上の字句が完全に一致する場合のみ重複コードとし
て検出される.一方,numOfReserved を小さくした場合は字句そのものはほとんど一致
しなくても,それらの違いが無視され,重複コードとして検出される.従って,ちょうど
よい numOfReserved の値を選ぶことで,識別子は異なるが意味的に近いコード同士を重
複コードとして検出できると考えられる.適切な予約語数 numOfReserved の求め方が課
題となるが,本研究では次のような方法で,いくつかのソースコード群に対する適切な
numOfReserved の値を調べる.
CCFinderX の対象言語で記述されたソースコード群を入力として選び,CCFinderX の
出力と近い結果が得られる numOfReserved の値を適切な値と考える.CCFinderX の出力
との近さは,出力における表 2.2 のファイルメトリクスの値の近さと定義する.
kindOfMetrix ∈ {NBR, RSA, RSI , CVR, RNR} をメトリクスの種類,inputFile をク
ローン検出に使うファイルの集合とする.
ファイル inputFile に対して CCFinderX が出力したメトリクス kindOfMetrix の値を
getMetrixCCFX (kindOfMetrix , inputFile) とする.
提案手法で予約語数を numOfReserved としたときのファイル inputFile のメトリクス
kindOfMetrix の値を getMetrixnumOfReserved (kindOfMetrix , inputFile) とする.
–7–
メトリクス kindOfMetrix に関する,提案手法で予約語数を numOfReserved としたもの
と CCFinderX との誤差を
error (kindOfMetrix , numOfReserved ) =
∑
2
inputFile∈InputFile {difference(numOfReserved , kindOfMetrix , inputFile)}
|InputFile|
と定義する.ただし,
difference(numOfReserved , kindOfMetrix , inputFile) =
getMetrixCCFX (kindOfMetrix , inputFile)−getMetrixnumOfReserved (kindOfMetrix , inputFile)
とする.
関数 function の定義域 [begin, end ] の範囲で正規化された関数を normalize(function, begin, end )
として
normalize(function, begin, end )(x ) =
function(x ) − m
(M ≠ m)
M −m
と定義する.ただし,
M =
max
begin≤x ≤end
function(x ),
m=
min
begin≤x ≤end
function(x )
とする.
メトリクスの種類ごとの,提案手法で予約語数を numOfReserved としたときの CCFind-
erX のメトリクスとの結果の誤差を正規化した平均を overallError (numOfReserved ) とし,
numOfReserved の下限を begin ,上限を end として,
overallError (numOfReserved ) =
∑
kindOfMetrix ∈KindOfMetrix
normalize(fkindOfMetrix , begin, end )
|KindOfMetrix |
と定義する.ただし,
fkindOfMetrix (numOfReserved ) = error (kindOfMetrix , numOfReserved )
と定義する.
overallError (numOfReserved ) を最小にする numOfReserved を最適な予約語数とする.
–8–
第4章
測定実験
4.1
実験手順
測定実験の流れを図 4.1 に示す.まず対象のソースコードに対して字句解析・変形処理を
行う.CCFinderX の前処理部では,対象言語の構文仕様に基づいて,リテラルや変数名を
識別子,それ以外を予約語とし,字句の列を分類する.一方,提案手法では 100 から 10000
まで 100 刻みで予約語数を指定し,字句の列を分類する.そして,提案手法も CCFinderX
の検出部で重複コードの検出を行い,メトリクスを算出して,CCFinderX と提案手法の重
複コードの差を求める.実験対象のソフトウェアに対して予約語数を 100 から 10000 まで
100 刻みで指定し,適切な numOfReserved の測定を行う.
図 4.1 測定実験の流れ
–9–
4.2 実験対象
4.2
実験対象
実験対象としたソフトウェアを表 4.1 に示す.ファイルアーカイバである 7zip,DBMS
である H2 Database Engine, 汎用ライブラリである JavaAPI,Web サーバである Jetty と
いったいろいろな種別のソフトウェアを実験対象とした.これら 4 つのソフトウェアのソー
スコードを対象として,提案手法で実験を行う.
表 4.1
ソフトウェア名
7zip
H2 Database Engine[4]
JavaAPI[5]
Jetty[6]
実験対象としたオープンソースソフトウェア
入手先
http://sevenzip.sourceforge.jp.
http://www.h2database.com/html/main.html.
http://www.oracle.com/technetwork/java/index.html
http://eclipse.org/jetty/
– 10 –
4.3 実験結果
4.3
実験結果
7zip の各ファイルメトリクスの値を図 4.2 から図 4.6 に示す.
図 4.2
NBR
図 4.3
図 4.4 RSI
RSA
図 4.5 CVR
図 4.6 RNR
図 4.7 は ,7zip に 関 す る 図 4.2 か ら 図 4.6 の 結 果 を 統 合 し た も の で あ る .横 軸 は
numOfReserved とし,縦軸は overallError (numOfReserved ) である.図 4.7 より,7zip
– 11 –
4.3 実験結果
では予約語数を 2300 とした時,最適 (overallError が最小) となる.
図 4.7 7zip を対象とした CCFinderX と提案手法の比較
図 4.8 は H2 Database Engine に関する結果である.図 4.8 より,H2 Database Engine
では予約語数を 1600 とした時,最適となる.同様に図 4.9 と図 4.10 は JavaAPI と Jetty
に関する結果である.予約語数を JavaAPI は 8400,Jetty は 5900 とした時,最適となる.
– 12 –
4.3 実験結果
図 4.8
H2 Database Engine を対象とした CCFinderX と提案手法の比較
図 4.9 JavaAPI を対象とした CCFinderX と提案手法の比較
– 13 –
4.3 実験結果
図 4.10
Jetty を対象とした CCFinderX と提案手法の比較
– 14 –
第5章
考察
5.1
実用的ではない重複コード
CCFinderX と提案手法の重複コード検出の差として次のようなことが挙げられる.
CCFinderX では getter/setter メソッドは検出対象のコードから取り除いている.同様に
Java における import 文や switch 文等,どのようなプログラムでも類似の構造になってし
まう,検出しても実用的ではない重複コードを取り除いている.しかし,提案手法では,そ
れらを取り除いていない.
図 5.1 は,提案手法で検出した,言語仕様上適切にプログラムしていても発生する重複
コードである.
図 5.2, 5.3 は,文献 [7] にて挙げられている実用的ではない重複コードの例である. 図 5.2
は,変数宣言と関数宣言における同様の構造が主な原因の重複コードである.図 5.3 は,意
図的に開発者によって複製された重複コードである.
提案手法においてこのような重複コードの検出を抑えるためには,字句解析部において
import 文等や getter/setter コードを無視するようにすればよいと考えられる.任意の言語
に対してこのようなコードを無視するようにするためには,次のような方法により,様々な
言語における無視すべきコードのパターンを獲得する方法が考えられる.まず,様々なプ
ログラム言語で記述されたソースコード例を収集する.include 文や import 文等は,字下
げをしない,行頭のキーワードの後にファイル名が続くことが多いなどの性質があるので,
ソースコード例の中から,字下げがなく,行頭のキーワードの後にファイル名文字列が続く
行を抽出して,学習用データとする.この学習データ集合を表すような正規表現を構築し,
– 15 –
5.2 CCFinderX と提案手法で検出した重複コードの比較
図 5.1 意味を持たない重複コードの例
字句解析部に組み込んで,その正規表現に適合する行を無視するようにする.getter/setter
については,名前に get または set を含む,定義が短い,連続して記述されることが多いな
どの性質があるので,ソースコード例の中から,短い間隔で get または set を含む行が並ん
でいる箇所を抽出して,学習用データとする.import 文と同様に,この学習データ集合を
表すような正規表現に適合する行を無視するようにする.
5.2
CCFinderX と提案手法で検出した重複コードの比較
7zip のソースファイル群中の 1 ディレクトリ (7zip/CPP/Compress) に対して,CCFinderX と提案手法で予約語数を 2300 に設定したときの重複コードの検出を比較した.5.1 節
で述べた様に提案手法では実用的ではない重複コードが多数見つかった.一方,提案手法で
検出した重複コードは CCFinderX で検出した重複コードをほぼ全て含んでいた.
CCFinderX によるクローン散布図を図 5.4 に,提案手法で予約語数を 2300 としたとき
のクローン散布図を図 5.5 に示す.図 5.4 と図 5.5 より,CCFinderX で検出した重複コー
ドはほぼ全て提案手法で検出した重複コードに含まれていることが確認できる.
– 16 –
5.3 予約語数とトークンの種類数
linux-2.6.16.13/drivers/scsi/aha152x.c:
linux-2.6.16.13/drivers/scsi/esp.c:
static void datai init(struct Scsi Host *shpnt);
static int esp do phase determine(struct esp *esp);
static void datai run(struct Scsi Host *shpnt);
static int esp do data finale(struct esp *esp);
static void datai end(struct Scsi Host *shpnt);
static int esp select complete(struct esp *esp);
static void datai init(struct Scsi Host *shpnt);
static int esp do status(struct esp *esp);
static void datai run(struct Scsi Host *shpnt);
static int esp do msgin(struct esp *esp);
図 5.2
同様の構造が原因の重複コード [7]
linux-2.6.16.13/drivers/scsi/ips.c: 2383-2398
linux-2.6.16.13/drivers/scsi/iscsi tcp.c: 3466-3477
case IPS SUBDEVICEID 4M:
case ISCSI PARAM IMM DATA EN;
ha->ad type = IPS ADTYPE SERVERAID4M;
break;
session->imm data en = value;
break;
case ISCSI PARAM FIRST BURST;
case IPS SUBDEVICEID 4MX;
session->first burst = value;
ha->ad type = IPS ADTYPE SERVERAID4MX;
break;
break;
case ISCSI PARAM MAX BURST;
session->max burst = value;
case IPS SUBDEVICEID 4LX;
break;
ha->ad type = IPS ADTYPE SERVERAID4LX;
break;
case ISCSI PARAM PDU INORDER EN;
session->pdu inorder en = value;
break;
case IPS SUBDEVICEID 5I2;
ha->ad type = IPS ADTYPE SERVERAID5I2;
break;
図 5.3
5.3
意図的に複製された重複コード [7]
予約語数とトークンの種類数
提案手法を実用的なものにするためには,適切な予約語数を決めるモデル式の構築が重要
である.そのための準備として,ここでは適用対象ソフトウェア中のトークンの種類数が適
切な予約語数に関係しているという仮説について検討を行う.4 章で用いた各ソフトウェア
について,2 回以上出現するトークンの種類数を調べた.表 5.1 は各ソフトウェアに 2 回以
上出現するトークンの種類数である.
これらの種類数と最適な予約語数の関係を図 5.6 に示す.図 5.6 からわかるように,トー
クンの種類数が多いほど最適な予約語数も大きい傾向があったが,モデル式の構築につなが
るような関係は見いだせなかった.
他にも総バイト数やソースファイル数,コメント行と空白行を除いたステップ数を調べた
が,いずれもモデル式の構築につながるような関係は見いだせなかった.図 5.7 から図 5.9
– 17 –
5.3 予約語数とトークンの種類数
図 5.4 CCFinderX で検出したときのクローン散布図
はこれらの各量と最適な予約語数との関係を表す.
– 18 –
5.3 予約語数とトークンの種類数
図 5.5
提案手法で検出したときのクローン散布図
表 5.1 2 回以上出現するトークンの種類数
ソフトウェア名
トークンの種類数
7zip
16,043 個
H2 Database Engine
13,304 個
JavaAPI
68,294 個
Jetty
18,977 個
– 19 –
5.3 予約語数とトークンの種類数
図 5.6
トークンの種類数と最適な予約語数の相関図
図 5.7
総バイト数と最適な予約語数の相関図
– 20 –
5.3 予約語数とトークンの種類数
図 5.8
ソースファイル数と最適な予約語数の相関図
図 5.9
ステップ数と最適な予約語数の相関図
– 21 –
第6章
おわりに
6.1
まとめ
本研究では,任意のプログラム言語に自動適応する重複コード検出手法を提案した.提案
手法では,ソースコード中の各トークンの出現数に基づいて予約語と識別子を判別し,そ
れに基づいて重複コードを検出する.その適切な閾値を調べるために行った測定実験では,
いくつかのオープンソースソフトウェアに対し CCFinderX が算出するファイルメトリクス
を用いて,CCFinderX と提案手法の出力の比較を行い,適切な予約語数を調べた.また,
CCFinderX で検出した重複コードと提案手法で検出した重複コードを比較し,CCFinderX
で検出した重複コードはほぼ全て提案手法でも検出できることを目視により確認した.しか
し,提案手法では検出する必要のない実用的ではない重複コードを検出することも確認し
た.適切な予約語数がソースコード中のトークンの種類数と比例関係にあるのではないかと
いう仮説について検討したが,実験対象としたオープンソースソフトウェアでは比例関係は
見られなかった.
6.2
今後の課題
本研究では,CCFinderX が対応している言語のソフトウェアを対象として,CCFinderX
の出力と提案手法の出力を比較した.今後の課題として,次の 3 つが挙げられる.
• CCFinderX が対応していない言語に対し,提案手法を用いて重複コードが検出できる
かどうか分析する.
– 22 –
6.2 今後の課題
• 提案手法では検出する必要のない実用的ではない重複コードも検出してしまうため,そ
れを自動的に取り除く手法を実装する.
• 提案手法ではソースコードの最適値を求めるために,100 通りほどの予約語数について
それぞれ重複コード検出を行い,適切な予約語数を調べているが,それでは時間がかか
るため,適切な予約語数を決めるモデル式を構築する.
– 23 –
謝辞
本研究を進めるにあたり,御指導,御鞭撻を賜りました主指導教員である本学情報学群高
田喜朗准教授に心より深く感謝致します.また,副査として貴重な御助言を頂きました横山
和俊教授ならびに松崎公紀准教授に心より感謝致します.
提案システムのアイデア,実装にご協力いただきました高田研究室,米田裕司氏に心より
感謝致します.また,有益な議論を交わしていただいた高知工科大学高田研究室の関係者各
位に深く感謝致します.
– 24 –
参考文献
[1] Roy, C. K., Cordy, J. R. and Koschke, R.: Comparison and Evaluation of Code
Clone Detection Techniques and Tools: A Qualitative Approach, Science of Computer Programming, Vol. 74, No.7, pp. 470–495 (2009).
[2] CCFinderX. http://www.ccfinder.net/ccfinderx-j.html.
[3] 7zip. http://sevenzip.sourceforge.jp.
[4] H2 Database Engine. http://www.h2database.com/html/main.html.
[5] JavaAPI. http://www.oracle.com/technetwork/java/index.html.
[6] Jetty. http://eclipse.org/jetty/.
[7] Jiang, Z. and Hassan, A.: A framework for studying clones in large software systems, Proc. of the 7th International Working Conference on Source Code Analysis
and Manipulation, pp. 203–212 (2007).
– 25 –
Fly UP