Shotnest

Shotnest · Библиотека

Сравнивайте код без предположения о равном поведении

Сравните два фрагмента кода в текстовом инструменте Shotnest и посмотрите, почему if (count > 0) и if (count >= 0) всё равно делят 0,778 своих токенов.

Что сравнение делает с кодом

Инструмент сравнения переводит оба ввода в нижний регистр, применяет ту же нормализацию символов, что и поиск Shotnest (диакритика удаляется, полноширинные буквы становятся полуширинными), сводит каждую серию пробельных символов к одному пробелу и затем делит текст по пробелам. Он сообщает долю различных токенов, общих для двух текстов, а также токены, найденные только с одной стороны. Отступы, переносы строк и регистр букв исчезают ещё до этого шага, что удобно для прозы и рискованно для кода.

Ничего не выполняется. Страница считает вставленный фрагмент обычным текстом и выводит результат, не превращая его в разметку, поэтому числа описывают символы, а не поведение.

Подготовьте два фрагмента

  1. Вставьте каждый фрагмент ровно в том виде, в каком он снят, вместе с фигурными скобками и операторами.
  2. Сначала прочитайте строку «Полностью совпадают»: только эта проверка учитывает регистр и пробелы.
  3. Затем прочитайте «Совпадают после нормализации» и значение совпадения как отдельные факты.
  4. Откройте списки токенов «Только в первом тексте» и «Только во втором тексте»; операторы и прилипшая пунктуация обычно оказываются там.
  5. Всё, чего списки токенов показать не могут, например отступы в языке, где они важны, проверяйте по скриншоту.

Два фрагмента, один изменённый оператор

Первый текст: «if (count > 0) { return count; }», записанный в три строки. Второй текст: та же инструкция в одну строку с >= вместо >. После нормализации переносов строк больше нет, поэтому различаются только токены > и >=. Семь из девяти различных токенов общие, что даёт 7 ÷ 9.

Полностью совпадают
Нет
Совпадают после нормализации
Нет
Совпадение слов
0,7777777777777778
Только в первом тексте
>
Только во втором тексте
>=

Вторая пара показывает обратный риск: «const Total = 1;» и «const total = 1;» считаются равными после нормализации с совпадением 1, хотя во многих языках Total и total — разные имена.

Ошибки с текстом кода

Где сравнение останавливается

Совпадение токенов — мера текста. Оно не учитывает порядок, повторы токенов и пробелы, поэтому не может сказать, скомпилируется ли код и вернёт ли он то же значение. В приложении Shotnest скриншот кода попадает на полку «Код», когда три строки или больше начинаются как код (import, def, return и подобные); эта полка нужна, чтобы снова его найти, а запускать код — задача вашей собственной среды.