diff
В вычислительной технике diff — утилита сравнения файлов, выводящая разницу между двумя файлами. Эта программа выводит построчно изменения, сделанные в файле (для текстовых файлов). Современные реализации поддерживают также двоичные файлы. Вывод утилиты называется «diff», или, что более распространено, патч, так как он может быть применён с программой patch. Вывод похожих утилит сравнения файлов также часто называется «diff».
История[править | править код]
Утилита diff была разработана в начале 1970-х годов для операционной системы Unix, которая была плодом работы AT&T Bell Labs, в Мюррей Хилл (Нью-Джерси). Финальная версия, распространяемая с 5ой версией Unix в 1974, была полностью написана Даглас МэкИлрой (англ.).
Этот раздел не завершён. Вы поможете проекту, исправив и дополнив его.
|
Алгоритм[править | править код]
Работа diff основана на нахождении наибольшей общей подпоследовательности (англ. longest common subsequence , проблема LCS). В LCS, у вас имеется две последовательности элементов:
a b c d f g h j q z
a b c d e f g i j k r x y z
и вы хотите найти наиболее длинную последовательность элементов, которая представлена в обоих последовательностях в одинаковом порядке. Это означает, что вы хотите найти новую последовательность, которая может быть получена из первой последовательности удалением некоторых элементов или из второй последовательности удалением других элементов. В данном случае такой последовательностью будет являться
a b c d f g j z
После получения наибольшей общей последовательности остаётся только небольшой шаг до получения похожего на diff вывода:
e h i k q r x y + - + + - + + +
Использование[править | править код]
diff вызывается из командной строки с именами двух файлов в качестве аргументов: diff original new. Вывод команды представляет собой изменения, которые нужно произвести в исходном файле original, чтобы получить новый файл new. Если original и new — директории, то diff автоматически будет применён к каждому файлу, который существует в обоих директориях. Все примеры в этой статье используют следующие два файла, original и new:
original: This part of the document has stayed the same from version to version. It shouldn't be shown if it doesn't change. Otherwise, that would not be helping to compress the size of the changes. This paragraph contains text that is outdated. It will be deleted in the near future. It is important to spell check this dokument. On the other hand, a misspelled word isn't the end of the world. Nothing in the rest of this paragraph needs to be changed. Things can be added after it. |
new: This is an important notice! It should therefore be located at the beginning of this document! This part of the document has stayed the same from version to version. It shouldn't be shown if it doesn't change. Otherwise, that would not be helping to compress anything. It is important to spell check this document. On the other hand, a misspelled word isn't the end of the world. Nothing in the rest of this paragraph needs to be changed. Things can be added after it. This paragraph contains important new additions to this document. |
Команда diff original new производит следующий нормальный дифф-вывод:
0a1,6 > This is an important > notice! It should > therefore be located at > the beginning of this > document! > 8,14c14 < compress the size of the < changes. < < This paragraph contains < text that is outdated. < It will be deleted in the < near future. --- > compress anything. 17c17 < check this dokument. On --- > check this document. On 24a25,28 > > This paragraph contains > important new additions > to this document.
В этом традиционном формате вывода a означает добавлено (от англ. add), d — удалено, с — изменено. Перед буквами a, d или c стоят номера строк исходного файла, после них — номера строк конечного файла. Каждая строка, которая была добавлена, удалена или изменена, предваряется угловыми скобками.
По умолчанию, общие для исходного и конечного файлов номера строк не указываются. Строки, которые перемещены, показываются как добавленные на своём новом месте и удалённые из своего прошлого расположения.[1]
Варианты[править | править код]
Большинство реализаций diff остаются внешне неизменными с 1975 года. Модификации включают в себя улучшения основного алгоритма, добавление новых ключей команды, новые форматы вывода. Базовый алгоритм изложен в книгах An O(ND) Difference Algorithm and its Variations Юджина В. Майерса, [2] и в A File Comparison Program Вебба Миллера и Майерса. [3] Алгоритм был независимо открыт и описан в Algorithms for Approximate String Matching Е. Юкконеном [4] Первые версии программы diff были разработаны для сравнения строк текстовых файлов, использующий символ новой строки как разделитель строк. В 1980-х, поддержка двоичных файлов привела к изменениям в схеме работы и реализации программы.
Контекстный формат[править | править код]
Этот раздел не завершён. Вы поможете проекту, исправив и дополнив его.
|
Унифицированный формат[править | править код]
Этот раздел не завершён. Вы поможете проекту, исправив и дополнив его.
|
Другие форматы[править | править код]
Этот раздел не завершён. Вы поможете проекту, исправив и дополнив его.
|
См. также[править | править код]
- cmp
- comm
- diff3
- Kompare
- Microsoft File Compare
- Revision Control System
- rsync
- tkdiff
- wdiff — обёртка для diff для сравнения файлов по словам
- WinMerge
- Дельта-кодирование
- Наибольшая общая подпоследовательность
- Программы UNIX-подобных операционных систем
- Расстояние Левенштейна
Сноски[править | править код]
- ↑ Comparing and Merging Files with GNU Diff and Patch. — 1997. — ISBN 0-9541617-5-0о книгеРегулярное выражение «ISBN» классифицировало значение «ISBN0954161750» как недопустимое.
- ↑ E. Myers (1986). "An O(ND) Difference Algorithm and Its Variations". Algorithmica 1 (2): 251–266.
- ↑ Webb Miller and Eugene W. Myers (1985). "A File Comparison Program". Software — Practice and Experience 15 (11): 1025–1040.
- ↑ E. Ukkonen (1985). "Algorithms for Approximate String Matching". Information and Control 64: 100–118.
Ссылки[править | править код]
- Пакет GNU diffutils включает в себя diff. Распространяется под GNU General Public License.
- diffutils для Win32 — часть GnuWin32
- Онлайновый интерфейс к diff
- java-diff — Библиотека diff, реализованная на Java
- Алгоритм diff на C# — Исходный код алгоритма diff и его вариантов на C#
Текущая версия статьи о компьютерах. Помогите Традиции, исправьте и дополните её. |