Построчный diff не читает документ как человек. Он превращает каждый нормализованный текст в упорядоченную последовательность полных строк, находит самую длинную общую последовательность и объясняет остальное удалениями или добавлениями. Это точная карта для исходников, заметок и обычных документов, но она не решает, одинаков ли смысл разных формулировок.
Полная строка — атомарная единица
TextDiff сначала нормализует CRLF и одиночные возвраты каретки в LF, чтобы окончания Windows и Unix не создавали экран ложных изменений. Каждый токен содержит видимые символы одной строки и признак следующего LF. Последний признак важен: `alpha` без перевода и `alpha` с переводом в конце — разные состояния. Пустой текст не имеет строк, а один перевод содержит одну пустую завершённую строку. Явные правила делают счётчики воспроизводимыми.
Общий каркас — наибольшая общая подпоследовательность
Подпоследовательность сохраняет порядок, но может пропускать элементы. Если обе версии содержат `alpha` перед `gamma`, они образуют общий каркас даже при вставке `delta`. Динамическое программирование вычисляет максимум совпадающих токенов для каждой пары оставшихся позиций. Восстановление идёт по таблице: совпадения становятся сохранёнными строками, пропуски слева — удалениями, справа — добавлениями. Результат является кратчайшим сценарием вставок и удалений, но не утверждает, что соседние записи автор задумал как одну замену.
Точная работа ограничена, смысл остаётся снаружи
Два одинаковых больших файла дёшевы после удаления общего префикса. Два несвязанных файла требуют крупной таблицы, поэтому TextDiff останавливается, если несовпадающая середина превышает восемь миллионов пар строк. Он просит меньшие фрагменты, а не молча меняет алгоритм. Завершённый результат описывает только совпадение строк. Сходство — удвоенное число сохранённых строк, делённое на сумму строк. Это не смысловое сходство, не доказательство плагиата, авторства или правильности важной правки.