Shotnest · Библиотека
Сравнивайте код без предположения о равном поведении
Сравните два фрагмента кода в текстовом инструменте Shotnest и посмотрите, почему if (count > 0) и if (count >= 0) всё равно делят 0,778 своих токенов.
Что сравнение делает с кодом
Инструмент сравнения переводит оба ввода в нижний регистр, применяет ту же нормализацию символов, что и поиск Shotnest (диакритика удаляется, полноширинные буквы становятся полуширинными), сводит каждую серию пробельных символов к одному пробелу и затем делит текст по пробелам. Он сообщает долю различных токенов, общих для двух текстов, а также токены, найденные только с одной стороны. Отступы, переносы строк и регистр букв исчезают ещё до этого шага, что удобно для прозы и рискованно для кода.
Ничего не выполняется. Страница считает вставленный фрагмент обычным текстом и выводит результат, не превращая его в разметку, поэтому числа описывают символы, а не поведение.
Подготовьте два фрагмента
- Вставьте каждый фрагмент ровно в том виде, в каком он снят, вместе с фигурными скобками и операторами.
- Сначала прочитайте строку «Полностью совпадают»: только эта проверка учитывает регистр и пробелы.
- Затем прочитайте «Совпадают после нормализации» и значение совпадения как отдельные факты.
- Откройте списки токенов «Только в первом тексте» и «Только во втором тексте»; операторы и прилипшая пунктуация обычно оказываются там.
- Всё, чего списки токенов показать не могут, например отступы в языке, где они важны, проверяйте по скриншоту.
Два фрагмента, один изменённый оператор
Первый текст: «if (count > 0) { return count; }», записанный в три строки. Второй текст: та же инструкция в одну строку с >= вместо >. После нормализации переносов строк больше нет, поэтому различаются только токены > и >=. Семь из девяти различных токенов общие, что даёт 7 ÷ 9.
- Полностью совпадают
- Нет
- Совпадают после нормализации
- Нет
- Совпадение слов
- 0,7777777777777778
- Только в первом тексте
- >
- Только во втором тексте
- >=
Вторая пара показывает обратный риск: «const Total = 1;» и «const total = 1;» считаются равными после нормализации с совпадением 1, хотя во многих языках Total и total — разные имена.
Ошибки с текстом кода
- Принимать совпадение около 1 за доказательство того, что две функции ведут себя одинаково.
- Пропускать строку точного равенства и не заметить смену регистра в идентификаторе.
- Сравнивать фрагмент, у которого при копировании через Live Text пропала скобка или слились две колонки.
- Ожидать, что инструмент отметит изменённый оператор сравнения как более важный, чем изменённое слово.
Где сравнение останавливается
Совпадение токенов — мера текста. Оно не учитывает порядок, повторы токенов и пробелы, поэтому не может сказать, скомпилируется ли код и вернёт ли он то же значение. В приложении Shotnest скриншот кода попадает на полку «Код», когда три строки или больше начинаются как код (import, def, return и подобные); эта полка нужна, чтобы снова его найти, а запускать код — задача вашей собственной среды.