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

Почему существует "до"?

Есть ли причина, по которой команда until была реализована в bash/shell (я все еще не уверен, что)? Есть ли что-нибудь, что вы не можете сделать с отрицанием в инструкции while? Это быстрее, чем использование функции CPU NOT? - маловероятно...

4b9b3361

Ответ 1

Bash поддерживает его, потому что он соответствует POSIX - в частности, IEEE Std 1003.1, 2004 Edition - командный язык командной строки - до циклa > , Функция предшествует GNU, а GNU bash repo имеет с момента первого фиксации 21 год назад.

Как объясняет Гийом в другом ответе, обоснование этой функции было (ошибочная попытка) читать. Они пытались микроуровне здесь, потому что язык оболочки был первоначально нацелен на конечных пользователей, а не на профессиональных программистов (например, BASIC и SQL).

Однако такой избыточный синтаксис, который делает то же самое при одной и той же сложности кода , оказался больше проблем, чем стоит: путем предоставления двух, а не одного, канонические формы для конструкции запаса, это фактически ухудшало читаемость, а не улучшало ее, и вводило ненужные решения сделать 1. Именно поэтому он присутствует только на нескольких языках, разработанных в то время, а также предназначен для "близких к естественному языку" - таких как Perl и Visual Basic.

В настоящее время этот подход превратился в концепцию синтаксиса сахара

2 Я сужу термин здесь, потому что я выражаю вещи с точки зрения дизайнера языка. Это скорее "то, что сейчас считается хорошим синтаксическим сахаром". Поскольку из конструктора языка POV никаких других SS фактически не существует.

Ответ 2

Все, что вы можете сделать с until, можно сделать с помощью while. Благодаря этой "оптимизации" ваш код может быть на 1 символ короче, а некоторые переводчики могут быть немного быстрее, но это было бы смехотворно незначительно по сравнению с остальным кодом.

Насколько я знаю, это утверждение в основном существует, потому что некоторые языки имеют его, поэтому его немного легче переносить с языка на bash. Но на сегодняшний день (2017) я думаю, что подавляющее большинство языков поддерживает оператор while и очень мало поддержки until. Я бы рекомендовал использовать исключительно while, чтобы другие программисты, которые читали ваш код, не теряли времени, спрашивая себя, что делает until.

Не говоря уже о том, что некоторые языки имеют оператор until, который выполняется в конце цикла (вместо начала), что может вызвать много лишней путаницы.

Ответ 3

Причиной такого утверждения является не столько технический (действительно, инвертированный while будет иметь то же значение), но и семантический.

until (condition) {do something}

может быть ближе к естественному языку, чем

while (not condition) {do something}

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

while (not not_connected) {} против until (not_connected) {}.