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

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

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

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

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

30 голосов | спросил dvanaria 22 MarpmTue, 22 Mar 2011 16:41:45 +03002011-03-22T16:41:45+03:0004 2011, 16:41:45

5 ответов


19

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

ответил dancek 22 MarpmTue, 22 Mar 2011 16:47:12 +03002011-03-22T16:47:12+03:0004 2011, 16:47:12
9

Ответ находится в «Monadic i /o и UNIX shell programming» от Олега Киселева.

  

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

ответил horsh 22 MarpmTue, 22 Mar 2011 21:24:48 +03002011-03-22T21:24:48+03:0009 2011, 21:24:48
6

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

ответил Brian Knoblauch 22 MarpmTue, 22 Mar 2011 16:44:39 +03002011-03-22T16:44:39+03:0004 2011, 16:44:39
1

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

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

-tjw

ответил Travis Webb 22 MarpmTue, 22 Mar 2011 21:24:13 +03002011-03-22T21:24:13+03:0009 2011, 21:24:13
1

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

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

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

а. Там вы идете с помощью «grep», «fgrep» и его семьи, чтобы сделать это.

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

б. Теперь у нас есть команда «sort».

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

с. Теперь у нас есть «diff», «cmp» и др., Чтобы сделать это.

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

д. У вас есть команды «cat», pipe и redirection для записи в файл.

Вам нужен более подробный анализ.

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

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

ф. awk, shell и sed.

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

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

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

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

Я читал это где-то в reddit.

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

ответил kamaal 25 MaramFri, 25 Mar 2011 11:32:49 +03002011-03-25T11:32:49+03:0011 2011, 11:32:49

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132