Неужели философия Unix не в пользу сообщества Ruby?
Дэвид Корн, сторонник философии Unix, несколько лет назад упрекал программистов на Perl в интервью Slashdot для написания монолитных сценариев Perl без используя Unix toolkit через каналы, перенаправление и т.д. "Unix - это не просто операционная система, - сказал он, - это способ сделать что-то, и оболочка играет ключевую роль, предоставляя клей, который заставляет его работать."
Кажется, что напоминание может в равной степени относиться к сообществу Ruby. Ruby имеет отличные возможности для совместной работы с другими инструментами Unix с помощью всплывающих окон, STDIN, STDOUT, STDERR, ARGF и т.д., Но, похоже, что все чаще рубисты предпочитают использовать привязки Ruby и библиотеки Ruby и создавать монолитные Ruby-программы.
Я понимаю, что в некоторых случаях могут возникать проблемы с производительностью для перехода монолитного и делать все в одном процессе Ruby, но, безусловно, есть много автономных и асинхронных задач, которые могут быть хорошо обработаны программами Ruby, работающими вместе с другими небольшими программами каждый из которых хорошо разбирается в моделях Unix со всеми преимуществами, которые предлагает этот подход.
Возможно, мне просто не хватает чего-то очевидного. Неужели философия Unix по-прежнему актуальна сегодня, как это было 10 лет назад?
Ответы
Ответ 1
Философия Unix для труб и простые инструменты для текста. Это по-прежнему актуально, но, возможно, не так важно, как раньше:
-
Мы видим больше инструментов, выход которых не предназначен для простого анализа другими программами.
-
Мы видим гораздо больше XML, где нет особого преимущества для написания текста через фильтры, а регулярные выражения - рискованная игра.
-
Мы видим больше интерактивности, тогда как в Unix-каналах информация распространяется только в одном направлении.
Но хотя мир немного изменился, я до сих пор согласен с критикой Корна. Это, безусловно, плохой дизайн для создания больших монолитных программ, которые не могут взаимодействовать с другими программами, независимо от языка. Правила те же, что и раньше:
-
Помните, что ваш собственный выход программы может быть другим программным вводом.
-
Если ваша программа имеет дело с одним типом данных (например, производительность кода, представленная студентами, что я делал за последнюю неделю), обязательно используйте тот же формат для обоих входных данных и вывод этих данных.
-
Для взаимодействия с существующими инструментами Unix входы и выходы должны быть ASCII и ориентированы на линию. Многие интернет-протоколы IETF (SMTP, NNTP, HTTP) являются примерами.
-
Вместо того, чтобы писать большую программу, рассмотрите возможность написания нескольких небольших программ, связанных с существующими программами с помощью конвейеров оболочки. Например, некоторое время назад xkcd blog имел пугающий конвейер для поиска анаграмм в /usr/share/dict/words
.
-
Поработайте над сценариями оболочки, создав свою интерактивную оболочку, которую вы также можете использовать script. (Я использую ksh
, но любая совместимая с POSIX оболочка является разумным выбором.)
В заключение есть действительно два очень важных способа повторного использования кода:
-
Напишите небольшие программы, которые хорошо сочетаются при подключении с помощью конвейеров оболочки (Unix).
-
Напишите небольшие библиотеки, которые хорошо сочетаются при подключении import
, #include
, load
, require
или use
(Ruby, С++ STL, C Интерфейсы и реализации и многие другие).
В первой парадигме структура зависимостей проста (всегда линейна) и поэтому легко понятна, но вы более ограничены тем, что вы можете выразить. Во второй парадигме ваша структура зависимостей может быть любым ациклическим графом, намного более выразительной силой, но это включает в себя возможность создавать безвозмездную сложность.
Обе парадигмы по-прежнему актуальны и важны; для любого конкретного проекта, который вы выбираете, имеет больше общего с вашими клиентами и вашей отправной точкой, чем с какой-либо внутренней ценностью парадигмы. И, конечно же, они не являются взаимоисключающими!
Ответ 2
Я думаю, что философия Unix начала выходить из моды с созданием Emacs.
Ответ 3
Мой голос - да. Субъективный, но отличный вопрос программирования.
Просто персональный анекдот в то время, когда мы переписывали программу массовой печати для страховых компаний. Мы буквально ругались советниками за "программирование" в оболочке. Мы узнали, как он был слишком разъединен, и языки были слишком разрозненными, чтобы быть полными.
Может быть.
Внезапно многопроцессорный Intel boxen стал обычным делом, и fork() на самом деле не выполнялся так ужасно, как каждый всегда предупреждался в новую эпоху приложений (думаю, дни VB). Программы массовой печати (которые запросили db, преобразовали в вывод troff
, а затем в PostScript через msgsnd
, а затем вышли в очередь LPD
в сотни тысяч), отлично масштабировались по всем системам и не требовали перезаписывается при изменении времени выполнения VB.
На ваш вопрос:
Я с мистером Корном, но это не ошибка Perl, именно программисты Perl решили, что Perl достаточно. В многопроцессорных системах, возможно, это достаточно хорошо.
Я надеюсь, что Ruby, Perl, Python и (gasp) даже разработчики Java могут сохранить свое преимущество в конвейере оболочки. В философии развития есть неотъемлемая ценность для неявного масштабирования и сопряжения, разделения обязанностей и модульного дизайна.
Правильно подобравшись с нашими массивными процессорами на горизонте, философия Unix снова может наступить.
Ответ 4
Он не кажется полностью потерянным. Я прочитал недавнюю запись блога , в которой акцентировалась философия UNIX и как она охвачена HTTP-сервер Unicorn. Однако у него было такое же общее ощущение, что рубиновое сообщество игнорирует философию UNIX в целом.
Ответ 5
Я предполагаю, что довольно простое объяснение заключается в том, что инструменты Unix доступны только в Unix. Однако подавляющее большинство пользователей запускают Windows.
Я помню, как в прошлый раз, когда я пытался установить Nokogiri, он провалился, потому что он не мог запустить uname -p
. Для этого не было никаких оснований. Вся информация, которую можно получить при запуске uname -p
, также доступна из Ruby. Кроме того, uname -p
на самом деле даже не Unix, это нестандартное расширение GNU, которое даже не гарантировано работает на Unix, и, например, полностью разбито на несколько дистрибутивов Linux.
Итак, вы можете использовать Unix и потерять 90% своих пользователей или использовать Ruby.
Ответ 6
Нет. Unix и Ruby живы и хорошо
Unix и Ruby оба живы и здоровы, поставщик Unix Apple, запас Apple, выведен на орбиту, у Linux есть безотзывное место для работы с серверами, разработками и лабораторными системами, а Microsoft-программная империя Microsoft окружена мощными варварами SaaS как Google и армия союзников.
У Unix никогда не было более светлого будущего, и Ruby является одним из его ключевых союзников.
Я не уверен, что шаблон программного обеспечения является таким ключевым элементом Unix. Это было потрясающе в свое время с учетом общего неуклюжего граничащего с качеством качества конкурирующих инструментов CLI, но Unix представила много других вещей, включая элегантный процесс и модель ввода/вывода.
Кроме того, я думаю, вы обнаружите, что многие из этих программ Ruby используют внутренние интерфейсы Unix и программно-инструментальных средств. Проверьте методы popen() и различные методы процесса.
Я думаю, что Ruby просто имеет свою сферу влияния.