这是 sim_lisp 命令,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
sim - 在 C、Java、Pascal、Modula-2、Lisp、Miranda 或文本文件中查找相似之处
概要
模拟卡 [ -[defFiMnpPRsSTv] -r N -t N -w N -o F ] 文件 ... [ [ / | ] 文件 ... ]
模拟卡 ...
模拟java ...
sim_pasc ...
模拟_m2 ...
sim_lisp ...
模拟米拉 ...
模拟文本 ...
商品描述
sim_c 读取 C 文件 文件 ... 并寻找相似的文本片段; 二
如果程序文本的片段仅在布局、注释、标识符、
以及数字、字符串和字符的内容。 如果任何足够长度的运行是
发现,它们被报告在标准输出上; 运行中重要令牌的数量
在方括号之间给出。
sim_java 对 Java 也一样, sim_pasc 对于帕斯卡, 模拟_m2 对于 Modula-2, 模拟米拉
米兰达和 sim_lisp 对于 Lisp。 模拟文本 适用于任意文本,偶尔
对 shell 脚本很有用。
该程序可用于查找据称不相关的复制代码片段
程序(与 -s or -S),或用于在较大的项目中查找意外重复的代码
(与 -f or -F).
如果分隔符 / or | 存在于输入文件列表中,文件被分为
一组“新”文件(在 / or |) 和一组“旧”文件; 如果没有 / or
|,所有文件都是“新的”。 旧文件永远不会相互比较。 另见
的描述 -s 和 -S 下面的选项。
由于相似性测试器需要文件名来确定相似性,因此它无法读取
从标准输入。
有以下选项:
-d 输出在一个 差异(1)-like 格式而不是默认的 2 列格式。
-e 每个文件单独与每个文件进行比较; 这将找到所有相似之处
在所有涉及的文本之间,无论是重复的文本(参见“计算
下面的百分比)。
-f 运行仅限于带有平衡括号的段,以隔离潜在的
常规机构(不在 模拟文本).
-F 调用中的例程名称必须完全匹配(而不是在 模拟文本).
-i 要比较的文件名是从标准输入中读取的,包括一个
可能的分隔符 / or |; 文件名必须是一行。 这个选项
允许指定大量文件名; 它不同于@
一些编译器提供的工具,因为它只处理文件名,并且不会
不识别选项参数。
-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 由 x % 的 G 材料组成
这意味着 F 文本的 x % 也可以在 G 中找到。请注意,这种关系不是
对称; 事实上,一个文件很可能包含 100% 的文本
另一个文件,而另一个文件只包含第一个文件文本的 1%,如果
它们的长度相差很大。 这 -P (大写 P)选项显示主要贡献者
仅每个文件。 这简化了一组文件 A[1] ... A[n] 的识别,其中
这些文件的串联也存在。 可以使用阈值设置 -t
选项; 请注意,识别文本的粒度仍受 -r
选项或其默认值。
这款 -r 选项控制构成运行的“单位”的数量。 对于那些
比较编程语言代码,一个单元是相关语言中的词法标记;
注释和标准序言材料(文件包含等)被忽略,所有字符串
被认为是相同的。 为了 模拟文本 一个单位是一个“词”,它被定义为任何序列
一个或多个字母、数字或超过 127(177 个八进制)的字符,(以容纳
ä、ø 等字母)。
模拟文本 接受空格文本作为普通文本。
这款 -s 和 -S 选项控制要比较的文件。 输入文件分为两个
团体,新的和旧的。 在没有这些控制选项的情况下,程序比较
因此文件(4 个新文件和 6 个旧文件):
新/旧 <- 第一个文件
1 2 3 4 / 5 6 7 8 9 10
|------------/------------
1 | C /
2 | 毫升 /
3 | 抄送 /
4 | 抄送 /
第二 / / / / / / / / / / / / /
文件 -> 5 | 抄送 /
Ø 6 | 抄送 /
7 | 抄送 /
d 8 | 抄送 /
9 | 抄送 /
10 | 抄送 /
其中 cs 代表文件比较,/ 代表新旧之间的分界
文件。
使用 -s 选项将其简化为:
新/旧 <- 第一个文件
1 2 3 4 / 5 6 7 8 9 10
|------------/------------
1 | /
2 | C /
3 | 毫升 /
4 | 抄送 /
第二 / / / / / / / / / / / / /
文件 -> 5 | 抄送 /
Ø 6 | 抄送 /
7 | 抄送 /
d 8 | 抄送 /
9 | 抄送 /
10 | 抄送 /
这款 -S 选项将其进一步简化为:
新/旧 <- 第一个文件
1 2 3 4 / 5 6 7 8 9 10
|------------/------------
1 | /
2 | /
3 | /
4 | /
第二 / / / / / / / / / / / / /
文件 -> 5 | 抄送 /
Ø 6 | 抄送 /
7 | 抄送 /
d 8 | 抄送 /
9 | 抄送 /
10 | 抄送 /
这些程序可以在 Windows 下处理 UNICODE 文件名。 这仅在
-R 选项,因为无法从命令行提供 UNICODE 文件名。
限制
重复输入是相似性检查的祸根。 如果我们有一个文件包含 4
相同文本的副本,
A1 A2 A3 A4
在数字仅用于区分相同副本的情况下,有 8 个身份:
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个身份,其中最多19个是
有意义。 报告所有 715 人显然是不可接受的。
为了解决这个问题,按如下方式查找身份:对于
文本,找到最大的段,其中文本中出现不重叠的副本
跟随它。 报告该段及其副本并在该位置恢复扫描
就在段之后。 对于上面的例子,这导致身份 A1A2=A3A4
并且A3=A4,这是比较令人满意的,对于 N 大致相同的片段 2 日志 N
给出消息。
当四个相同的段在不同的文件中时,这也很有效:
文件 1:A1
文件 2:A2
文件 3:A3
文件 4:A4
现在像 A1A2 这样的组合段不会出现,算法找到运行 A1=A2,
A2=A3,A3=A4,共 Ñ-1 运行,所有信息。
计算 百分率
上述方法不适用于获取文件内容的百分比
可以在另一个文件中找到。 这需要单独比较每个文件对
在上面的矩阵中用ac表示; 这是什么 -e 选项。 在下面 -e
选项 File1:A1 在 File2 中识别,将再次在 File3 中识别,并且
文件 4. 在上面的例子中,它产生了运行
文件 1:A1=文件 2:A2
文件 1:A1=文件 3:A3
文件 1:A1=文件 4:A4
文件 2:A2=文件 3:A3
文件 2:A2=文件 4:A4
文件 3:A3=文件 4:A4
共 ½N(N-1) 运行。
时间 AND 空间 参赛要件
已注意保持所有内部流程的时间要求(几乎)
通过使用各种表格,输入文件的长度呈线性。 然而,如果有
表没有足够的内存,它们按不重要的顺序被丢弃,在这种情况下
条件算法恢复到它们的二次性质。
时间要求是文件数量的二次方。 这意味着,例如,
一个 64 MB 文件的处理速度比 8000 个 8 kB 文件快得多。
对于输入中的每个标记,程序需要 6 字节的内存; 每个换行符 2 个字节
(不是在做百分比时); 发现每次运行大约 76 个字节。
示例
通话
sim_c *.c
突出显示目录中的重复代码。 (删除生成的文件很有用
首先。)一个电话
sim_c -f -F *.c
可以进一步查明它们。
一个电话
sim_text -e -p -s 新的/* / 旧的/*
将 new/* 中的每个文件与 new/* 和 old/* 中的每个文件进行比较,如果有任何对具有更多
20% 的共同点,这一事实被报道。 通常30%以上的相似度是显着的;
低于 20% 可能是巧合; 而在两者之间是值得怀疑的。
一个电话
sim_text -e -n -s -r100 new/* "|" 老的/*
比较相同的文件,并报告大的公共段。 (这 | 可以作为一个
分隔符而不是 / 在系统上 / 作为命令行参数被破坏
命令解释器。)
这两种方法都适用于剽窃检测。
使用 onworks.net 服务在线使用 sim_lisp