Подтвердить что ты не робот

Неужели философия Unix не в пользу сообщества Ruby?

Дэвид Корн, сторонник философии Unix, несколько лет назад упрекал программистов на Perl в интервью Slashdot для написания монолитных сценариев Perl без используя Unix toolkit через каналы, перенаправление и т.д. "Unix - это не просто операционная система, - сказал он, - это способ сделать что-то, и оболочка играет ключевую роль, предоставляя клей, который заставляет его работать."

Кажется, что напоминание может в равной степени относиться к сообществу Ruby. Ruby имеет отличные возможности для совместной работы с другими инструментами Unix с помощью всплывающих окон, STDIN, STDOUT, STDERR, ARGF и т.д., Но, похоже, что все чаще рубисты предпочитают использовать привязки Ruby и библиотеки Ruby и создавать монолитные Ruby-программы.

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

Возможно, мне просто не хватает чего-то очевидного. Неужели философия Unix по-прежнему актуальна сегодня, как это было 10 лет назад?

4b9b3361

Ответ 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 снова может наступить.

Ответ 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 просто имеет свою сферу влияния.