Чи програмування у філософії UNIX збігається з функціональним програмуванням?


30

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

Просто використовуючи платформу Linux, концепція є досить чіткою і використовується весь час. Будь-який вираз, сформований у командному рядку, який перенаправляє введення-виведення, пов'язуючи системні інструменти, такі як ls, grep, багато іншого тощо, показує, наскільки потужна ця концепція.

Мене бентежить те, що багато з цих програм написані на C, використовуючи стиль імперативного / процедурного програмування, але спосіб їх використання та об'єднання в командному рядку мені набагато більше схожий на функціональне програмування, де кожна програма є ізольована функція, яка не залежить від стану будь-якої іншої програми, до якої вона може бути приєднана.

Це точне розуміння філософії програмування UNIX - це в основному функціональне програмування з використанням інструментів, які, можливо, були побудовані з використанням імперативного стилю програмування?


5
Я не думаю, що важливо, чи є аналогія точною чи ні. Питання в тому, чи корисна вам аналогія? Чи допомагає думка про це в тих термінах писати програми і виконувати роботу?

Відповіді:


19

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


9

Відповідь - у програмі оболонки «Монадік вводу-виводу та оболонки UNIX» Олега Кисельова.

Це нарис, натхненний працями Філіпа Вадлера "Як оголосити імператив" [ Wadler97 ]. Ми покажемо незвичну схожість між монадичним введенням вводу в Haskell та композиціями фільтрів UNIX на основі труб та перенаправлень. Труби UNIX (трактуються семантично як запис у тимчасові файли) досить схожі на монади. Крім того, на рівні програмування UNIX всі введення-виведення можна вважати монадійними ...


6

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


1
Ви справді отримали літак ?? ;) (вибачте за коментар offtopic)
BlackBear

@BlackBear Не моя особиста. Я в клубі, де близько 50 із нас колективно володіють 4 літаками. Це трохи доступніше. :-)
Брайан Ноблеуч

@Brian Knoblauch: Я б хотів мати літак у майбутньому .. гроші дозволяють: P
BlackBear

5
Функціональне програмування не означає "відсутність побічних ефектів". Концепція, коли одна і та ж функція завжди дає один і той же результат, називається "idempotence" і не є необхідною умовою для функціонування програми. Це також відомо як "чистий функціонал".

2

До певної міри ви можете це сказати. Але це не обов'язково так. Я думаю, ви повинні прочитати це більше як "здатність досягати більше" за спрощеного дизайнерського підходу. А для того, щоб бути простим, вам доведеться розділити завдання на легко зрозумілі та легкі для збирання частини. Філософію UNIX, щоб бути відвертими з вами, можна пояснити наступним прикладом.

Все програмування - це якась обробка даних! І в деяких випадках програмування - це також сама маніпуляція програмою (Meta програмування). Тепер так, як працює філософія UNIX, уявіть обробку тексту. Що таке текст? Текст зрештою є деякими даними. Коли збирається в організоване визначення, текст також стає XML та JSON. Текст також може бути списком чисел, Текст також може бути csv, tsv, і що ні! В інших текстах або рядках може бути реальна величезна область даних програмування лише тому, що його контекст може скручуватися і перетворюватися на те, що ми хочемо!

Все програмування вимагає певної організації даних. Для організації потрібен пошук ...

а. Там ви хочете просто мати "grep", "fgrep" та її сім'ю для цього.

Після пошуку вам потрібно зробити сортування ..

б. Тепер у нас є команда «сортувати», щоб це зробити.

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

c. Тепер у нас є 'diff', 'cmp' та інші.

Ви щойно встановили, що між файлами немає різниці. Зараз вам потрібно більше організованих даних.

г. У вас є "cat", труби та оператори перенаправлення, щоб записати у файл.

Вам потрібен більш конкретний аналіз.

е. У вас є голова, хвіст, більше, менше, виріжте та ін., Щоб це зробити ...

Все це зшити разом, використовуючи знак "|" генерувати реальні потужні речі деякий час, не записуючи жодного коду. Для більшого пошуку та шиття у вас є ..

f. awk, оболонка і sed.

awk, shell та sed надають вам більший контроль над текстом, ніж те, що може надати вам різний, різний та ін. Ви коли-небудь замислювалися над цією командою1 | команда2 | серія command3 ... - це свого роду механізм робочого процесу. У поєднанні з If це стає більш потужним.

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

Ви коли-небудь чули про утиліту під назвою "Perl" , ця річ настільки потужна, що ви можете виконати будь-яке завдання під рукою, якнайменше уявити роботу. Зшиті разом з утилітою, такою як DBM, ви можете виконувати навіть невеликі вимоги до стійкості часу для вашої програми. Пам'ятайте, що ми навіть не вийшли з текстового світу, але все ж вдалося охопити більшість аспектів середовища програмування.

Тому я думаю, що UNIX - це більше, ніж операційна система. Це колекція інструментів та середовища, призначених для вирішення проблем найбільш простим способом. Простий спосіб не обов'язково передбачає простоту реалізації рішення. Але сама простота не забирає вас далеко.

Я читав це десь на reddit.

"Якщо ваша єдина мета дизайну - простота, ви отримаєте стільки користувачів, скільки Plan9"


1

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

Сподіваюся, це допомагає,

-tjw

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.