Является ли bash интерпретируемым языком?
Из того, что я читал до сих пор, bash, кажется, соответствует определению интерпретируемого языка:
- это не скомпилировано в более низкий формат
- каждый оператор в конечном итоге вызывает подпрограмму / набор подпрограмм, уже переведенных в машинный код (т.е.
echo foo
вызывает предварительно скомпилированный исполняемый файл) - сам переводчик,
bash
, уже скомпилировано
Тем не менее, я не смог найти ссылку на bash на странице Википедии для интерпретируемых языков или в результате расширенного поиска в Google. Я также нашел страницу на бирже программистов, которая, кажется, подразумевает, что bash не является интерпретируемым языком - если это не так, то что это?
3 ответа
Bash определенно интерпретируется; Я не думаю, что есть какой-то разумный вопрос по этому поводу.
Там могут быть некоторые споры о том, является ли это язык. Он предназначен в основном для интерактивного использования, выполнения команд, предоставляемых операционной системой. Для многих видов использования, если вы просто набираете такие команды, как
echo hello
или же
cp foo.txt bar.txt
Легко думать, что это "просто" для выполнения простых команд. В этом смысле он сильно отличается от интерпретируемых языков, таких как Perl и Python, которые, хотя и могут использоваться в интерактивном режиме, в основном используются для написания скриптов (интерпретируемых программ).
Одним из следствий этого акцента является то, что его дизайн оптимизирован для интерактивного использования. Строки не требуют кавычек, большинство команд выполняются сразу после ввода, большинство вещей, которые вы делаете с ним, будут вызывать внешние программы, а не встроенные функции и т. Д.
Но, как мы знаем, также можно писать сценарии с использованием bash, и bash имеет много функций, особенно конструкций управления потоком, которые в основном предназначены для использования в сценариях (хотя их также можно использовать в командной строке).
Другое отличие bash от многих языков сценариев заключается в том, что сценарий bash читается, анализируется и выполняется по порядку. Синтаксическая ошибка в середине bash-скрипта не будет обнаружена, пока выполнение не достигнет ее. Сценарий Perl или Python, напротив, полностью анализируется перед началом выполнения. (Вещи как eval
может изменить это, но общая идея верна.) Это существенная разница, но она не обозначает четкую разделительную линию. Во всяком случае, это делает Perl и Python более похожими на скомпилированные языки.
Итог: да, bash - это интерпретируемый язык. Или, точнее говоря, bash является интерпретатором интерпретируемого языка. (Название "bash" обычно относится к оболочке / интерпретатору, а не к языку, который он интерпретирует.) Он имеет некоторые существенные отличия от других интерпретируемых языков, которые были разработаны с самого начала для сценариев, но этих различий недостаточно для удаления это из разряда "переводимые языки".
Bash является переводчиком в соответствии с GNU Bash Reference Manual:
Bash - это оболочка или интерпретатор командного языка для операционной системы GNU.
Этот ответ дополняет ответ Кейта Томпсона , которому я оставляю непосредственные практические проблемы.
В целом я бы сказал, что полезнее спросить: «Насколько хорош X как язык для целей Y?» скорее «должны ли мы классифицировать X как язык Y?» или «в какой степени X вообще является языком?».
Даже без каких-либо более продвинутых функций сценариев Bash и семантики, подобной языку программирования, Bash на 100% является языком, как и любой возможный интерфейс командной строки, а также буквально каждый интерфейс , даже физический. Это могут быть языки, которые настолько просты, что у вас даже нет механизма для построения выражений, содержащих более одного термина, но мы вполне можем рассуждать о них так, как если бы они были языками. Любой ввод или действие, на которое реагирует машина, можно смоделировать как машину, «распознающую» входные «токены», точно так же, как конечный автомат или машину Тьюринга, и использующую это распознавание для изменения какого-то внутреннего состояния. «Нажатие» некоторых механических кнопок может навсегда изменить их состояние после того, как вы перестали их нажимать, в то время как другие кнопки могут потребовать, чтобы вы их удерживали, и все, что они контролируют, снова возвращается, когда вы отпускаете кнопку - они реагируют на это «отпускание». ввод, который игнорируются предыдущими кнопками. Поворотный кодовый замок распознает определенные последовательные входы; велосипедный замок ожидает параллельного распознавания определенных входных сигналов (которые можно моделировать последовательно). Bash принадлежит к полному по Тьюрингу классу языков, поэтому по любым объективным меркам это такой же «язык программирования», как и любой другой — единственное интересное, что мы можем о нем сказать, касается его дизайна и эргономики: «насколько он прост делать что-то так или иначе?"
Баш — это язык; это просто дерьмо , потому что его синтаксис и семантика (правила оценки) непоследовательны и излишне сложны, что является результатом сочетания некомпетентности и попыток сделать две совершенно разные вещи с одним и тем же интерфейсом. Теперь мы все прокляты за то, что говорим на его неуклюжем языке, пока вынуждены жить в этой унаследованной башне из пластырей и клейкой ленты, которая представляет собой современный компьютерный стек.