Почему руководство FreeBSD рекомендует использовать виртуальную консоль из-за системных сообщений? [закрыто]

кажется, что Bash является полным по Тьюрингу языком

Концепция полноты по Тьюрингу полностью отделена от многих других концепций, полезных в языке для ] программирование в целом : удобство использования, выразительность, понятность, скорость и т. д.

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

почему Bash используется почти исключительно для написания относительно простых сценариев?

Большие сложные сценарии оболочки, такие как сценарии configure , выводимые GNU Autoconf, нетипичны по многим причинам:

  1. До тех пор, пока сравнительно недавно нельзя было рассчитывать на повсеместное наличие POSIX-совместимой оболочки .

    Многие системы, особенно старые, технически имеют POSIX-совместимую оболочку где-то в системе, но она может быть не в предсказуемом месте вроде / bin / sh . Если вы пишете сценарий оболочки, и он должен работать во многих различных системах, как тогда написать строку shebang ? Один из вариантов - использовать / bin / sh , но ограничиться диалектом оболочки Bourne до POSIX на случай, если он будет запущен в такой системе.

    Оболочки Борна до POSIX даже не имеют встроенной арифметики; вы должны позвонить в expr или bc , чтобы это сделать.

    Даже с оболочкой POSIX вы упускаете ассоциативные массивы и другие функции, которые мы ожидали найти в языках сценариев Unix с тех пор, как Perl впервые стал популярным в начале 1990-х годов .

    Этот исторический факт означает, что существует многолетняя традиция игнорирования многих мощных функций современных интерпретаторов сценариев оболочки семейства Bourne просто потому, что вы не можете рассчитывать на их повсеместное присутствие.

    Фактически, это продолжается и по сей день: Bash не получал ассоциативных массивов до версии 4 , но вы можете быть удивлены, сколько систем, которые все еще используются, основаны на Bash 3. Apple все еще поставляет Bash 3 с macOS в 2017 году - , по-видимому, по причинам лицензирования - и серверы Unix / Linux часто работают практически без изменений в производственной среде в течение очень долгого времени, поэтому у вас может быть стабильная старая система, все еще работающая с Bash 3, например как ящик CentOS 5.Если у вас есть такие системы в вашей среде, вы не можете использовать ассоциативные массивы в сценариях оболочки, которые должны запускаться на них.

    Если ваш ответ на эту проблему состоит в том, что вы пишете сценарии оболочки только для «современных» систем,тогда вам придется принять тот факт, что последней общей точкой отсчета для большинства оболочек Unix является стандарт оболочки POSIX , который практически не изменился с момента его появления в 1989 году. Существует множество различных оболочек, основанных на этом стандарте. , но все они в разной степени отклонились от этого стандарта. Чтобы снова взять ассоциативные массивы, bash , zsh и ksh93 все имеют эту функцию, но есть несколько несовместимых реализаций. Тогда ваш выбор - только использовать Bash, или только , использовать Zsh, или только использовать ksh93 .

    Если ваш ответ на эту проблему: «так что просто установите Bash 4» или ksh93 или что-то еще, то почему бы вместо этого «просто» не установить Perl, Python или Ruby? Во многих случаях это неприемлемо; значения по умолчанию.

  2. Ни один из языков сценариев оболочки семейства Bourne не поддерживает модулей .

    Наиболее близким к модульной системе в сценарии оболочки является . Команда - также известная как исходный код в более современных вариантах оболочки Борна - которая дает сбой на нескольких уровнях по сравнению с надлежащей модульной системой, самым основным из которых является пространство имен .

    Независимо от языка программирования, человеческое понимание начинает сигнализировать, когда любой отдельный файл в более крупной общей программе превышает несколько тысяч строк. Причина, по которой мы структурируем большие программы во множество файлов, заключается в том, что мы можем абстрагировать их содержимое максимум до одного или двух предложений.Файл A - это синтаксический анализатор командной строки, файл B - сетевой насос ввода-вывода, файл C - это прокладка между библиотекой Z и остальной частью программы и т. Д. Когда ваш единственный метод для сборки множества файлов в одну программу - это включение текста , вы ограничиваете размер ваших программ.

    Для сравнения, если бы язык программирования C не имел компоновщика, только операторы #include . Для такого диалекта C-lite не нужны такие ключевые слова, как extern или static . Эти функции существуют для обеспечения модульности.

  3. POSIX не определяет способ области видимости переменных для одной функции сценария оболочки, не говоря уже о файле.

    Это фактически делает все переменные глобальными , что снова вредит модульности и компоновке.

    Есть решения этой проблемы в оболочках post-POSIX - конечно, в bash , ksh93 и zsh по крайней мере - но это просто возвращает вас к сути 1 выше.

    Эффект от этого можно увидеть в руководствах по стилю при написании макросов GNU Autoconf, где они рекомендуют добавлять к именам переменных префикс имени самого макроса, что приводит к очень длинным именам переменных исключительно по порядку. чтобы снизить вероятность столкновения до приемлемо близкого к нулю.

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

  4. У языков программирования оболочки нет стандартной библиотеки.

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

    Также нет широко используемого архива библиотек служебных программ оболочки, как в Perl CPAN . Без большой доступной библиотеки стороннего служебного кода программист должен писать больше кода вручную, поэтому он менее продуктивен.

    Даже игнорируя тот факт, что большинство сценариев оболочки полагаются на внешние программы, обычно написанные на C для выполнения чего-либо полезного, есть накладные расходы всех этих pipe () fork () exec () цепочки вызовов. Этот шаблон довольно эффективен в Unix по сравнению с IPC и запуском процесса в других операционных системах, но здесь он эффективно заменяет то, что вы делали бы с вызовом подпрограммы на другом языке сценариев, который еще более эффективен. Это серьезно ограничивает верхний предел скорости выполнения сценария оболочки.

  5. Сценарии оболочки имеют мало встроенных возможностей для увеличения производительности за счет параллельного выполнения.

    Оболочки Борна для этого имеют и , wait и конвейеры, но это в основном полезно только для составления нескольких программ, а не для достижения параллелизма ЦП или ввода-вывода.Вы вряд ли сможете привязать ядра или заполнить RAID-массив исключительно сценариями оболочки, и если вы это сделаете, вы, вероятно, сможете добиться гораздо более высокой производительности на других языках.

    Конвейеры, в частности, являются слабым способом повышения производительности за счет параллельного выполнения.Он позволяет запускать только две программы параллельно, и одна из двух, вероятно, будет заблокирована при вводе-выводе или от другой в любой момент времени.

    Есть современные способы решения этой проблемы, такие как xargs -P и GNU parallel , но это просто переходит к пункту 4 выше.

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

  6. Языки сценариев оболочки не имеют указателей или ссылок .

    Это мешает вам делать кучу вещей, которые легко сделать на других языках программирования.

    Во-первых, невозможность косвенно ссылаться на другую структуру данных в памяти программы означает, что вы ограничены встроенными структурами данных . В вашей оболочке могут быть ассоциативные массивы , но как они реализованы? Есть несколько возможностей, каждая с разными компромиссами: красно-черные деревья , AVL-деревья и хеш-таблицы являются наиболее распространенными, но есть и другие. Если вам нужен другой набор компромиссов, вы застряли, потому что без ссылок у вас нет возможности вручную изменять многие типы расширенных структур данных. Вы застряли в том, что вам дали.

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

    Расширенные структуры данных - это всего лишь одно из применений указателей и ссылок. Для них существует куча других приложений , которые просто не могут быть выполнены на языке сценариев оболочки семейства Борнов.

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

Это огромное преимущество, которое в некоторых случаях может компенсировать посредственность самого языка.

Конечно, и именно поэтому GNU Autoconf использует специально ограниченное подмножество языков сценариев оболочки Bourne для своих выходных данных сценария configure : так что его сценарии configure будут выполняться почти везде.

Вы, вероятно, не найдете большей группы сторонников полезности написания на высокопереносимом диалекте оболочки Борна, чем разработчики GNU Autoconf, однако их собственное творение написано в основном на Perl, плюс некоторые m4 и только немного сценария оболочки; только вывод Autoconf представляет собой чистый сценарий оболочки Борна. Если это не поднимает вопрос о том, насколько полезна концепция «Борна повсюду», я не знаю, что будет.

Итак, есть ли предел тому, насколько сложными могут быть такие программы?

С технической точки зрения, нет, как подсказывает ваше наблюдение полноты по Тьюрингу.

Но это не то же самое, что сказать, что сценарии оболочки произвольно большого размера приятно писать, легко отлаживать или быстро выполнять.

Можно ли написать, скажем, компрессор / распаковщик файлов на чистом bash?

«Чистый» Bash, без каких-либо обращений к объектам в PATH ? Компрессор, вероятно, можно выполнить, используя эхо и escape-последовательности шестнадцатеричного кода, но это было бы довольно болезненно. Декомпрессор может быть невозможно записать таким образом из-за неспособности обрабатывать двоичные данные в оболочке . В конечном итоге вам придется обратиться к od и тому подобное, чтобы преобразовать двоичные данные в текстовый формат, собственный способ обработки данных оболочкой.

Как только вы начнете говорить об использовании сценариев оболочки, как это было задумано, в качестве связующего звена для управления другими программами в ПУТИ , двери открываются, потому что теперь вы ограничены только тем, что можно сделать на других языках программирования, то есть у вас вообще нет ограничений.Сценарий оболочки, который получает всю свою мощь, вызывая другие программы в PATH , работает не так быстро, как монолитные программы, написанные на более мощных языках, но он работает .

И в этом суть. Если вам нужно, чтобы программа работала быстро или если она должна быть мощной сама по себе, а не заимствовать власть у других, вы не пишете ее в оболочке.

Простая видеоигра?

Вот Тетрис в оболочке . Есть и другие подобные игры, если поискать.

есть только очень ограниченные инструменты отладки

Я бы поставил поддержку инструментов отладки примерно на 20-е место в списке функций, необходимых для поддержки программирования в целом. Многие программисты гораздо больше полагаются на printf () отладку , чем на правильные отладчики, независимо от языка.

В оболочке у вас есть echo и set -x , которых вместе достаточно для отладки большого количества проблем.

0
21.11.2013, 00:52
0 ответов

Теги

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