for v2013.08 | 最終更新日: 2013/08/22
このバージョンでは、プロジェクト間でファイル比較を行い、類似度が一定以上となるファイルの組がいくつ存在するかを計測します。 その後、その数をプロジェクト間の距離として最小全域木を構築します。派生の向きは、類似度が一定以上となるファイルの組について、ソースコードが増加する方向とします。
詳しい動作原理、ならびに実験結果については 論文[Extraction of Product Evolution Tree from Source Code of Product Variants (SPLC2013)] (to appear)を参照してください。
PRET-Extractor v2013.08b バイナリ
Java Runtime Environment 7
Graphviz
配布データに同梱されている example.bat を1箇所編集します。
-graph の後ろに、Graphvizの dot.exe のパスを記入してください。
java -jar pret.jar -m skip -type java.typec -tmp tmp -result result -diff 0
-graph "C:\Program Files (x86)\Graphviz 2.28\bin\dot.exe" -thread 2 < example_command.txt
example.batを実行してください。
結果ファイルはツールと同じディレクトリ内に生成された result ディレクトリ内にあります。
今回は類似度の閾値を0.6にして解析したので、0.6.dot と 0.6.png の2つのファイルが出力されます。
結果のグラフはこのようになります。
頂点は、プロジェクトを表しています。ディレクトリまでのパスがラベルとして付与されています。
辺は、ツールにより派生関係にあると判定したプロジェクト間を結んでいます。
辺のラベルは、プロジェクト間の距離を表しています。
矢印になっている辺は、派生関係の向きを表しています。矢印の方向にソフトウェアが進化したと判定されています。
矢印でない辺は、派生関係の向きが定まらなかったものです。
example_command.txtを編集します。
1行目、threshold 0.6を以下のように変更します。これは類似度の閾値を変更します。
threshold 0.65
4行目、read proj3 のあとに以下の行を挿入します。これは読み込むプロジェクトを追加しています。
read proj4
再びexample.batを実行すると、0.65.pngが生成されます。
Graphvizで処理する都合上、出力されるツリーの見た目はプロジェクトの入力順に依存します。
(ツリー自体はアルゴリズムにより最適なものが導かれています)。
必要に応じて、適宜.dotファイルを修正してください。
example_command.txtの書き方について説明します。
read に続いてプロジェクトが格納されているディレクトリを指定します。
1行につき1つのプロジェクトを読み込みます。
read C:\src\project1
read C:\src\project2
count コマンドで、現在指定されている類似度と読み込んだプロジェクトについてツリーを構築します。
count
類似度の閾値は、プロジェクト間でのファイル間の対応を取るために利用されます。
類似度が閾値以上のファイルの組は、プロジェクト間で「似ている」ものとして扱われます。
類似度の閾値を0.8にするには以下のようにします。
threshold 0.8
プロジェクト読み込み前、または読み込み後に記述します。
読み込み後に記述した場合、閾値が下がっていればファイル間類似度と差分の再計算を行います。
例:閾値を上げながら実験する
threshold 0.7
read proj1
read proj2
read proj3
count
threshold 0.8
count
threshold 0.9
count
exit
解析データは -tmp オプションで指定したディレクトリ内に自動で保存されます。
同じ起動時オプションで起動していれば、loadコマンドで以前の結果を読み込むことができます。
(オプションが変更されていた場合、解析結果がおかしくなると思います)
サンプルの"すこし設定をかえる"で、1回目の結果を流用したい場合は以下のようにします。
load
threshold 0.65
read proj4
count
exit
実行時のオプションで指定する設定です。
種別指定はオプション"-type"で指定する種別設定ファイルの中で行います。
-type c.typec
配布時の種別設定ファイルjava.typecは以下のようになっており、拡張子が.javaのファイルを内蔵のJava字句解析器で処理します。
java,J
1行ごとに、「拡張子,処理方法(1文字)」の形式で記述します。 処理方法は以下のようになっています
別の拡張子に対し同じアルファベットを指定した場合、同じ種類のファイルとして扱います。
以下の例では、拡張子が同じファイル同士に加え、拡張子.xのファイルと拡張子.yのファイル間でも比較が行われます。
x,A
y,A
z,B
類似度計算や差分計算に用いるスレッド数を指定できます。
-thread 8
-diff オプションの後の数字によって、使用するdiffの種類を変えることができます。
unified形式の出力がサポートされていれば、オプション指定だけですみます。
-diff 0 内蔵のLCS計測を使用します。(既定値)
-diff 1 内蔵のdiff計算を利用します。SPLC原稿の設定と同じです。
-diff 5 diff.exe 外部のdiffコマンドを利用します。パスの指定が必要です。
-diff 6 diff.exe cygwin付属のdiffコマンドを利用します。パスの指定が必要です。
ソースコードは pret_201308b_src.zipから入手してください。
外部のパーサを用いて、「1行1トークン」に直したファイルを用意します。種別設定ファイルに記述するため、拡張子を適宜つけておきます。
種別設定ファイルで、「字句解析済みファイルの拡張子,CとJ以外のアルファベット」を指定します。
C,J以外のアルファベットを指定すると、内蔵のパーサを利用せず入力されたファイルを1行1トークンとしてそのまま比較します。
Preprocessor クラスの実装をふやして、 PreprocessorFactory に追記すれば自分で書いた前処理コードを利用できます。
ソースコードから実行する場合、1行に1つのパスを記述したリストファイルを読み込ませることができます。
1つのリストファイルに掲載されているファイルをまとめて1プロジェクトとして扱います。
engine.readProjectByList(Path list);
ただし、この場合も種別設定ファイルの設定は有効です。 リストに載っていても拡張子が合わないファイルは無視されます。
距離関数の計測・方向付けはCounterクラスを継承して行います。
距離関数の計測に必要なデータの取得は、CalcDiffクラス内で行っています。ADiffクラスやAsimクラスを継承しているクラスが参考になると思います。
ファイルを比較した際のデータ(類似度や差分の行数など)はISimlarityインターフェイスを実装している各クラスに格納します。
これらのクラスを改造することで、新たな距離関数を定義できます。