チュートリアル

for v2013.08 | 最終更新日: 2013/08/22

» English page

目次

概要

このバージョンでは、プロジェクト間でファイル比較を行い、類似度が一定以上となるファイルの組がいくつ存在するかを計測します。 その後、その数をプロジェクト間の距離として最小全域木を構築します。派生の向きは、類似度が一定以上となるファイルの組について、ソースコードが増加する方向とします。

詳しい動作原理、ならびに実験結果については 論文[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 オプションの後の数字によって、使用する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 に追記すれば自分で書いた前処理コードを利用できます。

ファイルが散らばっている or 指定したファイルのみ扱いたい

ソースコードから実行する場合、1行に1つのパスを記述したリストファイルを読み込ませることができます。
1つのリストファイルに掲載されているファイルをまとめて1プロジェクトとして扱います。

engine.readProjectByList(Path list);

ただし、この場合も種別設定ファイルの設定は有効です。 リストに載っていても拡張子が合わないファイルは無視されます。

ソースコードの改造ポイント

距離関数の計測・方向付けはCounterクラスを継承して行います。

距離関数の計測に必要なデータの取得は、CalcDiffクラス内で行っています。ADiffクラスやAsimクラスを継承しているクラスが参考になると思います。
ファイルを比較した際のデータ(類似度や差分の行数など)はISimlarityインターフェイスを実装している各クラスに格納します。
これらのクラスを改造することで、新たな距離関数を定義できます。


PRET-Extractor トップ