Является ли программирование в философии UNIX таким же, как функциональное программирование?

30

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

Просто используя платформу Linux, концепция довольно ясна и используется постоянно. Любое выражение, сформированное в командной строке, которое перенаправляет ввод-вывод, связывая системные инструменты, такие как ls, grep, more и т. Д., Показывает, насколько мощна эта концепция.

Что меня смущает, так это то, что многие из этих программ написаны на C с использованием императивного / процедурного стиля программирования, однако способ их использования и объединения в командной строке кажется мне гораздо больше похожим на функциональное программирование, где каждая программа изолированная функция, которая не зависит от состояния любой другой программы, к которой она может быть присоединена.

Является ли это точным, понимание философии программирования UNIX - это в основном функциональное программирование с использованием инструментов, которые могли быть созданы с использованием императивного стиля программирования?

dvanaria
источник
5
Я не думаю, что важно, точна ли эта аналогия или нет. Вопрос в том, полезна ли вам эта аналогия? Помогает ли мысль об этом в этих терминах писать программы и выполнять работу?

Ответы:

19

Я думаю , что у вас есть пункт, но cp, rm, cdи многие другие изменения состояния, так что они не являются на самом деле функции. Философия UNIX заключается в том, чтобы делать только одно, а делать это хорошо; часто делать это хорошо означает функциональное использование, но не всегда.

dancek
источник
9

Ответ в «Программировании оболочки ввода-вывода и UNIX Monadic» Олега Киселева.

Это эссе, вдохновленное работой Филиппа Уодлера «Как объявить императив» [ Wadler97 ]. Мы покажем странное сходство между монадическим вводом-выводом в Haskell и композициями фильтров UNIX, основанными на каналах и перенаправлениях. Каналы UNIX (семантически трактуемые как запись во временные файлы) очень похожи на монады. Кроме того, на уровне программирования UNIX все операции ввода-вывода можно считать монадическими ...

Хорш
источник
6

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

Брайан Кноблаух
источник
1
У тебя действительно есть самолет? ;) (извините за оффтоп комментарий)
BlackBear
@ BlackBear Не мой личный. Я в клубе, где около 50 из нас вместе владеют 4 самолетами. Это немного доступнее. :-)
Брайан Кноблаух
@Brian Knoblauch: Я хотел бы иметь самолет в будущем .. деньги позволяют: P
BlackBear
5
Функциональное программирование не подразумевает «никаких побочных эффектов». Концепция, при которой одна и та же функция всегда дает один и тот же результат, называется «идемпотентностью» и не является обязательным условием функциональности программы. Это также известно как «чистый функционал».
2

В какой-то степени вы можете сказать это. Но это не обязательно правда. Я думаю, что вы должны читать это больше как «способность достигать большего» с упрощенным подходом к дизайну. И чтобы быть простым, вам придется разделить задачу на легко понятные и простые в сборке детали. Философия UNIX, чтобы быть откровенным с вами, можно объяснить на следующем примере.

Все программирование - это своего рода манипулирование данными! И в некоторых случаях программирование также является манипулированием самой программой (метапрограммирование). Теперь философия UNIX работает так: представьте себе обработку текста. Что такое текст? В конце концов, текст - это своего рода данные. При сборке в организованное определение текст также становится XML и JSON. Текст также может быть списком чисел, текст также может быть CSV, TSV и что нет! Другими словами, текст или строка могут представлять собой действительно огромную область данных программирования, просто потому, что их контекст может искажаться и превращаться в то, что мы хотим!

Все программирование требует какой-либо организации данных. Организация требует поиска ...

а. Там вы просто должны иметь 'grep', 'fgrep' и его семью, чтобы сделать это.

После поиска вам нужно сделать сортировку ..

б. Теперь у нас есть команда sort для этого.

Вы только что отсортировали два файла, теперь вы хотите сравнить их.

с. Теперь у нас есть 'diff', 'cmp' и другие, чтобы сделать это.

Вы только что обнаружили, что нет никакой разницы между файлами. Вам нужно больше организованных данных сейчас.

д. У вас есть операторы 'cat', pipe и перенаправления для записи в файл.

Вам нужен более конкретный разбор ..

е. У вас есть голова, хвост, больше, меньше, вырезать и так далее, чтобы сделать это ...

Все это сшиваем с помощью '|' генерировать действительно мощные вещи некоторое время без написания какого-либо кода вообще. Для большего поиска и шитья у вас есть ..

е. awk, shell и sed.

awk, shell и sed дают вам больший контроль над текстом, чем то, что может дать diff и другие. Задумывались ли вы, что command1 | команда2 | command3 ... series - это своего рода механизм рабочего процесса. В сочетании с If это становится более мощным.

Теперь приходит больше веселья.

Вы когда-нибудь слышали об утилите под названием «Perl» , эта вещь настолько мощная, что вы можете выполнить практически любую задачу с минимальными затратами труда. Сшитый вместе с такой утилитой, как DBM, вы можете выполнять даже небольшие требования по времени для своего приложения. Помните, что мы даже не вышли из текстового мира, но все же сумели охватить большинство аспектов среды программирования.

Поэтому я думаю, что UNIX - это больше, чем операционная система. Это набор инструментов и среды, предназначенных для решения проблем самым простым способом. Простой способ не обязательно подразумевает простоту реализации решения. Но простота сама по себе не слишком далеко заходит.

Я читал это кое-где на Reddit.

«Если ваша единственная цель - простота, вы получите столько же пользователей, сколько и Plan9»

Kamaal
источник
1

То, как они объединяются в командной строке и взаимодействуют друг с другом, очень функционально. Однако я бы сказал, что это больше связано с дизайном оболочки, а не с тем, написаны ли эти базовые программы обязательно или функционально. Большинство хороших функциональных языков поддерживают императивные / процедурные понятия, хотя их общий дизайн поддается функциональному программированию. Да, многие функции оболочки UNIX используют функциональные концепции, но, опять же, это связано с дизайном оболочки, а не с конкретной реализацией лежащих в основе программ.

Надеюсь это поможет,

-tjw

Трэвис Уэбб
источник