Насколько интеллектуальны утилиты Unix?

8

Утилиты Unix, такие как sort, find, grep, diff и др., Очень удобны для выполнения быстрых задач, иногда вообще без написания кода.

Я хотел знать, какие алгоритмы они используют внутри и как разумно выбрать конкретный алгоритм для конкретной задачи? Например, если сортировка получает огромный входной файл, будут ли она использовать разные алгоритмы для разных размеров данных?

Разумно ли переключается grep при поиске различных наборов данных?

Kamaal
источник
4
Они настолько умны, что однажды захватят Землю. Но теперь вы должны решить , какие из них вы собираетесь использовать, например grep, egrepили fgrep.
Кейт
1
Но если вы регулярно используете egrep, а затем внезапно переключаетесь на fgrep, он может решить убить вас во сне за неверность.
Шадур
1
Они так же умны, как и руки, которые ими владеют.
luis.espinal

Ответы:

7

Unix - это просто стандарт, он определяет, что должны делать реализации, а не как они должны это делать.

Поэтому реализации grep / sort / find, скорее всего, будут использовать разные подходы в разных системах (и даже в одной системе, например в Linux, есть параллельные реализации).

Для Linux вы всегда можете заглянуть в исходный код.

Шимон Тот
источник
2
Чтобы завершить свой ответ: gnu.org/software/coreutils
sahid
Зачем вам нужно смотреть на исходный код? алгоритмы greps хорошо известны и задокументированы. Это даже на странице Википедии для grep. ссылка
удаленный аккаунт
@ Удалено Я думаю, что вы путаете принципы с реализацией.
Шимон Тот
@Let_Me_Be: алгоритм и даже реализация хорошо известны и задокументированы. ссылка ссылка
удаленный аккаунт
@ Удалено Может быть, я не понимаю, что вы пытаетесь сказать, но то, что Linux grep из coreutils использует определенный алгоритм, не означает, что все реализации используют этот алгоритм. И да, вы правы в том, что алгоритмы, как правило, хорошо известны (так как это смысл их разработки).
Шимон Тот
1

Стандарт UNIX не определяет детали реализации стандартных системных инструментов, за исключением действительно редких случаев. Вы можете найти последнюю версию Single Unix Specification здесь (предупреждение: требуется регистрация).

Имея это в виду, каждая UNIX (System V и прямые потомки, такие как BSD, Solaris, Mac OS X и т. Д.) Или операционная система на основе UNIX (далёкие потомки или аналогичные: Linux, Minix) имеют свои собственные реализации утилит, описанных в спецификация UNIX. Например, взгляните на FreeBSD и Linux / GNU Coreutils . Помните, что некоторые инструменты представляют собой отдельный проект, например, GNU diff или GNU grep . Кроме того, еще один факт заключается в том, что некоторые реализации этих инструментов могут найти дорогу в других UNIX-подобных системах в качестве стандартных, чем те, для которых они были изначально написаны, например, для некоторых gnu coreutils в freebsd или GCC.

Бонус: чтобы обернуть голову вокруг семейного древа UNIX, взгляните на этот график .

Шиннок
источник
0

Я хотел знать, какие алгоритмы они используют внутри и как разумно выбрать конкретный алгоритм для конкретной задачи? Например, если сортировка получает огромный входной файл, будут ли она использовать разные алгоритмы для разных размеров данных?

Это интересный вопрос (+1 за это). Я понятия не имею, каков ответ, но на вашем месте я бы посмотрел исходный код типичных утилит GNU, чтобы получить представление об их алгоритмах.

Разумно ли переключается grep при поиске различных наборов данных?

Я так не думаю. Не цитируйте меня, так как я не могу сказать вам со 100% уверенностью, но я действительно так не думаю. Философия вещей UNIX заключается в том, что одна вещь делает одну вещь и только одну вещь. Вот почему у нас есть несколько версий Grep ( grep, egrep, fgrep).

Кроме того, идея состоит в том, чтобы делать одно и только одно во время выполнения. Разное поведение и алгоритмы могут быть настроены в качестве аргументов командной строки, так что одна и та же программа может действовать немного по-разному (и, возможно, немного более оптимизировано) между запусками. Хорошие примеры являются wcи diffкомандой.

Однако поведенческая адаптация основана на конфигурации (через аргументы строки cmd); они не меняют / не адаптируют поведение во время выполнения. Как правило, это ненужная сложность для типа артефактов, к которым стремятся инструменты UNIX.

Такая сложность больше подходит для более сложных, менее универсальных инструментов IMO.

luis.espinal
источник
2
Тема здесь больше Нет, на самом деле они тупые! , Вы должны сказать им точно, что должны делать. В любом случае, мы не хотим, чтобы они были слишком умны с нами, вы знаете.
Чепанг
0

Разумно ли переключается grep при поиске различных наборов данных?

Я так не думаю, но он переключается на «быстрый» не-RE алгоритм, когда ему присваивается флаг -f (или он вызывается как fgrep).

kmarsh
источник
то есть не очень умный :)
tshepang