Jump to content

Перейти

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

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

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

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

Использование

[ редактировать ]

goto label

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

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

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

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

[ редактировать ]

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

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

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

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

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

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

[ редактировать ]

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

[ редактировать ]

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

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

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

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

Исключения

[ редактировать ]

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

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

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

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

[ редактировать ]

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

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

Сопрограммы

[ редактировать ]

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

Продолжение

[ редактировать ]

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

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

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

[ редактировать ]

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

Вариации

[ редактировать ]

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

Вычисление GOTO и Назначено ПЕРЕЙТИ

[ редактировать ]

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

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

    assign 200 to i
    i = i+1
    goto i ! unspecified behavior
200 write(*,*) "this is valid line number"

Некоторые компиляторы 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] и Питон. [56] [57]

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

[ редактировать ]

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

 /* This implements the equivalent of */
 /* the assigned goto                 */
   declare where label;
   where = somewhere;
   goto where;
   ...
 somewhere: /* statement */ ;
   ...
 /* This implements the equivalent of */
 /* the computed goto                 */
   declare where (5) label;
   declare inx fixed;
   where(1) = abc;
   where(2) = xyz;
   ...
   goto where(inx);
   ...
 abc: /* statement */ ;
   ...
 xyz: /* statement */ ;
   ...

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

 /* This implements the equivalent of */
 /* the computed goto                 */
   declare inx fixed;
   ...
   goto where(inx);
   ...
 where(1): /* statement */ ;
   ...
 where(2): /* statement */ ;
   ...

MS/DOS ПЕРЕЙТИ К

[ редактировать ]

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

@echo off
SET D8str=%date%
SET D8dow=%D8str:~0,3%

FOR %%D in (Mon Wed Fri) do if "%%D" == "%D8dow%" goto SHOP%%D
echo Today, %D8dow%, is not a shopping day.
goto end

:SHOPMon
echo buy pizza for lunch - Monday is Pizza day.
goto end

:SHOPWed
echo buy Calzone to take home - today is Wednesday.
goto end

:SHOPFri
echo buy Seltzer in case somebody wants a zero calorie drink.
:end

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

[ редактировать ]

Многие языки поддерживают goto заявление, а многие этого не делают. На Яве , 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. ^ Перейти обратно: а б с Вайн 2007 , стр. 262.
  12. ^ Гейслер 2011 .
  13. ^ Обсуждение 2013 г.
  14. ^ Перейти обратно: а б с д Сахни и Чмелик 1995 .
  15. ^ Перейти обратно: а б с Эндрюс 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. ^ Перейти обратно: а б 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.
  • Контьери, Макси (2 ноября 2021 г.). «Код Smell 100 — GoTo» . Максимилиано Контьери — Разработка программного обеспечения . Проверено 14 ноября 2021 г.
  • Гейслер, Сандра (2011). C Настольный справочник «все в одном» для чайников . Джон Уайли и сыновья. стр. 217–220. ISBN  978-1-118-05424-6 .
  • Хиндл, Ричи (1 апреля 2004 г.). «перейти к Python» . Энтрийские решения . Хартфорд, Великобритания: Entrian Solutions Ltd. Проверено 10 ноября 2021 г.
  • МакКоннелл, Стив (декабрь 2004 г.). Code Complete: Практическое руководство по созданию программного обеспечения, второе издание (2-е изд.). Майкрософт Пресс. ISBN  978-0735619678 .
  • Мейер, Бертран (2009). Прикосновение к классу: учимся хорошо программировать с объектами и контрактами . Springer Science & Business Media. п. 189. ИСБН  978-3-540-92144-8 .
  • Руководство по синтаксису Perl (2021 г.). Перейти (Отчет) . Проверено 14 ноября 2021 г.
  • Руководство по PHP (2021 г.). "перейти" . PHP . Проверено 13 ноября 2021 г.
  • Прата, Стивен (2013). С Праймер Плюс . Аддисон-Уэсли. стр. 287–289. ISBN  978-0-13-343238-1 .
  • Вайн, Майкл А. (2007). Программирование на C для абсолютных новичков . Cengage Обучение. ISBN  978-1-59863-634-5 .
  • z/OS 2.5.0 в документации IBM (2021 г.). «Вычисляемый оператор перехода (расширение IBM)» . ИБМ . Проверено 13 ноября 2021 г. В этом документе описываются синтаксис, семантика и реализация IBM z/OS XL C/C++ языков программирования C и C++. Справочник по стандарту C или C++ общего назначения см. на сайте cppreference.com. {{cite web}}: CS1 maint: числовые имена: список авторов ( ссылка )
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: ce09a4510dfb8e13097fc7bc4667be28__1722330840
URL1:https://arc.ask3.ru/arc/aa/ce/28/ce09a4510dfb8e13097fc7bc4667be28.html
Заголовок, (Title) документа по адресу, URL1:
Goto - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)