stringtranslate.com

Идти к

Клавиша « GOTO » на домашнем компьютере ZX Spectrum 1982 года , реализованная на родном языке BASIC (ввод команд одной клавишей).

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

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

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

Применение

goto label

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

IF condition THEN goto label

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

Критика

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

Альтернативная точка зрения представлена ​​в книге Дональда Кнута « Структурное программирование с переходом к операторам» , в которой анализируются многие распространенные задачи программирования и обнаруживается, что в некоторых из них GOTO является оптимальной языковой конструкцией для использования. [9] В книге «Язык программирования C» Брайан Керниган и Деннис Ритчи предупреждают, что gotoэто «бесконечное злоупотребление», но также предполагают, что его можно использовать для обработчиков ошибок конца функции и для многоуровневых выходов из циклов. [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] Стандарт MISRA C 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 ПЕРЕЙДИТЕ, был удален. [25] В некоторых широко используемых современных языках программирования, таких как Java и Python, отсутствует оператор GOTO (см. языковую поддержку), хотя большинство из них предоставляют некоторые средства выхода из выбора или выхода из него или перехода к следующему шагу итерации. . Точку зрения, что нарушение потока управления в коде нежелательно, можно увидеть в дизайне некоторых языков программирования, например, Ада [26] визуально подчеркивает определения меток с помощью угловых скобок .

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

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

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

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

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

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

Другое использование операторов перехода — модификация плохо факторизованного устаревшего кода , где отказ от перехода потребует обширного рефакторинга или дублирования кода . Например, для большой функции, где интерес представляет только определенный код, оператор goto позволяет перейти только к соответствующему коду или обратно, не изменяя функцию иным образом. Такое использование считается запахом кода [38] , но находит применение время от времени.

Альтернативы

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

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

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

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

При определенных условиях можно исключить локальные операторы перехода к устаревшим программам, заменив их операторами выхода из многоуровневого цикла. [40]

Исключения

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

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

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

Хвостовые вызовы

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

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

Сопрограммы

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

Продолжение

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

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

Передача сообщений

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

Вариации

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

.mw-parser-output .vanchor>:target~.vanchor-text{background-color:#b1d2ff}Вычисление GOTO иНазначено ПЕРЕЙТИ

В Фортране вычисляется переходGOTO к одной из нескольких меток в списке в зависимости от значения выражения. Пример goto (20,30,40) i: . [44] Эквивалентной конструкцией в C является оператор переключения , а в более новых версиях Фортрана такая SELECT CASEконструкция является рекомендуемой синтаксической альтернативой. [45] В BASIC был 'On GoTo'оператор, преследующий ту же цель, но в Visual Basic эта конструкция больше не поддерживается. [46]

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

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

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

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

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

ИЗМЕНИТЬ

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

Перл ПЕРЕХОДИТЬ

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

Эмулируемый ПЕРЕЙТИ

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

PL/I метки переменных

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

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

Более простой способ получить эквивалентный результат — использовать массив констант меток , который даже не требует явного объявления переменной типа LABEL :

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

MS/DOS ПЕРЕЙТИ К

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

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

Языковая поддержка

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

C# и Visual Basic .NET поддерживают goto. [61] [62] Однако он не позволяет переходить к метке за пределами текущей области видимости и учитывает удаление объектов и, наконец, конструкции, что делает его значительно менее мощным и опасным, чем gotoключевое слово в других языках программирования. Он также создает метки операторов case и default , областью действия которых является включающий оператор switch ; goto case или goto default часто используются как явная замена неявного провала, что запрещено C#.

В языке программирования PL /I имеется оператор GOTO, который разворачивает стек для передачи из блока и не позволяет осуществлять переход в блок из-за его пределов.

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

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

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

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

Смотрите также

Примечания

  1. ^ Ватт и Финдли 2004.
  2. ^ Керниган и Ричи 1988, стр. 224, A9.6 Операторы перехода.
  3. ^ Аб Дейкстра 1968.
  4. ^ Команда разработчиков GNU Pascal, 2005, 5.1 Различные советы по программированию на Pascal.
  5. ^ Лауден и Ламберт 2012.
  6. ^ «Необузданное использование оператора goto приводит к тому, что становится ужасно трудно найти значимый набор координат, в которых можно описать ход процесса. ... Оператор goto в его нынешнем виде слишком примитивен. , это слишком сильное приглашение испортить свою программу».
  7. ^ Рубин 1987.
  8. ^ Дейкстра, Эдсгер В. О несколько разочаровывающей переписке (EWD-1009) (PDF) . Архив Э. В. Дейкстры. Центр американской истории Техасского университета в Остине .(транскрипция) (май 1987 г.)
  9. ^ Кнут 1974.
  10. ^ Керниган и Ричи 1988, стр. 65–66, 3.8 Goto и Labels.
  11. ^ abc Vine 2007, с. 262.
  12. ^ Гейслер 2011.
  13. ^ Прата 2013.
  14. ^ abcd Сахни и Цмелик 1995.
  15. ^ abc Эндрюс 2003.
  16. ^ МакКоннелл 2004.
  17. ^ Регер 2013.
  18. ^ Робертс 1995.
  19. ^ Мейер 2009.
  20. ^ Козен и Ценг 2008.
  21. ^ Вопросы о переполнении стека, 2012 г.
  22. ^ Питчфорд и Тэпп 2013.
  23. ^ Уильямс 2013.
  24. ^ ANSI X3.9-1978. Американский национальный стандарт – язык программирования FORTRAN. Американский национальный институт стандартов. Также известен как ISO 1539-1980, неофициально известный как FORTRAN 77.
  25. ^ ИСО/МЭК 1539-1:1997. Информационные технологии – Языки программирования – Фортран – Часть 1: Базовый язык. Неофициально известный как Фортран 95. Этот стандарт состоит из еще двух частей. Часть 1 была официально принята ANSI.
  26. ^ Барнс 2006.
  27. ^ Саммит 1995 года.
  28. ^ аб Торвальдс 2016.
  29. ^ аб Козенс 2004.
  30. ^ Учебник по Java 2012.
  31. ^ Гослинг и МакГилтон 1996.
  32. ^ Брендер 2002, стр. 960–965.
  33. ^ аб Спинеллис 2003.
  34. ^ аб Аллен 2019.
  35. ^ Страуструп 2012.
  36. Хоад, Натан (28 июля 2022 г.). "nathanhoad/godot_dialogue_manager". Гитхаб . Проверено 3 февраля 2023 г.
  37. ^ Чисналл 2012.
  38. ^ Контьери 2021.
  39. ^ Уилкс, Уилер и Гилл 1951.
  40. ^ Рамшоу 1988.
  41. ^ Сидерслебен 2006.
  42. ^ аб Стил 1977.
  43. ^ аб Келси, Клингер и Рис 1998.
  44. ^ , что означает, что программа переходит к метке 20, 30 или 40, в случае, если i меньше, равно или больше нуля.
  45. ^ Lahey Computer Systems, Inc 2004.
  46. ^ Microsoft 2021.
  47. ^ Вер 1997.
  48. ^ z/OS 2.5.0 в документации IBM 2021.
  49. ^ ab GCC, Коллекция компиляторов GNU 2021.
  50. ^ Фрончак и Любберс 1974, с. 226.
  51. ^ Оператор ALTER был признан устаревшим в стандарте COBOL 1985 года и удален в 2002 году; см. COBOL > Самоизменяющийся код.
  52. ^ Ван Тассель 2004.
  53. ^ Руководство по синтаксису Perl, 2021 г.
  54. ^ ПЕРЕЙДИТЕ к Java 2009.
  55. ^ Секстон 2012.
  56. ^ аб Хиндл 2004.
  57. ^ Аб Ноак и др. 2015.
  58. ^ Гослинг и др. (2005) В отличие от C и C++, язык программирования Java не имеет оператора перехода; Метки операторов-идентификаторов используются с операторами прерывания (§14.15) или продолжения (§14.16), появляющимися в любом месте внутри помеченного оператора. Ключевые слова const и goto зарезервированы, хотя в настоящее время они не используются. Это может позволить компилятору Java выдавать более точные сообщения об ошибках, если эти ключевые слова C++ неправильно отображаются в программах.
  59. ^ Руководство по языку программирования Seed7 2021.
  60. ^ Руководство по PHP 2021.
  61. ^ Вагнер 2021.
  62. ^ «Заявление GoTo — Visual Basic | Microsoft Learn» . Microsoft Learn . 15 сентября 2021 г. Проверено 25 сентября 2023 г.
  63. ^ Спецификация языка программирования Go 2021.
  64. ^ Галлер 1962, стр. 26–28, 197, 211.

Рекомендации