Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

GoTo ( goto , GOTO , GO TO или другие комбинации регистров, в зависимости от языка программирования) - это выражение, встречающееся во многих языках программирования . Он выполняет одностороннюю передачу управления другой строке кода; Напротив, вызов функции обычно возвращает управление. Переходные местоположения обычно идентифицируются с помощью меток , хотя в некоторых языках используются номера строк . На уровне машинного кода a goto- это форма оператора перехода или перехода , в некоторых случаях объединенная с настройкой стека. Многие языки поддерживаютgotoутверждение, а многие этого не делают (см. § языковая поддержка ).

Теорема о структурированной программе доказала, что этот gotoоператор не является необходимым для написания программ, которые могут быть выражены в виде блок-схем ; некоторая комбинация трех программных конструкций последовательности, выбора / выбора и повторения / итерации достаточна для любых вычислений, которые могут быть выполнены машиной Тьюринга , с оговоркой, что может потребоваться дублирование кода и дополнительные переменные. [1]

В прошлом в академических кругах и в промышленности велись серьезные дебаты по поводу достоинств использования gotoутверждений. Ранее использование goto было обычным явлением, но с появлением структурного программирования в 1960-х и 1970-х годах его использование значительно сократилось. Основная критика заключается в том, что код, в котором используются операторы goto, труднее понять, чем альтернативные конструкции. Goto по-прежнему используется в некоторых общих шаблонах использования , но обычно используются альтернативы , если они доступны. Дебаты по поводу его (более ограниченного) использования продолжаются в академических кругах и кругах разработчиков программного обеспечения.

Использование [ править ]

goto label

Оператор gotoчасто сочетается с оператором if, чтобы вызвать условную передачу управления.

IF condition THEN goto label

Языки программирования накладывают различные ограничения на назначение gotoоператора. Например, язык программирования C не допускает перехода к метке, содержащейся в другой функции [2], однако переходы в пределах одной цепочки вызовов возможны с использованием функций setjmp / longjmp .

Критика [ править ]

На встрече, предшествовавшей появлению ALGOL, состоявшейся в 1959 году, Хайнц Земанек открыто поставил под сомнение необходимость утверждений GOTO; в то время никто [ цитата ] не обратил внимания на его замечание, в том числе Эдсгер В. Дейкстра , который позже стал культовым противником GOTO. [3] В 1970-х и 1980-х годах наблюдалось снижение использования операторов GOTO в пользу парадигмы « структурированного программирования » , при этом goto критиковали за то, что приводили к «не поддерживаемому спагетти-коду » (см. Ниже). Некоторые стандарты кодирования стилей программирования , например стандарты кодирования GNU Pascal, не рекомендуют использовать операторы GOTO. [4]Доказательство Бем-Jacopini (1966) не решало вопрос о том, следует ли принять структурированное программирование для разработки программного обеспечения, отчасти потому , что строительство было более вероятно , чтобы скрыть программу , чем улучшить его , потому что его применение требует введения дополнительных локальных переменных. [5] Тем не менее, это вызвало бурную дискуссию среди компьютерных ученых, преподавателей, разработчиков языков и разработчиков приложений, которые наблюдали медленный, но неуклонный отход от ранее повсеместного использования GOTO. Вероятно, самая известная критика GOTO - это письмо Эдсгера Дейкстры от 1968 года, озаглавленное « Перейти к заявлению, признанному вредным» . [3] [6]В этом письме Дейкстра утверждал, что неограниченные операторы GOTO следует отменить из языков более высокого уровня, поскольку они усложняют задачу анализа и проверки правильности программ (особенно тех, которые включают циклы). Само письмо вызвало дебаты, в том числе письмо «GOTO Считается вредным» Считается вредным » [7], отправленное в Коммуникации ACM (CACM) в марте 1987 года, а также дальнейшие ответы других людей, в том числе письмо Дейкстры« О в некотором разочаровании ». Переписка . [8]

Альтернативная точка зрения представлена ​​в книге Дональда Кнута « Структурированное программирование с использованием инструкций», в которой анализируется множество общих задач программирования и делается вывод о том, что в некоторых из них GOTO является оптимальной конструкцией языка для использования. [9] В Язык программирования C , Брайан Керниган и Деннис Ритчи предупреждают , что goto«бесконечно abusable», но и предполагают , что он может быть использован для отслуживших функции обработчиков ошибок и перерывов многоуровневых из петель. [10] Эти два паттерна можно найти в многочисленных последующих книгах по C других авторов; [11] [12] [13] [14]во вводном учебнике 2007 г. отмечается, что шаблон обработки ошибок - это способ обойти «отсутствие встроенной обработки исключений в языке C». [11] Другие программисты, в том числе разработчик ядра Linux и программист Линус Торвальдс или инженер-программист и автор книги Стив МакКоннелл , также возражают против точки зрения Дейкстры, заявляя, что GOTO могут быть полезной функцией языка, улучшая скорость, размер и ясность кода программы, но только при разумном использовании сравнительно разумным программистом. [15] [16] По словам профессора информатики Джона Регера , в 2013 году в коде ядра Linux было около 100 000 экземпляров goto. [17]

Другие ученые заняли более крайнюю точку зрения и утверждали, что даже инструкции, подобные breakи returnиз середины циклов, являются плохой практикой, поскольку они не нужны в результате Бема – Якопини, и, таким образом, выступали за то, чтобы циклы имели единую точку выхода. [18] Например, Бертран Мейер написал в своем учебнике 2009 года, что инструкции типа breakи continue«просто старики gotoв овечьей шкуре». [19] Слегка измененная форма результата Бема – Якопини позволяет, однако, избегать дополнительных переменных в структурном программировании, если разрешены многоуровневые разрывы циклов. [20] Поскольку некоторые языки, такие как C, не допускают многоуровневых разрывов через своиbreakключевое слово, некоторые учебники советуют программисту использовать gotoв таких обстоятельствах. [14] МИСР С 2004 стандартных запретами goto, continue, а также множественные returnи breakотчетность. [21] Издание стандарта MISRA C 2012 г. понизило gotoстатус запрета с «обязательного» до «рекомендательного»; в редакции 2012 года есть дополнительное обязательное правило, запрещающее переходы только назад, но не вперед goto. [22] [23]

FORTRAN представил конструкции структурированного программирования в 1978 году, и в последующих версиях относительно свободные семантические правила, регулирующие допустимое использование goto, были ужесточены; «расширенный диапазон», в котором программист мог использовать GOTO для входа и выхода из все еще выполняющегося цикла DO, был удален из языка в 1978 г. [24], а к 1995 г. несколько форм Fortran GOTO, включая Computed GOTO и Assigned GOTO был удален. [25] В некоторых широко используемых современных языках программирования, таких как Java и Python, отсутствует инструкция GOTO (см. Языковую поддержку), хотя большинство из них предоставляют средства для выхода из выборки, выхода или перемещенияпереходим к следующему шагу итерации. Точку зрения, что нарушение потока управления в коде нежелательно, можно увидеть в дизайне некоторых языков программирования, например, Ada [26] визуально подчеркивает определения меток с помощью угловых скобок .

Запись 17.10 в списке часто задаваемых вопросов comp.lang.c [27] решает проблему использования GOTO напрямую, заявляя

Стиль программирования, как и стиль письма, является своего рода искусством и не может быть кодифицирован жесткими правилами, хотя дискуссии о стиле часто, кажется, сосредоточены исключительно вокруг таких правил. В случае оператора goto уже давно замечено, что неограниченное использование goto быстро приводит к неудовлетворительному коду спагетти. Однако простой, бездумный запрет на оператор goto не обязательно сразу приводит к красивому программированию: неструктурированный программист так же способен построить византийский клубок без использования каких-либо goto (возможно, вместо этого заменив странно вложенные циклы и логические управляющие переменные) . Многие программисты занимают умеренную позицию: обычно следует избегать goto, но они приемлемы в некоторых ситуациях с хорошими ограничениями, если это необходимо: как многоуровневые операторы прерывания,объединить общие действия внутри оператора switch или централизовать задачи очистки в функции с несколькими возвратами ошибок. (...) Слепое избегание определенных конструкций или следование правилам без их понимания может привести к такому же количеству проблем, сколько правила должны были предотвратить. Более того, многие мнения о стиле программирования - это всего лишь мнения. Они могут быть решительно аргументированы и сильно прочувствованы, они могут быть подкреплены кажущимися убедительными доказательствами и аргументами, но противоположные мнения могут быть столь же сильно прочувствованы, поддержаны и аргументированы. Обычно бесполезно втягиваться в «войну стилей», потому что по определенным вопросам оппоненты никогда не могут прийти к согласию или согласиться не согласиться, или прекратить спорить.Слепое избегание определенных конструкций или следование правилам без их понимания может привести к тому же количеству проблем, которое правила должны были предотвратить. Более того, многие мнения о стиле программирования - это всего лишь мнения. Они могут быть решительно аргументированы и сильно прочувствованы, они могут быть подкреплены кажущимися убедительными доказательствами и аргументами, но противоположные мнения могут быть столь же сильно прочувствованы, поддержаны и аргументированы. Обычно бесполезно втягиваться в «войну стилей», потому что по определенным вопросам оппоненты никогда не могут прийти к согласию или согласиться не согласиться, или прекратить спорить.Слепое избегание определенных конструкций или следование правилам без их понимания может привести к тому же количеству проблем, которое правила должны были предотвратить. Более того, многие мнения о стиле программирования - это всего лишь мнения. Они могут быть решительно аргументированы и сильно прочувствованы, они могут быть подкреплены кажущимися убедительными доказательствами и аргументами, но противоположные мнения могут быть столь же сильно прочувствованы, поддержаны и аргументированы. Обычно бесполезно втягиваться в «войну стилей», потому что по определенным вопросам оппоненты никогда не могут прийти к согласию или согласиться не согласиться, или прекратить спорить.они могут быть подкреплены кажущимися убедительными доказательствами и аргументами, но противоположные мнения могут быть столь же сильно прочувствованы, поддержаны и аргументированы. Обычно бесполезно втягиваться в «войну стилей», потому что по определенным вопросам оппоненты никогда не могут прийти к согласию или согласиться не согласиться, или прекратить спорить.они могут быть подкреплены кажущимися убедительными доказательствами и аргументами, но противоположные мнения могут быть столь же сильно прочувствованы, поддержаны и аргументированы. Обычно бесполезно втягиваться в «войну стилей», потому что по определенным вопросам оппоненты никогда не могут прийти к согласию или согласиться не согласиться, или прекратить спорить.

Общие шаблоны использования [ править ]

В то время как общее использование gotos сокращается, на некоторых языках все еще существуют ситуации, когда goto обеспечивает самый короткий и простой способ выразить логику программы (хотя можно выразить ту же логику без goto, эквивалентный код будет длиннее и часто труднее понять). В других языках есть структурированные альтернативы, в частности исключения и хвостовые вызовы.

Ситуации, в которых часто бывает полезен goto, включают:

  • Чтобы сделать код более читаемым и понятным [28] [29]
  • Чтобы делать программы меньшего размера и избавиться от дублирования кода [28] [29]
  • Реализуйте конечный автомат , используя таблицу переходов состояний и goto для переключения между состояниями (при отсутствии исключения хвостового вызова ), особенно в автоматически сгенерированном коде C. [30] Например, goto в каноническом парсере LR .
  • Реализация многоуровневого прерывания и продолжения, если это напрямую не поддерживается в языке; это обычная идиома в C. [14] Хотя Java резервирует ключевое слово goto, на самом деле она не реализует его. Вместо этого в Java реализованы операторы с метками break и continue. [31] Согласно документации Java, использование goto для многоуровневых разрывов было наиболее распространенным (90%) использованием gotos в C. [32] Java не был первым языком, который использовал этот подход - запрещающий goto, но обеспечение многоуровневых перерывов - в этом отношении ему предшествовал язык программирования BLISS (точнее его версия BLISS-11). [33] : 960–965
  • Суррогаты для одноуровневых операторов break или continue (retry), когда возможное введение дополнительных циклов может неправильно повлиять на поток управления. Такая практика наблюдалась в коде Netbsd . [34]
  • Обработка ошибок (при отсутствии исключений), особенно кода очистки, такого как освобождение ресурсов. [11] [14] [34] [30] [35] C ++ предлагает альтернативу оператору goto для этого варианта использования, а именно: получение ресурсов - это инициализация (RAII) с помощью деструкторов или использования исключений try and catch, используемых при обработке исключений. . [36] setjmp и longjmp - еще одна альтернатива, и их преимущество состоит в том, что они могут раскручивать часть стека вызовов .
  • вставка стека, например, в Algol, PL / I.

Эти варианты использования относительно распространены в C, но гораздо реже в C ++ или других языках с функциями более высокого уровня. [35] Однако генерирование и перехват исключения внутри функции может быть чрезвычайно неэффективным в некоторых языках; Ярким примером является Objective-C , где goto - гораздо более быстрая альтернатива. [37]

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

Альтернативы [ править ]

Структурированное программирование [ править ]

Современное понятие подпрограммы было изобретено Дэвидом Уилером при программировании EDSAC . [38] Чтобы реализовать вызов и возврат на машине без стека, он использовал специальный шаблон самомодифицирующегося кода, известный как прыжок Уиллера. [39] Это привело к способности структурировать программы, используя хорошо вложенные исполнения подпрограмм, взятых из библиотеки. Это было бы невозможно при использовании только goto, поскольку целевой код, взятый из библиотеки, не знал бы, куда вернуться.

Позже языки высокого уровня, такие как Паскаль, были разработаны для поддержки структурного программирования , которое обобщалось от подпрограмм (также известных как процедуры или функции) до дополнительных структур управления, таких как:

  • Циклы с использованием операторов while, repeat untilилиdo , иfor
  • switchака caseоператоры, форма многостороннего ветвления

Эти новые языковые механизмы заменили эквивалентные потоки, которые ранее писались с использованием gotos и ifs. Многостороннее ветвление заменяет «вычисленный переход», в котором инструкция перехода определяется динамически (условно).

Исключения [ править ]

На практике строгое следование базовому трехструктурному шаблону структурированного программирования приводит к сильно вложенному коду из-за невозможности преждевременно выйти из структурированного модуля и к комбинаторному взрыву с довольно сложными данными о состоянии программы для обработки всех возможных условий.

Обычно были приняты два решения: способ преждевременного выхода из структурированного модуля и, в более общем смысле, исключения - в обоих случаях они поднимаются по структуре, возвращая управление охватывающим блокам или функциям, но не переходят к произвольным участкам кода. Это аналогично использованию оператора return в нетерминальной позиции - не строго структурировано из-за раннего выхода, но мягко ослабляет ограничения структурного программирования. В C breakи continueпозволяет завершить цикл или перейти к следующей итерации , не требуя дополнительного оператора whileили if. На некоторых языках также возможны многоуровневые перерывы. Для работы в исключительных ситуациях специализированныебыли добавлены конструкции обработки исключений , такие как try/ catch/ finallyв Java.

Механизмы обработки исключений throw-catch также могут быть легко использованы для создания непрозрачных структур управления, как и goto. [40]

Хвостовые звонки [ править ]

В документе, представленном на конференции ACM в Сиэтле в 1977 году, Гай Л. Стил резюмировал дискуссию о GOTO и структурированном программировании и заметил, что вызовы процедур в конце процедуры можно наиболее оптимально рассматривать как прямую передачу управления. в вызываемую процедуру, обычно устраняя ненужные операции манипулирования стеком. [41] Поскольку такие "хвостовые вызовы" очень распространены в Лиспе, язык, в котором вызовы процедур являются повсеместными, эта форма оптимизации значительно снижает стоимость вызова процедуры по сравнению с GOTO, используемым в других языках. Стил утверждал, что плохо реализованные вызовы процедур привели к искусственному восприятию того, что GOTO дешевле, чем вызов процедуры. Стил далее утверждал, что «в целом вызовы процедур можно с пользой рассматривать как операторы GOTO, которые также передают параметры и могут быть единообразно закодированы как инструкции JUMP машинного кода », при этом инструкции манипулирования стеком машинного кода «считаются оптимизацией (а не наоборот. !) ». [41] Стил привел доказательства того, что хорошо оптимизированные числовые алгоритмы в Лиспе могут выполняться быстрее, чем код, созданный доступными в то время коммерческими компиляторами Фортрана, потому что стоимость вызова процедуры в Лиспе была намного ниже. В Scheme , диалекте Лиспа, разработанном Стилом с Джеральдом Джеем Сассманом , оптимизация хвостового вызова является обязательной. [42]

Хотя статья Стила не представила ничего нового для информатики, по крайней мере, в том виде, в каком она практиковалась в Массачусетском технологическом институте, она пролила свет на возможности оптимизации вызова процедур, что сделало способствующие модульности качества процедур более надежной альтернативой методам. распространенные тогда привычки кодирования больших монолитных процедур со сложными структурами внутреннего контроля и обширными данными о состоянии. В частности, оптимизация хвостового вызова, обсужденная Стилом, превратила процедуру в надежный способ реализации итерации с помощью единственной хвостовой рекурсии (хвостовая рекурсия, вызывающая ту же функцию). Кроме того, оптимизация хвостового вызова позволяет взаимную рекурсию неограниченной глубины, предполагая хвостовые вызовы - это позволяет передавать управление, как в конечных автоматах., что в противном случае обычно выполняется с помощью операторов goto.

Сопрограммы [ править ]

Сопрограммы - это более радикальное ослабление структурированного программирования, позволяющее не только несколько точек выхода (как при возврате в не-хвостовой позиции), но также несколько точек входа, аналогично операторам goto. Сопрограммы более ограничены, чем goto, поскольку они могут возобновлять выполняющуюся в данный момент сопрограмму только в определенных точках - продолжая после yield - вместо того, чтобы переходить к произвольной точке кода. Ограниченная форма сопрограмм - это генераторы , которых достаточно для некоторых целей. Еще более ограниченными являются замыкания - подпрограммы, которые поддерживают состояние (через статические переменные), но не положение исполнения. Комбинация переменных состояния и структурированного управления, особенно общего оператора switch, может позволить подпрограмме возобновить выполнение в произвольной точке при последующих вызовах и является структурированной альтернативой операторам goto при отсутствии сопрограмм; это распространенная идиома, например, в Си.

Продолжение [ править ]

Продолжение похоже на GOTO в том , что он передает управление из произвольной точки в программе на ранее отмеченную точку. Продолжение более гибкое, чем GOTO на тех языках, которые его поддерживают, поскольку оно может передавать управление из текущей функции, чего GOTO не может сделать в большинстве языков структурированного программирования. В тех реализациях языка, которые поддерживают кадры стека для хранения локальных переменных и аргументов функций, выполнение продолжения включает в себя настройку стека вызовов программы в дополнение к переходу. Longjmp функция языка программирования является примером экранирующего продолжения , которые могут быть использованы , чтобы избежать текущего контекста к окружающим одному. ВОператор Common Lisp GO также имеет это свойство раскручивания стека, несмотря на лексическую область видимости конструкции , поскольку на метку, к которой нужно перейти, можно ссылаться из замыкания .

В Scheme при желании продолжения могут даже перемещать управление из внешнего контекста во внутренний. Этот почти безграничный контроль над тем, какой код будет выполняться следующим, делает относительно легким написание сложных управляющих структур, таких как сопрограммы и совместная многозадачность. [43]

Передача сообщений [ править ]

В непроцедурных парадигмах goto менее актуален или полностью отсутствует. Одна из основных альтернатив - передача сообщений , что особенно важно при параллельных вычислениях , межпроцессном взаимодействии и объектно-ориентированном программировании . В этих случаях отдельные компоненты не имеют произвольной передачи управления, но общее управление может быть запланировано сложным образом, например, посредством приоритетного прерывания . Влиятельные языки Simula и Smalltalk были одними из первых, кто ввел концепции сообщений и объектов. По инкапсуляции данных состояния, объектно-ориентированное программирование снижение сложности программного обеспечения до взаимодействий (сообщений) между объектами.

Варианты [ править ]

В классе операторов goto есть несколько различных языковых конструкций .

Вычисленный GOTO и назначенный GOTO [ править ]

В Fortran , вычисленыGOTO прыжки к одному из нескольких меток в списке, на основе значения выражения. Пример такой goto (20,30,40) i. Эквивалентная конструкция в C - это оператор switch, а в более новом Fortran CASEрекомендуется использовать синтаксическую альтернативу. [44] BASIC имеет ON ... GOTOконструкцию, которая достигает той же цели. [45]

В версиях, предшествующих Fortran 95, Fortran также имел назначенный вариант goto, который передает управление метке оператора (номеру строки), которая хранится (присваивается) целочисленной переменной. К сожалению, переход к целочисленной переменной, которой не было присвоено значение, был возможен и был основным источником ошибок, связанных с назначенными gotos. [46] Оператор Fortran assignпозволяет присвоить целочисленной переменной только постоянный (существующий) номер строки. Однако впоследствии можно было случайно обработать эту переменную как целое число, например, увеличить ее, что привело к неопределенному поведению во gotoвремени. Следующий код демонстрирует поведение, goto iкогда строка i не указана: [47]

 назначить 200  для  i  i  =  i + 1  goto i  ! неопределенное поведение 200  напишите ( * , * )  «это действительный номер строки»

Некоторые компиляторы C реализуют два нестандартных расширения C / C ++, относящихся к gotos, изначально представленных gcc . [48] [49] Расширение GNU позволяет получить адрес метки внутри текущей функции в виде void*унарного оператора значения метки префикса &&. Инструкция goto также расширена для перехода к произвольному void*выражению. Это расширение C называется вычисляемым goto в документации поддерживающих его компиляторов C; его семантика является надмножеством назначенного Фортрана goto, потому что он допускает произвольные выражения указателя в качестве цели перехода, в то время как назначенный Фортран goto не допускает произвольные выражения в качестве цели перехода. [50]Как и в случае стандартного goto в C, расширение GNU C позволяет целевому объекту вычисляемого goto находиться только в текущей функции. Попытка перейти за пределы текущей функции приводит к неопределенному поведению. [50]

Некоторые варианты BASIC также поддерживают вычисляемый GOTO в том смысле, в котором он используется в GNU C, т.е. в котором целью может быть любой номер строки, а не только одна из списка. Например, в MTS BASIC можно написать, GOTO i*1000чтобы перейти к строке, пронумерованной в 1000 раз больше значения переменной i (которая может представлять, например, выбранную опцию меню). [51]

Переменные метки PL / I достигают эффекта вычисленных или присвоенных GOTOs.

ALTER [ править ]

Вплоть до стандарта ANSI COBOL 1985 года имелась команда ALTER, которая могла использоваться для изменения назначения существующего GO TO, который должен был быть в отдельном абзаце. [52] Функция, разрешающая полиморфизм , часто осуждалась и использовалась редко. [53]

Perl GOTO [ править ]

В Perl есть вариант gotoоператора, который вообще не является традиционным оператором GOTO. Он принимает имя функции и передает управление, эффективно заменяя один вызов функции другим ( хвостовой вызов ): новая функция не вернется в GOTO, а вместо этого вернется в то место, из которого была вызвана исходная функция. [54]

Эмуляция GOTO [ править ]

Есть несколько языков программирования, которые по умолчанию не поддерживают GOTO. Используя эмуляцию GOTO, все еще можно использовать GOTO на этих языках программирования, хотя и с некоторыми ограничениями. Можно эмулировать GOTO в Java, [55] JavaScript, [56] и Python. [57] [58]

Переменные ярлыков PL / I [ править ]

PL / I имеет тип данных LABEL , который можно использовать для реализации как «назначенного перехода», так и «вычисленного перехода». PL / I разрешает разветвления из текущего блока. Вызывающая процедура может передать метку в качестве аргумента вызываемой процедуре, которая затем может выйти с ветвью. Значение переменной метки включает в себя адрес кадра стека, а переход из блока выталкивает стек.

 / * Это реализует эквивалент * / / * назначенный переход * / объявить где метка; где = где-то; перейти куда; ... где-то: / * оператор * /; ...
 / * Это реализует эквивалент * / / * вычисляемый goto * / объявить где (5) метка; объявить inx фиксированным; где (1) = abc; где (2) = xyz; ... перейти где (inx); ... abc: / * инструкция * /; ... xyz: / * оператор * /; ...

MS / DOS GOTO [ править ]

Goto направляет выполнение на метку, начинающуюся с двоеточия. Целью Goto может быть переменная.

@ echo off SET  D8str = % date% SET  D8dow = % D8str: ~ 0,3%FOR  %% D в  ( понедельник, среда, пятница )  делать,  если  " %% D"  ==  " % D8dow% "  goto  SHOP %% D echo Сегодня, % D8dow% , не торговый день.перейти к  концу: SHOPMon echo купить пиццу на обед - понедельник - день пиццы.перейти к  концу: SHOPWed echo купить Кальцоне, чтобы забрать домой - сегодня среда.перейти к  концу: SHOPFri echo покупает Зельцер на тот случай, если кто-то захочет пить ноль калорий.: конец

Языковая поддержка [ править ]

Многие языки поддерживают это gotoутверждение, а многие - нет. В Java , gotoэто зарезервированное слово , но является непригодной для использования, хотя скомпилированный file.class генерирует GOTOS и ярлыки. [59] [60] Python не поддерживает goto, хотя есть несколько модулей-шуток, которые ее предоставляют. [57] [58] Там нет оператора Goto в Seed7 и скрытый GOTOS как прорывы и продолжающие-операторы также опущены. [61] В PHP не было встроенной поддержки gotoдо версии 5.3 (были доступны библиотеки для эмуляции его функциональности). [62]

В языке программирования C # есть goto. Однако он не позволяет перейти к метке за пределами текущей области видимости, что делает его значительно менее мощным и опасным, чем gotoключевое слово в других языках программирования. Он также создает метки операторов case и default , область действия которых - включающий оператор switch ; goto case или goto default часто используются в качестве явной замены неявного перехода, который запрещен в C #.

Другие языки могут иметь свои собственные отдельные ключевые слова для явных провалов, которые можно рассматривать как версию, gotoограниченную для этой конкретной цели. Например, Go использует fallthroughключевое слово и вообще не допускает неявного падения, в то время как Perl 5 использует nextдля явного падения по умолчанию, но также позволяет установить неявный провал в качестве поведения по умолчанию для модуля.

Большинство языков, в которых есть операторы goto, называют это так, но на заре компьютерных технологий использовались другие имена. Например, в MAD использовался оператор TRANSFER TO. [63] APL использует стрелку вправо для перехода.

В C есть goto, и он обычно используется в различных идиомах, как обсуждалось выше.

В Perl тоже есть gotoфункция .

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

См. Также [ править ]

  • РОДОМ ИЗ
  • Поток управления
  • ГОСУБ
  • Оператор переключения - многосторонняя ветвь (или условный переход)
  • Неструктурированное программирование
  • Считается вредным

Ссылки [ править ]

  1. ^ Дэвид Энтони Уотт; Уильям Финдли (2004). Концепции проектирования языков программирования . Джон Вили и сыновья. п. 228 . ISBN 978-0-470-85320-7.
  2. ^ «Новый стандарт C: 6.8.6.1» . c0x.coding-guidelines.com .
  3. ^ а б Дейкстра 1968 .
  4. ^ «Стандарты кодирования GNU Pascal» . www.gnu-pascal.de .
  5. ^ Кеннет Louden, Lambert (2011). Языки программирования: принципы и практика . Cengage Learning. п. 422 . ISBN 978-1-111-52941-3.
  6. ^ «EWD 215: Дело против заявления GO TO» (PDF) .
  7. Франк Рубин (март 1987 г.). " " GOTO Считается вредным "Считается вредным" (PDF) . Коммуникации ACM . 30 (3): 195–196. DOI : 10.1145 / 214748.315722 . Архивировано из оригинального (PDF) 20 марта 2009 года.
  8. ^ Дейкстра, Эдсгер В. О несколько разочаровывающей переписке (EWD-1009) (PDF) . EW Dijkstra Archive. Центр американской истории Техасского университета в Остине . ( транскрипция ) (май, 1987)
  9. ^ Дональд Кнут (1974). «Структурированное программирование с использованием операторов перехода» (PDF) . Вычислительные обзоры . 6 (4): 261–301. CiteSeerX 10.1.1.103.6084 . DOI : 10.1145 / 356635.356640 .  
  10. ^ Брайан В. Керниган; Деннис Ричи (1988). Язык программирования C (2-е изд.). Прентис Холл. С.  60–61 . ISBN 978-0-13-308621-8.
  11. ^ a b c Майкл А. Вайн (2007). Программирование на C для абсолютного новичка . Cengage Learning. п. 262. ISBN. 978-1-59863-634-5.
  12. ^ Сандра Гейслер (2011). C Универсальный настольный справочник для чайников . Джон Вили и сыновья. С. 217–220. ISBN 978-1-118-05424-6.
  13. ^ Стивен Прата (2013). C Primer Plus . Эддисон-Уэсли. С. 287–289. ISBN 978-0-13-343238-1.
  14. ^ a b c d Сартадж Сахни; Роберт Ф. Чмелик; Боб Чмелик (1995). Разработка программного обеспечения в C . Silicon Press. п. 135. ISBN 978-0-929306-16-2.
  15. ^ "Архивная копия" . Архивировано из оригинала на 2010-02-14 . Проверено 30 января 2010 .CS1 maint: заархивированная копия как заголовок ( ссылка )
  16. ^ «Код завершен, первое издание» . Stevemcconnell.com . Проверено 22 июля 2014 .
  17. ^ «Использование Goto в системном коде - встроено в академию» . blog.regehr.org .
  18. ^ Робертс, Э. [1995] «Выходы из цикла и структурированное программирование: возобновление дискуссии», Бюллетень ACM SIGCSE, (27) 1: 268–272.
  19. ^ Бертран Мейер (2009). Touch of Class: Учимся хорошо программировать с объектами и контрактами . Springer Science & Business Media. п. 189. ISBN. 978-3-540-92144-8.
  20. ^ Декстер Козен и Вей-Лунг Дастин Ценг (2008). Теорема Бёма – Якопини неверна, пропозиционально (PDF) . Мпк 2008 . Конспект лекций по информатике. 5133 . С. 177–192. CiteSeerX 10.1.1.218.9241 . DOI : 10.1007 / 978-3-540-70594-9_11 . ISBN   978-3-540-70593-2.
  21. ^ "Почему" продолжить "считается нарушением C в MISRA C: 2004?" . Переполнение стека. 2012-06-11 . Проверено 22 июля 2014 .
  22. ^ Марк Питчфорд; Крис Тэпп (25 февраля 2013 г.). «MISRA C: 2012: множество веских причин для перемен» . Электронный дизайн . Проверено 22 июля 2014 .
  23. ^ Том Уильямс (март 2013). «Правила проверки для C: обеспечение надежности и безопасности» . Журнал RTC . Проверено 22 июля 2014 .
  24. ^ ANSI X3.9-1978. Американский национальный стандарт - язык программирования FORTRAN. Американский национальный институт стандартов. Также известен как ISO 1539-1980, неофициально известный как FORTRAN 77.
  25. ^ ISO / IEC 1539-1: 1997. Информационные технологии - Языки программирования - Фортран - Часть 1: Базовый язык. Неофициально известен как Fortran 95. Этот стандарт состоит еще из двух частей. Часть 1 официально принята ANSI.
  26. ^ Джон Барнс (30.06.2006). Программирование на Аде 2005 . Эддисон Уэсли . п. 114–115. ISBN 978-0-321-34078-8.
  27. ^ «Вопрос 17.10» . C-faq.com . Проверено 22 июля 2014 .
  28. ^ a b «Linux: Использование goto в коде ядра» . 28 ноября 2005 года Архивировано из оригинала 28 ноября 2005 года.
  29. ^ a b https://www.kernel.org/doc/Documentation/CodingStyle
  30. ^ a b Хорошее использование goto , Саймон Козенс
  31. ^ «Ветвящиеся операторы (Учебники Java ™> Изучение языка Java> Основы языка)» . Docs.oracle.com. 2012-02-28 . Проверено 22 июля 2014 .
  32. ^ «Среда языка Java» . Oracle.com . Проверено 22 июля 2014 .
  33. ^ Брендер, Рональд Ф. (2002). «Язык программирования BLISS: история» (PDF) . Программное обеспечение: практика и опыт . 32 (10): 955–981. DOI : 10.1002 / spe.470 .
  34. ^ a b Диомидис Спинеллис (27 мая 2003 г.). Чтение кода: перспектива открытого исходного кода . Эддисон-Уэсли Профессионал. С. 43–44. ISBN 978-0-672-33370-5.
  35. ^ a b Когда использовать Goto при программировании на C , Алекс Аллен
  36. ^ «Основной доклад первого дня - Бьярн Страуструп: стиль C ++ 11 | GoingNative 2012 | Channel 9» . Channel9.msdn.com. 2012-02-02 . Проверено 22 июля 2014 .
  37. ^ Дэвид Chisnall (2012). Разговорник Objective-C . Эддисон-Уэсли Профессионал. п. 249 . ISBN 978-0-321-81375-6.
  38. ^ «Дэвид Дж. Уиллер • Компьютерное общество IEEE» . www.computer.org .
  39. ^ Уилкс, М. В.; Уиллер, диджей; Гилл, С. (1951). Подготовка программ для ЭЦП . Эддисон-Уэсли.
  40. ^ J. Siedersleben (2006). «Ошибки и исключения - права и обязанности». В Кристофе Дони (ред.). Расширенные темы в методах обработки исключений . Springer Science & Business Media. п. 277 . ISBN 978-3-540-37443-5.
  41. ^ a b Гай Льюис Стил-младший. «Разоблачение мифа о« дорогостоящем вызове процедур »или реализации вызова процедур, признанных вредными, или лямбда: окончательный GOTO». MIT AI Lab. Записка AI Lab AIM-443. Октябрь 1977 г.
  42. ^ R5RS Разд. 3,5, Ричард Келси; Уильям Клингер; Джонатан Рис; и другие. (Август 1998 г.). «Пересмотренный отчет 5 по алгоритмической языковой схеме» . Вычисление высшего порядка и символическое вычисление . 3 (1): 7–105. DOI : 10,1023 / A: 1010051815785 .
  43. ^ "Пересмотренный отчет ^ 5 по алгоритмической языковой схеме" . schemers.org .
  44. ^ "Вычисленное заявление GOTO (устаревшее)" . Lahey.com. Архивировано из оригинала на 2016-05-26 . Проверено 22 июля 2014 .
  45. ^ «Microsoft QuickBASIC: ON ... GOSUB, ON ... GOTO Statements QuickSCREEN» . Microsoft . 1988 . Проверено 3 июля 2008 .
  46. ^ http://www.personal.psu.edu/jhm/f90/statements/goto_a.html
  47. ^ «НАЗНАЧЕНИЕ - присвоение метки» . Software.intel.com . Проверено 22 июля 2014 .
  48. ^ Вычисленный goto , компилятор IBM XL C / C ++
  49. ^ «Список исправлений компиляторов Intel® Composer XE 2013 SP1 | Зона разработчиков Intel®» . Software.intel.com. 2013-08-12 . Проверено 22 июля 2014 .
  50. ^ a b «Ярлыки как значения - Использование коллекции компилятора GNU (GCC)» . Gcc.gnu.org . Проверено 22 июля 2014 .
  51. ^ Вычислительный центр Мичиганского университета (сентябрь 1974 г.). МТС, Мичиганская Терминальная Система . Библиотеки UM. п. 226. УОМ: 39015034770076.
  52. ^ Справочное руководство HP COBOL II / XL , «Оператор ALTER является устаревшей функцией стандарта ANSI COBOL 1985 года».
  53. ^ Ван кисточка, Денни (8 июля 2004). «История этикеток в языках программирования» . Проверено 4 января 2011 года .
  54. ^ Goto , из руководства perl.syn (синтаксис Perl)
  55. ^ "GOTO для Java" . стейк . 6 июля 2009 года Архивировано из оригинального 15 июня 2012 года . Проверено 28 апреля 2012 года .
  56. ^ Секстон, Алекс. "Лето Гото | Официальный дом Goto.js" . Проверено 28 апреля 2012 года .
  57. ^ a b Хиндл, Ричи (1 апреля 2004 г.). "goto для Python" . Entrian Solutions . Хартфорд, Великобритания: Entrian Solutions Ltd . Проверено 28 апреля 2012 года . Модуль 'goto' был первоапрельской шуткой, опубликованной 1 апреля 2004 года. Да, он работает, но тем не менее это шутка. Пожалуйста, не используйте это в реальном коде!
  58. ^ a b snoack (19 сентября 2015 г.). "snoack / python-goto: декоратор функции, который переписывает байт-код, чтобы включить goto в Python" . Проверено 24 февраля 2017 года .
  59. ^ «Спецификация языка Java, третье издание» . Ключевые слова const и goto зарезервированы, хотя в настоящее время они не используются. Это может позволить компилятору Java создавать более качественные сообщения об ошибках, если эти ключевые слова C ++ неправильно появляются в программах.
  60. ^ «Спецификация языка Java, третье издание» . В отличие от C и C ++, в языке программирования Java нет оператора goto; метки операторов идентификатора используются с операторами break (§14.15) или continue (§14.16), появляющимися в любом месте помеченного оператора.
  61. ^ "Руководство Seed7" . Томас Мертес . Проверено 19 сентября 2019 .
  62. ^ "goto - Руководство" . PHP . Проверено 22 июля 2014 .
  63. ^ Бернард А. Галлер, Язык компьютеров , Мичиганский университет, Макгроу-Хилл, 1962; страницы 26-28, 197, 211.
  • Дейкстра, Эдсгер В. (март 1968 г.). «Письма в редакцию: перейти к заявлению, признанному вредным» (PDF) . Коммуникации ACM . 11 (3): 147–148. DOI : 10.1145 / 362929.362947 .
  • Рамшоу, Л. (1988). «Устранение перебоев при сохранении структуры программы». Журнал ACM . 35 (4): 893–920. DOI : 10.1145 / 48014.48021 .
  • https://golang.org/ref/spec#Fallthrough_statements
  • http://web.engr.uky.edu/~elias/tutorials/perldoc-html/Switch.html#Allowing-fall-through