これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、または MAC OS オンライン エミュレーターなどの複数の無料オンライン ワークステーションの XNUMX つを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド sim_pasc です。
プログラム:
NAME
sim-C、Java、Pascal、Modula-2、Lisp、Miranda、またはテキストファイルで類似点を見つけます
SYNOPSIS
sim_c [ -[defFiMnpPRsSTv] -r N -t N -w N -o F ] ファイル ... [ [ / | ] ファイル ... ]
sim_c ...
sim_java ...
sim_pasc ...
sim_m2 ...
sim_lisp ...
シムミラ ...
シムテキスト ...
DESCRIPTION
シムc Cファイルを読み取ります file ... 類似したテキストのセグメントを探します。 XNUMX
プログラムテキストのセグメントは、レイアウト、コメント、識別子、
数字、文字列、文字の内容。 十分な長さのランがある場合
見つかった場合、それらは標準出力で報告されます。 実行中の重要なトークンの数
角かっこで囲まれています。
Sim_java Javaでも同じことをします。 sim_pasc パスカルの場合、 sim_m2 Modula-2の場合、 シムミラ for
ミランダ、そして sim_lisp Lisp用。 Sim_text 任意のテキストで動作し、時々
シェルスクリプトで役立ちます。
このプログラムは、無関係とされるコードのコピーされた部分を見つけるために使用できます
プログラム( -s or -S)、または大規模なプロジェクトで誤って重複したコードを見つけるため
(with -f or -F).
セパレーターの場合 / or | 入力ファイルのリストに存在する場合、ファイルはに分割されます
「新しい」ファイルのグループ( / or |)および「古い」ファイルのグループ。 ない場合 / or
|、すべてのファイルは「新規」です。 古いファイルが相互に比較されることはありません。 も参照してください
の説明 -s と -S 以下のオプション。
類似性テスターは類似性を特定するためにファイル名を必要とするため、読み取ることができません
標準入力から。
次のオプションがあります。
-d 出力はにあります 差分(1)-デフォルトの2列形式ではなく、同様の形式。
-e 各ファイルは、個別に各ファイルと比較されます。 これはすべての類似点を見つけるでしょう
繰り返しのテキストに関係なく、関係するすべてのテキスト間(「計算」を参照)
以下のパーセンテージ)。
-f 実行は、可能性を分離するために、バランスのとれた括弧を持つセグメントに制限されます
ルーチンボディ( シムテキスト).
-F 呼び出し内のルーチンの名前は、完全に一致する必要があります( シムテキスト).
-i 比較するファイルの名前は、以下を含む標準入力から読み取られます。
可能なセパレータ / or |; ファイル名はXNUMX行にXNUMXつである必要があります。 このオプション
非常に多くのファイル名を指定できます。 @とは異なります
一部のコンパイラによって提供される機能で、ファイル名のみを処理し、
オプション引数を認識しません。
-M メモリ使用量情報は、標準エラー出力に表示されます。
-n 見つかった類似点は、ファイル名、位置、サイズではなく、ファイル名、位置、サイズで要約されます。
完全に表示されます。
-o F 出力は、という名前のファイルに書き込まれます F.
-p 出力は類似性のパーセンテージで示されます。 以下の「パーセンテージの計算」を参照してください。
含意する -e と -s.
-P As -p ただし、主な貢献者のみが示されています。 示す -e と -s.
-r N 最小ランレングスはに設定されています N 単位; デフォルトは24トークンです。
シムテキスト、8ワードです。
-R 入力リストのディレクトリは再帰的に入力され、ディレクトリに含まれるすべてのファイル
比較に関与しています。
-s ファイルの内容はそれ自体と比較されません(「自己ではない」の場合は-s)。
-S 新しいファイルの内容は古いファイルとのみ比較されます-間ではありません
自分自身。
-t N と組み合わせて -p or -P オプション、以下のしきい値(パーセント)を設定します
どの類似点が報告されないか。 デフォルトは1です。 シムテキスト,
ここで20です。
-T より簡潔で均一な形式の出力が生成されます。これは、
後処理。
-v バージョン番号とコンパイル日を標準出力に出力してから停止します。
-w N 使用されるページ幅はに設定されます N 列; デフォルトは80です。
-- (類似性チェッカーが入力を認識したときに入力を出力する秘密のオプション、および
その後停止します。)
この -p オプションを選択すると、次の形式の行になります
FはG材料のx%で構成されます
つまり、Fのテキストのx%はGにもあります。この関係はそうではないことに注意してください。
対称; 実際、100つのファイルがからのテキストのXNUMX%で構成されている可能性は十分にあります。
別のファイル、他のファイルは最初のファイルのテキストの1%のみで構成されている場合、
それらの長さは十分に異なります。 NS -P (大文字のP)オプションは、
各ファイルのみ。 これにより、一連のファイルA [1] ... A [n]の識別が簡単になります。
これらのファイルの連結も存在します。 しきい値は、を使用して設定できます -t
オプション; 認識されたテキストの粒度は、引き続き -r
オプションまたはそのデフォルト。
この -r オプションは、実行を構成する「ユニット」の数を制御します。 そのプログラムのために
プログラミング言語コードを比較すると、単位は適切な言語の字句トークンです。
コメントと標準のプリアンブル素材(ファイルインクルードなど)は無視され、すべての文字列
同じと見なされます。 にとって シムテキスト 単位は、任意のシーケンスとして定義される「単語」です。
127つ以上の文字、数字、または177(XNUMX XNUMX進数)を超える文字(対応するため)
ä、øなどの文字)。
Sim_text スペーステキストを通常のテキストとして受け入れます。
この -s と -S オプションは、比較するファイルを制御します。 入力ファイルはXNUMXつに分けられます
グループ、新旧。 これらの制御オプションがない場合、プログラムは
したがって、ファイル(4つの新しいファイルと6つの古いファイルの場合):
新しい/古い<-最初のファイル
1 2 3 4/5 6 7 8 9 10
| ------------ / ------------
n 1 | NS /
e 2 | cc /
w 3 | ccc /
4 | cccc /
XNUMX番目 / / / / / / / / / / / / /
ファイル-> 5 | cccc /
o 6 | cccc /
l 7 | cccc /
d 8 | cccc /
9 | cccc /
10 | cccc /
ここで、csはファイル比較を表し、/は新旧の境界を表します
ファイル。
使い方 -s オプションはこれを次のように減らします:
新しい/古い<-最初のファイル
1 2 3 4/5 6 7 8 9 10
| ------------ / ------------
n1 | /
e 2 | NS /
w 3 | cc /
4 | ccc /
XNUMX番目 / / / / / / / / / / / / /
ファイル-> 5 | cccc /
o 6 | cccc /
l 7 | cccc /
d 8 | cccc /
9 | cccc /
10 | cccc /
この -S オプションはこれをさらに次のように減らします。
新しい/古い<-最初のファイル
1 2 3 4/5 6 7 8 9 10
| ------------ / ------------
n1 | /
e2 | /
w 3 | /
4 | /
XNUMX番目 / / / / / / / / / / / / /
ファイル-> 5 | cccc /
o 6 | cccc /
l 7 | cccc /
d 8 | cccc /
9 | cccc /
10 | cccc /
プログラムは、WindowsでUNICODEファイル名を処理できます。 これは、
-R コマンドラインからUNICODEファイル名を指定する方法がないため、オプション。
制限
繰り返し入力は、類似性チェックの悩みの種です。 4を含むファイルがある場合
同一のテキストのコピー、
A1 A2 A3 A4
番号が同一のコピーを区別するためだけに役立つ場合、8つのIDがあります。
A1 = A2、A1 = A3、A1 = A4、A2 = A3、A2 = A4、A3 = A4、A1A2 = A3A4、およびA1A2A3 = A2A3A4。 これらのうち、3つだけ
意味があります:A1 = A2、A2 = A3、およびA3 = A4。 そして、それぞれが同一の20行のテーブルの場合
その他、プログラムでは珍しいことではありませんが、715個のIDがあり、そのうち最大19個が
意味のある。 それらの715個すべてを報告することは明らかに受け入れられません。
これを修正するために、IDの検索は次のように実行されます。
テキスト、最大のセグメントが見つかり、テキスト内で重複しないコピーが発生します
それに続いて。 そのセグメントとそのコピーが報告され、その位置でスキャンが再開されます
セグメントの直後。 上記の例では、これによりIDがA1A2 = A3A4になります。
そしてA3 = A4、これは非常に満足のいくものであり、 N ほぼ同一のセグメント 2 ログ N
メッセージが表示されます。
これは、XNUMXつの同一のセグメントが異なるファイルにある場合にもうまく機能します。
ファイル1:A1
ファイル2:A2
ファイル3:A3
ファイル4:A4
これで、A1A2のような結合されたセグメントは発生せず、アルゴリズムは実行A1 = A2を検出します。
A2 = A3、およびA3 = A4、合計 N-1 実行、すべて有益。
計算する パーセンテージ
上記のアプローチは、ファイルのコンテンツのパーセンテージを取得するのには適していません。
別のファイルで見つけることができます。 これには、各ファイルペアを個別に比較する必要があります
上記のマトリックスではacで表されています。 これは何ですか -e オプションはありません。 下 -e
オプションFile1で認識されるセグメントFile1:A2は、File3で再び認識されます。
File4。 上記の例では、実行が生成されます
File1:A1 = File2:A2
File1:A1 = File3:A3
File1:A1 = File4:A4
File2:A2 = File3:A3
File2:A2 = File4:A4
File3:A3 = File4:A4
の合計 ½N(N-1) 走る
タイム そして SPACE 募集要項
すべての内部プロセスの時間要件を維持するように注意が払われています(ほぼ)
さまざまなテーブルを使用して、入力ファイルの長さを線形化します。 ただし、
テーブルに十分なメモリがないため、重要度の低い順に破棄されます。
アルゴリズムが二次の性質に戻る条件。
時間要件は、ファイル数のXNUMX次式です。 これは、たとえば、
64つの8000MBファイルは、8個のXNUMXkBファイルよりもはるかに高速に処理されます。
プログラムは、入力のトークンごとに6バイトのメモリを必要とします。 改行ごとに2バイト
(パーセンテージを行うときではありません); 検出された実行ごとに約76バイト。
例
呼び出し
sim_c * .c
ディレクトリ内の重複コードを強調表示します。 (生成されたファイルを削除すると便利です
最初に。)呼び出し
sim_c -f -F * .c
それらをさらに特定することができます。
呼び出し
sim_text -e -p -s new / * / old / *
new / *の各ファイルをnew / *およびold / *の各ファイルと比較し、いずれかのペアにそれ以上のファイルがある場合
共通して20%、その事実が報告されています。 通常、30%以上の類似性が重要です。
20%未満はおそらく偶然です。 そしてその間には疑わしい。
呼び出し
sim_text -e -n -s -r100 new / * "|" 年/*
同じファイルを比較し、大きな共通セグメントを報告します。 (NS | はとして使用することができます
セパレーターの代わりに / システムで / コマンドラインパラメータが
コマンドインタプリタ。)
どちらのアプローチも盗用検出に適しています。
onworks.net サービスを使用してオンラインで sim_pasc を使用する