Это команда sim_m2, которую можно запустить в бесплатном хостинг-провайдере 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 ] файл ... [ [ / | ] файл ... ]
сим_с ...
sim_java ...
сим_паск ...
сим_м2 ...
сим_лисп ...
sim_mira ...
сим_текст ...
ОПИСАНИЕ
Сим_с читает файлы C файл ... и ищет похожие фрагменты текста; два
сегменты текста программы похожи, если они отличаются только макетом, комментарием, идентификаторами,
и содержимое чисел, строк и символов. Если какие-либо участки достаточной длины
найдены, они выводятся на стандартный вывод; количество значимых токенов в пробеге
дается в квадратных скобках.
Sim_java делает то же самое для Java, сим_паск для Паскаля, сим_м2 для Модула-2, sim_mira для
Миранда и сим_лисп для Лиспа. Сим_текст работает с произвольным текстом и иногда
полезно для сценариев оболочки.
Программа может использоваться для поиска скопированных фрагментов кода в якобы несвязанных
программы (с -s or -S), или для поиска случайно дублированного кода в более крупных проектах.
(с -f or -F).
Если разделитель / or | присутствует в списке входных файлов, файлы разбиты на
группа «новых» файлов (до / or |) и группа "старых" файлов; если нет / or
|, все файлы «новые». Старые файлы никогда не сравниваются друг с другом. Также
описание -s и -S варианты ниже.
Поскольку тестеру подобия нужны имена файлов, чтобы определить сходство, он не может читать
со стандартного ввода.
Возможны следующие варианты:
-d Вывод находится в Разница(1) -подобный формат вместо стандартного формата с двумя столбцами.
-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.
-- (Секретная опция, которая печатает ввод так, как его видит средство проверки сходства, и
затем останавливается.)
The -p опция приводит к строкам формы
F состоит на x% из материала G.
это означает, что x% текста F также можно найти в G. Обратите внимание, что это отношение не
симметричный; на самом деле вполне возможно, что один файл на 100% состоит из текста из
другой файл, в то время как другой файл состоит только на 1% текста первого файла, если
их длина достаточно различается. В -P (заглавная буква P) показывает основного участника для
только каждый файл. Это упрощает идентификацию набора файлов A [1] ... A [n], где
конкатенация этих файлов также присутствует. Порог можно установить с помощью -t
вариант; обратите внимание, что степень детализации распознанного текста по-прежнему регулируется -r
вариант или значение по умолчанию.
The -r опция управляет количеством «единиц», составляющих пробег. Для программ, которые
сравните код языка программирования, единица - это лексический токен на соответствующем языке;
комментарии и стандартные материалы преамбулы (включение файлов и т. д.) игнорируются, а все строки
считаются одинаковыми. Для сим_текст единица - это "слово", которое определяется как любая последовательность
из одной или нескольких букв, цифр или символов более 127 (177 восьмеричных) (для размещения
буквы, такие как ä, ø и т. д.).
Сим_текст принимает пробел как обычный текст.
The -s и -S параметры определяют, какие файлы сравнивать. Входные файлы разделены на два
группы, новые и старые. При отсутствии этих вариантов управления программы сравнивают
файлы таким образом (для 4 новых файлов и 6 старых):
новый / старый <- первый файл
1 2 3 4/5 6 7 8 9 10
| ------------ / ------------
п 1 | c /
e 2 | cc /
w 3 | ccc /
4 | cccc /
второй / / / / / / / / / / / / /
файл -> 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
| ------------ / ------------
п 1 | /
е 2 | с /
w 3 | cc /
4 | ccc /
второй / / / / / / / / / / / / /
файл -> 5 | cccc /
o 6 | cccc /
l 7 | cccc /
d 8 | cccc /
9 | cccc /
10 | cccc /
The -S опция уменьшает это дополнительно до:
новый / старый <- первый файл
1 2 3 4/5 6 7 8 9 10
| ------------ / ------------
п 1 | /
е 2 | /
ш 3 | /
4 | /
второй / / / / / / / / / / / / /
файл -> 5 | cccc /
o 6 | cccc /
l 7 | cccc /
d 8 | cccc /
9 | cccc /
10 | cccc /
Программы могут обрабатывать имена файлов UNICODE под Windows. Это актуально только под
-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, всего N-1 пробегает, все информативно.
Расчет Проценты
Вышеупомянутый подход не подходит для получения процента содержимого файла, которое
можно найти в другом файле. Это требует изолированного сравнения каждой пары файлов.
представлен ac в приведенных выше матрицах; это то, что -e вариант делает. Под -e
вариант a сегмент 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) пробеги.
ВРЕМЯ И SPACE ТРЕБОВАНИЯ
Были приняты меры для соблюдения требований ко времени всех внутренних процессов (почти)
линейно по длине входных файлов, используя различные таблицы. Если, однако, есть
недостаточно памяти для таблиц, они отбрасываются в порядке неважности, в соответствии с чем
В условиях, когда алгоритмы возвращаются к своей квадратичной природе.
Требования ко времени квадратичны по количеству файлов. Это означает, например, что
один файл размером 64 МБ обрабатывается намного быстрее, чем 8000 файлов размером 8 КБ.
Программе требуется 6 байтов памяти для каждого токена на входе; 2 байта на новую строку
(не при процентном соотношении); и около 76 байт для каждого найденного прогона.
ПРИМЕРЫ
Вызов
sim_c * .c
выделяет повторяющийся код в каталоге. (Полезно удалить сгенерированные файлы
первый.) Звонок
sim_c -f -F * .c
может определить их дальше.
Вызов
sim_text -e -p -s новый / * / старый / *
сравнивает каждый файл в новом / * с каждым файлом в новом / * и старом / *, и если в какой-либо паре больше этого
20% в общем, это факт. Обычно сходство 30% или более является значительным;
ниже 20%, вероятно, совпадение; а между ними сомнительно.
Вызов
sim_text -e -n -s -r100 новый / * "|" Старый/*
сравнивает одни и те же файлы и сообщает о больших общих сегментах. (В | может использоваться как
разделитель вместо / в системах, где / поскольку параметр командной строки искажается
командный интерпретатор.)
Оба подхода хороши для обнаружения плагиата.
Используйте sim_m2 онлайн с помощью сервисов onworks.net