Среда программирования UNIX (классический текст) утверждает, что подход UNIX к программированию заключается в создании небольших, четко определенных инструментов, которые можно комбинировать для решения более сложных задач. Изучая C и оболочку Bash, я обнаружил, что это мощная концепция, которую можно использовать для решения широкого круга задач программирования.
Просто используя платформу Linux, концепция довольно ясна и используется постоянно. Любое выражение, сформированное в командной строке, которое перенаправляет ввод-вывод, связывая системные инструменты, такие как ls, grep, more и т. Д., Показывает, насколько мощна эта концепция.
Что меня смущает, так это то, что многие из этих программ написаны на C с использованием императивного / процедурного стиля программирования, однако способ их использования и объединения в командной строке кажется мне гораздо больше похожим на функциональное программирование, где каждая программа изолированная функция, которая не зависит от состояния любой другой программы, к которой она может быть присоединена.
Является ли это точным, понимание философии программирования UNIX - это в основном функциональное программирование с использованием инструментов, которые могли быть созданы с использованием императивного стиля программирования?
Ответы:
Я думаю , что у вас есть пункт, но
cp
,rm
,cd
и многие другие изменения состояния, так что они не являются на самом деле функции. Философия UNIX заключается в том, чтобы делать только одно, а делать это хорошо; часто делать это хорошо означает функциональное использование, но не всегда.источник
Ответ в «Программировании оболочки ввода-вывода и UNIX Monadic» Олега Киселева.
источник
Ну, я думаю, вы можете посмотреть на это так, если игнорируете проблему побочных эффектов. Команды Unix часто НЕ действуют функционально, так как всегда возвращают один и тот же набор данных с одинаковыми входными данными. Однако, как вы упомянули, аспект трубопровода похож на функциональное программирование.
источник
В какой-то степени вы можете сказать это. Но это не обязательно правда. Я думаю, что вы должны читать это больше как «способность достигать большего» с упрощенным подходом к дизайну. И чтобы быть простым, вам придется разделить задачу на легко понятные и простые в сборке детали. Философия 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»
источник
То, как они объединяются в командной строке и взаимодействуют друг с другом, очень функционально. Однако я бы сказал, что это больше связано с дизайном оболочки, а не с тем, написаны ли эти базовые программы обязательно или функционально. Большинство хороших функциональных языков поддерживают императивные / процедурные понятия, хотя их общий дизайн поддается функциональному программированию. Да, многие функции оболочки UNIX используют функциональные концепции, но, опять же, это связано с дизайном оболочки, а не с конкретной реализацией лежащих в основе программ.
Надеюсь это поможет,
-tjw
источник