Перейти к - Goto
Перейти к (перейти к, ИДТИ К, ИДТИ К или другие комбинации регистра, в зависимости от языка программирования) - это заявление найдено во многих компьютерах языки программирования. Он выполняет односторонний трансфер управления другой строкой кода; в отличие от вызов функции обычно возвращает управление. Локации, к которым перешли, обычно идентифицируются с помощью этикетки, хотя некоторые языки используют номера строк. На Машинный код уровень, а перейти к
это форма оператор перехода или перехода, в некоторых случаях в сочетании с настройкой стека. Многие языки поддерживают перейти к
заявление, а многие нет (см. § языковая поддержка ).
В теорема о структурированной программе доказал, что перейти к
оператор не является необходимым для написания программ, которые могут быть выражены как блок-схемы; некоторая комбинация трех программных конструкций последовательности, выбора / выбора и повторения / итерации достаточна для любых вычислений, которые могут быть выполнены Машина Тьюринга, с оговоркой, что дублирование кода и могут потребоваться дополнительные переменные.[1]
В прошлом в академических кругах и в промышленности велись серьезные споры о достоинствах использования перейти к
заявления. Ранее использование goto было обычным явлением, но с момента появления структурного программирования в 1960-х и 1970-х годах его использование значительно сократилось. Главная критика тот код, который использует операторы goto, труднее понять, чем альтернативные конструкции. Goto остается в использовании в некоторых общие шаблоны использования, но альтернативы обычно используются, если они доступны. Споры о его (более ограниченном) использовании продолжаются в академических кругах и кругах разработчиков программного обеспечения.
Применение
перейти к метка
В перейти к
заявление часто сочетается с если заявление вызвать условную передачу управления.
ЕСЛИ условие ТОГДА перейти к метка
Языки программирования налагают разные ограничения на назначение перейти к
заявление. Например, Язык программирования C не разрешает переход к метке, содержащейся в другой функции,[2] однако переходы внутри одной цепочки вызовов возможны с использованием setjmp / longjmp функции.
Критика
На собрании, предшествовавшем разработке Алгола, в 1959 г. Хайнц Земанек явно поставил под сомнение необходимость операторов GOTO; в то время никто[нужна цитата ] обратил внимание на его замечание, в том числе Эдсгер В. Дейкстра, который впоследствии стал культовым противником GOTO.[3] В 1970-х и 1980-х годах использование операторов GOTO сократилось в пользу выражения "структурное программирование " парадигма, при этом goto критикуется как ведущий к "недостижимому код спагетти "(см. ниже). Некоторые стиль программирования стандарты кодирования, например, стандарты кодирования GNU Pascal, не рекомендуют использовать операторы GOTO.[4] В Доказательство Бема – Якопини. (1966) не разрешили вопрос о том, следует ли применять структурированное программирование для разработки программного обеспечения, отчасти потому, что конструкция с большей вероятностью скрывала программу, чем улучшала ее, поскольку ее применение требовало введения дополнительных локальных переменных.[5] Тем не менее, это вызвало широкие дискуссии среди компьютерных ученых, преподавателей, разработчиков языков и разработчиков приложений, которые наблюдали медленный, но неуклонный отход от ранее повсеместного использования GOTO. Вероятно, самая известная критика GOTO - это письмо Эдсгера Дейкстры 1968 года под названием Перейти к заявлению Считается вредным.[3][6] В этом письме Дейкстра утверждал, что неограниченные операторы GOTO следует отменить в языках более высокого уровня, поскольку они усложняют задачу анализа и проверки правильности программ (особенно тех, которые включают циклы). Само письмо вызвало дискуссию, в том числе письмо «GOTO Считается вредным» Считается вредным »[7] отправлен в Сообщения ACM (CACM) в марте 1987 г., а также дальнейшие ответы других людей, в том числе Дейкстры. О несколько неутешительной переписке.[8]
Альтернативная точка зрения представлена в Дональд Кнут с Структурированное программирование с использованием операторов перехода, который анализирует многие общие задачи программирования и обнаруживает, что в некоторых из них GOTO является оптимальным языковая конструкция использовать.[9] В Язык программирования C, Брайан Керниган и Деннис Ричи предупредить что перейти к
"бесконечно злоупотреблять", но также предполагаем, что его можно было бы использовать для обработчиков ошибок при завершении функции и для многоуровневых прерываний из циклов.[10] Эти два паттерна можно найти в многочисленных последующих книгах по C других авторов;[11][12][13][14] во вводном учебнике 2007 г. отмечается, что шаблон обработки ошибок - это способ обойти «отсутствие встроенной обработки исключений в языке C».[11] Другие программисты, в том числе Linux Разработчик ядра и кодер Линус Торвальдс или программист и автор книги Стив МакКоннелл, также возражают против точки зрения Дейкстры, заявляя, что GOTO могут быть полезной функцией языка, улучшающей скорость, размер и ясность кода программы, но только при разумном использовании сравнительно разумным программистом.[15][16] По словам профессора информатики Джон Регер, в 2013 году в коде ядра Linux было около 100 000 экземпляров goto.[17]
Другие ученые заняли более крайнюю точку зрения и утверждали, что даже такие инструкции, как перемена
и вернуть
от середины петель - плохая практика, поскольку они не нужны в результате Бема – Якопини, и, таким образом, отстаивал, что петли должны иметь единственную точку выхода.[18] Например, Бертран Мейер написал в своем учебнике 2009 года, что инструкции вроде перемена
и Продолжать
"просто старые перейти к
в овечьей шкуре ».[19] Слегка измененная форма результата Бема – Якопини позволяет, однако, избегать дополнительных переменных в структурном программировании, если разрешены многоуровневые разрывы циклов.[20] Поскольку некоторые языки, такие как C, не допускают многоуровневых разрывов через свои перемена
ключевое слово, некоторые учебники советуют программисту использовать перейти к
в таких обстоятельствах.[14] В MISRA C Стандартные запреты 2004 года перейти к
, Продолжать
, а также несколько вернуть
и перемена
заявления.[21] Издание 2012 года стандарта MISRA C снизило запрет на перейти к
от «обязательного» до «рекомендательного» статуса; в редакции 2012 года есть дополнительное обязательное правило, которое запрещает только переход назад, но не вперед с перейти к
.[22][23]
FORTRAN представили конструкции структурного программирования в 1978 году, и в последовательных изменениях относительно свободные семантические правила, регулирующие допустимое использование goto, были ужесточены; «расширенный диапазон», в котором программист мог использовать GOTO для входа и выхода из все еще выполняющегося цикла DO, был удален из языка в 1978 году,[24] и к 1995 году несколько форм Fortran GOTO, включая Computed GOTO и Assigned GOTO, были удалены.[25] Некоторые широко используемые современные языки программирования, такие как Ява и Python отсутствует инструкция GOTO - см. языковая поддержка - хотя большинство из них предоставляют средства для выхода из выборки, либо ломка из или перемещение переходим к следующему шагу итерации. Точку зрения, что нарушение потока управления в коде нежелательно, можно увидеть при разработке некоторых языков программирования, например Ада[26] визуально подчеркивает определения меток, используя угловые скобки.
Запись 17.10 в списке часто задаваемых вопросов comp.lang.c[27] напрямую решает проблему использования GOTO, заявляя
Стиль программирования, как и стиль письма, является своего рода искусством и не может быть кодифицирован жесткими правилами, хотя дискуссии о стиле часто, кажется, сосредоточены исключительно вокруг таких правил. В случае оператора goto уже давно замечено, что неограниченное использование goto быстро приводит к невозможности поддержки кода спагетти. Однако простой, бездумный запрет на оператор goto не обязательно сразу приводит к красивому программированию: неструктурированный программист так же способен построить византийский клубок без использования каких-либо goto (возможно, вместо этого заменив странно вложенные циклы и логические управляющие переменные) . Многие программисты занимают умеренную позицию: обычно следует избегать goto, но при необходимости они приемлемы в нескольких хорошо ограниченных ситуациях: как многоуровневые операторы break, объединить общие действия внутри оператора switch или централизовать задачи очистки в функция с несколькими ошибками возвращает. (...) Слепое избегание определенных конструкций или следование правилам без их понимания может привести к такому же количеству проблем, сколько правила должны были предотвратить. Более того, многие мнения о стиле программирования - это просто мнения. Они могут быть решительно аргументированы и сильно прочувствованы, они могут быть подкреплены очевидными доказательствами и аргументами, но противоположные мнения могут быть столь же сильно прочувствованы, поддержаны и аргументированы. Обычно бесполезно втягиваться в «войну стилей», потому что по некоторым вопросам оппоненты никогда не могут прийти к согласию или согласиться не согласиться, или перестать спорить.
Общие шаблоны использования
В то время как общее использование gotos сокращается, на некоторых языках все еще существуют ситуации, когда goto обеспечивает самый короткий и самый простой способ выразить логику программы (хотя можно выразить ту же логику без goto, эквивалентный код будет длиннее и часто труднее понять). В других языках есть структурированные альтернативы, особенно исключения и хвостовые вызовы.
Ситуации, в которых часто бывает полезен goto, включают:
- Чтобы сделать код более читаемым и понятным[28][29]
- Чтобы делать программы меньшего размера и избавиться от дублирования кода [28][29]
- Реализовать конечный автомат, с помощью таблица переходов состояний и goto для переключения между состояниями (при отсутствии устранение хвостового сигнала ), особенно в автоматически сгенерированном коде C.[30] Например, goto в каноническом парсере LR.
- Реализация многоуровневого прерывания и продолжения, если это напрямую не поддерживается в языке; это обычная идиома в C.[14] Хотя Java резервирует ключевое слово goto, на самом деле она его не реализует. Вместо этого в Java реализованы операторы с метками break и continue.[31] Согласно документации Java, использование gotos для многоуровневых разрывов было наиболее распространенным (90%) использованием gotos в C.[32] Java не был первым языком, который применил этот подход - запрещающий goto, но обеспечивающий многоуровневые перерывы - Блаженство В этом отношении ему предшествовал язык программирования (точнее его версия BLISS-11).[33]:960–965
- Суррогаты для одноуровневых операторов break или continue (retry), когда возможное введение дополнительных циклов может неправильно повлиять на поток управления. Такая практика наблюдалась в Netbsd код.[34]
- Обработка ошибок (при отсутствии исключений), особенно кода очистки, такого как освобождение ресурсов.[11][14][34][30][35] C ++ предлагает альтернативу оператору goto для этого варианта использования, а именно: Приобретение ресурсов - это инициализация (RAII) с помощью деструкторов или использования исключений try и catch, используемых в Обработка исключений.[36] setjmp и longjmp - еще одна альтернатива, имеющая преимущество в том, что она позволяет отматывать часть стек вызовов.
- вставка стека, например, Algol, PL / I.
Такое использование относительно часто в C, но гораздо реже в C ++ или других языках с функциями более высокого уровня.[35] Однако генерирование и перехват исключения внутри функции в некоторых языках может быть чрезвычайно неэффективным; яркий пример Цель-C, где goto - гораздо более быстрая альтернатива.[37]
Еще одно использование операторов goto - изменение плохо разобранных устаревший код, где для предотвращения перехода потребуются обширные рефакторинг или дублирование кода. Например, для большой функции, в которой интересен только определенный код, оператор goto позволяет перейти только к соответствующему коду или от него, не изменяя функцию иным образом. Это использование считается запах кода, но время от времени находит применение.
Альтернативы
Структурированное программирование
Современное представление о подпрограмма был изобретен Дэвид Уиллер при программировании EDSAC.[38] Чтобы реализовать вызов и возврат на машине без стека, он использовал особый шаблон самомодифицирующегося кода, известный как прыжок Уиллера.[39] Это привело к способности структурировать программы, используя хорошо вложенные исполнения подпрограмм, взятых из библиотеки. Это было бы невозможно, используя только перейти к
, поскольку целевой код, взятый из библиотеки, не знает, куда вернуться.
Позже языки высокого уровня, такие как Паскаль были разработаны для поддержки структурное программирование, которая обобщена из подпрограммы (также известные как процедуры или функции) в направлении дальнейшего управляющие структуры Такие как:
- Циклы с использованием
пока
,повторять, пока
илиделать
, иза
заявления переключатель
a.k.a.кейс
заявления, форма многостороннее ветвление
Эти новые языковые механизмы заменили эквивалентные потоки, которые ранее были написаны с использованием перейти к
s и если
с. Многостороннее ветвление заменяет «вычисленный переход», в котором инструкция перехода определяется динамически (условно).
Исключения
На практике строгое соблюдение основного трехструктурного шаблона структурированного программирования приводит к сильно вложенному коду из-за невозможности преждевременно выйти из структурированного модуля и комбинаторный взрыв с довольно сложными данными о состоянии программы для обработки всех возможных условий.
Обычно были приняты два решения: способ преждевременного выхода из структурированного подразделения и в более общем плане исключения - в обоих случаях они идут вверх структура, возвращающая управление охватывающим блокам или функциям, но не переходящая к произвольным участкам кода. Это аналогично использованию оператора return в нетерминальной позиции - не строго структурировано из-за раннего выхода, но мягко ослабляет ограничения структурного программирования. В C, перемена
и Продолжать
позволить одному завершить цикл или перейти к следующей итерации, не требуя дополнительных пока
или если
заявление. На некоторых языках также возможны многоуровневые перерывы. Для работы в исключительных ситуациях специализированные Обработка исключений были добавлены конструкции, такие как пытаться
/ловить
/Ну наконец то
в Java.
Механизмы обработки исключений throw-catch также могут быть легко использованы для создания непрозрачных структур управления, так же как и goto.[40]
Хвостовые крики
В документе, представленном на конференции ACM в Сиэтле в 1977 г., Гай Л. Стил резюмировал дискуссию о GOTO и структурированном программировании и заметил, что вызовы процедур в конце процедуры можно наиболее оптимально рассматривать как прямую передачу управления вызываемой процедуре, обычно устраняя ненужные операции манипулирования стеком.[41] Поскольку такие "хвостовые крики" очень распространены в Лисп, язык, в котором вызовы процедур являются повсеместными, эта форма оптимизации значительно снижает стоимость вызова процедуры по сравнению с GOTO, используемым в других языках. Стил утверждал, что плохо реализованные вызовы процедур привели к искусственному восприятию того, что GOTO дешевле, чем вызов процедуры. Стил далее утверждал, что «в общем случае вызовы процедур можно с пользой рассматривать как операторы GOTO, которые также передают параметры и могут быть единообразно закодированы как Машинный код Инструкции JUMP », при этом инструкции манипулирования стеком машинного кода« считаются оптимизацией (а не наоборот!) ».[41] Стил привел доказательства того, что хорошо оптимизированные числовые алгоритмы в Лиспе могут выполняться быстрее, чем код, созданный доступными в то время коммерческими компиляторами Фортрана, потому что стоимость вызова процедуры в Лиспе была намного ниже. В Схема, диалект Лиспа, разработанный Стилом с Джеральд Джей Сассман, оптимизация хвостового вызова является обязательной.[42]
Хотя статья Стила не представила ничего нового для информатики, по крайней мере, в том виде, в каком она практикуется в Массачусетском технологическом институте, она пролила свет на возможности оптимизации вызова процедур, что сделало способствующие модульности качества процедур более надежной альтернативой методам. распространенные тогда привычки кодирования больших монолитных процедур со сложными структурами внутреннего контроля и обширными данными о состоянии. В частности, оптимизация хвостового вызова, обсужденная Стилом, превратила процедуру в надежный способ реализации итерации с помощью одного хвостовая рекурсия (хвостовая рекурсия вызывает ту же функцию). Кроме того, оптимизация хвостового вызова позволяет взаимная рекурсия неограниченной глубины, предполагая хвостовые вызовы - это позволяет передавать управление, как в конечные автоматы, что в противном случае обычно выполняется с помощью операторов goto.
Сопрограммы
Сопрограммы представляют собой более радикальное ослабление структурированного программирования, позволяя не только несколько точек выхода (как в случае возврата в позиции без хвоста), но также несколько точек входа, подобных операторам goto. Сопрограммы более ограничены, чем goto, поскольку они могут только продолжить текущая сопрограмма в указанных точках - продолжающаяся после yield - вместо того, чтобы переходить к произвольной точке кода. Ограниченная форма сопрограмм: генераторы, которых достаточно для некоторых целей. Еще более ограниченными являются закрытие - подпрограммы, поддерживающие состояние (через статические переменные ), но не положение исполнения. Комбинация переменных состояния и структурированного управления, особенно общего оператора switch, может позволить подпрограмме возобновить выполнение в произвольной точке при последующих вызовах и является структурированной альтернативой операторам goto при отсутствии сопрограмм; это обычная идиома, например, в языке C.
Продолжение
А продолжение похож на GOTO тем, что передает управление из произвольной точки программы в ранее отмеченную точку. Продолжение более гибкое, чем GOTO на тех языках, которые его поддерживают, потому что оно может передавать управление из текущей функции, чего GOTO не может сделать в большинстве языков структурированного программирования. В тех реализациях языка, которые поддерживают кадры стека для хранения локальных переменных и аргументов функций, выполнение продолжения включает в себя настройку параметров программы. стек вызовов в дополнение к прыжку. В longjmp функция Язык программирования C является примером escape-продолжения, которое может использоваться для выхода из текущего контекста в окружающий. В Common Lisp Оператор GO также имеет свойство раскручивания стека, несмотря на то, что конструкция лексически ограниченный, поскольку на метку, к которой нужно перейти, можно ссылаться из закрытие.
В Схема, при желании продолжения могут даже перемещать управление из внешнего контекста во внутренний. Этот почти безграничный контроль над тем, какой код будет выполняться дальше, делает относительно легким написание сложных структур управления, таких как сопрограммы и совместная многозадачность.[43]
Передача сообщений
В непроцедурных парадигмах goto менее актуален или полностью отсутствует. Одна из основных альтернатив - передача сообщений, что особенно важно в параллельные вычисления, межпроцессного взаимодействия, и объектно-ориентированного программирования. В этих случаях отдельные компоненты не имеют произвольной передачи управления, но общее управление может быть запланировано сложным образом, например, через упреждение. Влиятельные языки Симула и Болтовня были одними из первых, кто ввел концепции сообщений и объектов. К инкапсуляция данные о состоянии, объектно-ориентированного программирования снижение сложности программного обеспечения до взаимодействий (сообщений) между объектами.
Вариации
Существует ряд различных языковых конструкций под классом перейти к заявления.
Вычисленный GOTO и Назначено GOTO
В Фортран, а вычислен ИДТИ К
переходит к одной из нескольких меток в списке в зависимости от значения выражения. Примером является goto (20,30,40) я
. Эквивалентная конструкция в C - это оператор переключения и в более новом Fortran a КЕЙС
оператор является рекомендуемой синтаксической альтернативой.[44] БАЗОВЫЙ имеет ВКЛ ... НАЙТИ
конструкция, которая достигает той же цели.[45]
В версиях, предшествующих Fortran 95, Fortran также имел назначенный goto вариант, который передает управление метке оператора (номеру строки), которая хранится (присваивается) целочисленной переменной. К сожалению, переход к целочисленной переменной, которой не было присвоено значение, был возможен и был основным источником ошибок, связанных с назначенными gotos.[46] Фортран назначать
Оператор позволяет присвоить целочисленной переменной только постоянный (существующий) номер строки. Однако впоследствии можно было случайно обработать эту переменную как целое число, например, увеличить ее, что привело к неопределенному поведению в перейти к
время. Следующий код демонстрирует поведение goto я
когда линия я не указано:[47]
назначать 200 к я я = я+1 перейти к я ! неопределенное поведение200 записывать(*,*) "это действительный номер строки"
Некоторые компиляторы C реализуют два нестандартных расширения C / C ++, относящиеся к gotos, первоначально представленные gcc.[48][49] Расширение GNU позволяет получить адрес метки внутри текущей функции как пустота*
используя унарный префикс оператор значения метки &&
. Инструкция goto также расширена, чтобы разрешить переход к произвольному пустота*
выражение. Это расширение C называется вычисляемый goto в документации поддерживающих его компиляторов C; его семантика является надмножеством назначенного Фортрана goto, потому что он допускает произвольные выражения указателя в качестве цели перехода, в то время как назначенный Фортран goto не допускает произвольные выражения в качестве цели перехода.[50] Как и в случае со стандартным goto в C, расширение GNU C позволяет целевому объекту вычисляемого goto находиться только в текущей функции. Попытка перейти за пределы текущей функции приводит к неопределенному поведению.[50]
Некоторые варианты BASIC также поддерживают вычисляемый GOTO в том смысле, который используется в GNU C, т.е. в котором цель может быть любой номер строки, а не только один из списка. Например, в МТС BASIC можно было написать GOTO i * 1000
перейти к строке, пронумерованной в 1000 раз больше значения переменной я (который может представлять, например, выбранный пункт меню).[51]
PL / I метка переменных достичь эффекта вычисленного или назначенного ИДТИ К
с.
ИЗМЕНИТЬ
До 1985 ANSI КОБОЛ В стандарте был глагол ALTER, который можно было использовать для изменения назначения существующего GO TO, который должен был находиться в абзаце отдельно.[52] Функция, позволившая полиморфизм, часто осуждался и редко использовался.[53]
Perl GOTO
В Perl, есть вариант перейти к
утверждение, которое вообще не является традиционным оператором GOTO. Он принимает имя функции и передает управление, эффективно заменяя один вызов функции другим ( хвостовой зов ): новая функция вернется не в GOTO, а в то место, из которого была вызвана исходная функция.[54]
Эмулированный GOTO
Есть несколько языков программирования, которые по умолчанию не поддерживают GOTO. Используя эмуляцию GOTO, все еще можно использовать GOTO на этих языках программирования, хотя и с некоторыми ограничениями. Можно эмулировать GOTO на Java,[55] JavaScript,[56] и Python.[57][58]
Переменные меток PL / I
PL / I имеет тип данных МЕТКА, который можно использовать для реализации как «назначенного перехода», так и «вычисленного перехода». PL / I разрешает ветви вне текущего блока. Вызывающая процедура может передать метку в качестве аргумента вызываемой процедуре, которая затем может выйти с ветвью. Значение переменной метки включает в себя адрес кадра стека, а переход из блока выталкивает стек.
/ * Это реализует эквивалент * / / * назначенного goto * / declare where label; где = где-то; перейти куда; ... где-то: / * оператор * /; ...
/ * Это реализует эквивалент * / / * вычисленного goto * / declare where (5) label; объявить inx фиксированным; где (1) = abc; где (2) = xyz; ... перейти туда, где (inx); ... abc: / * оператор * /; ... xyz: / * оператор * /; ...
MS / DOS GOTO
Goto направляет выполнение на метку, которая начинается с двоеточия. Целью Goto может быть переменная.
@эхо выключенНАБОР D8str=%Дата%НАБОР D8dow=% D8str: ~ 0,3%ДЛЯ %%D в (Пн ср пт) делать если "%%D " == "% D8dow%" перейти к МАГАЗИН %% Dэхо Сегодня, % D8dow%, это не торговый день.перейти к конец:МАГАЗИНэхо купить пиццу на обед - понедельник - день пиццы.перейти к конец:В магазинеэхо купить Кальцоне, чтобы забрать домой - сегодня среда.перейти к конец:МАГАЗИНПтэхо купите Зельцер на случай, если кто-то захочет получить напиток с нулевой калорийностью.:конец
Языковая поддержка
Многие языки поддерживают перейти к
заявление, а многие нет. В Ява, перейти к
это зарезервированное слово, но его нельзя использовать, хотя скомпилированный file.class генерирует GOTO и LABEL.[59][60] Python не поддерживает goto, хотя есть несколько модулей-шуток, которые ее предоставляют.[57][58] В инструкции goto нет Семя7 и скрытые переходы, такие как операторы break и continue, также опускаются.[61] В PHP не было встроенной поддержки для перейти к
до версии 5.3 (были доступны библиотеки для эмуляции его функциональности).[62]
В Язык программирования C # имеет перейти к
. Однако он не позволяет перейти к метке за пределами текущей области видимости, что делает его значительно менее мощным и опасным, чем перейти к
ключевое слово в других языках программирования. Это также делает кейс и по умолчанию метки операторов, которые охватывают оператор переключения; дело goto или перейти по умолчанию часто используется как явная замена неявному провалу, который запрещен в C #.
В других языках могут быть свои собственные отдельные ключевые слова для явных провалов, которые можно рассматривать как версию перейти к
ограничено этой конкретной целью. Например, Go использует провалиться
ключевое слово и вообще не допускает неявного провала, в то время как Perl 5 использует Следующий
для явного падения по умолчанию, но также позволяет установить неявное падение как поведение по умолчанию для модуля.
Большинство языков, в которых есть операторы goto, называют это так, но на заре вычислений использовались другие имена. Например, в СУМАСШЕДШИЙ был использован оператор TRANSFER TO.[63] APL использует стрелку вправо, →
для goto.
В C есть goto, и он обычно используется в различных идиомах, как обсуждалось выше.
Существует перейти к
функционировать в Perl также.
В функциональных языках программирования, таких как Scheme, обычно нет goto, вместо этого используются продолжения.
Смотрите также
- РОДОМ ИЗ
- Поток управления
- GOSUB
- Заявление о переключении - а разветвленная ветка (или условный переход)
- Неструктурированное программирование
- Считается вредным
Рекомендации
- ^ Дэвид Энтони Уотт; Уильям Финдли (2004). Концепции проектирования языков программирования. Джон Вили и сыновья. п.228. ISBN 978-0-470-85320-7.
- ^ «Новый стандарт C: 6.8.6.1». c0x.coding-guidelines.com.
- ^ а б Дейкстра 1968.
- ^ «Стандарты программирования GNU Pascal». www.gnu-pascal.de.
- ^ Кеннет Лауден, Ламберт (2011). Языки программирования: принципы и практика. Cengage Learning. п.422. ISBN 978-1-111-52941-3.
- ^ "EWD 215: Дело против заявления GO TO" (PDF).
- ^ Франк Рубин (март 1987 г.). ""GOTO Считается вредным "Считается вредным" (PDF). Коммуникации ACM. 30 (3): 195–196. Дои:10.1145/214748.315722. Архивировано из оригинал (PDF) на 20.03.2009.
- ^ Дейкстра, Эдсгер В. О несколько неутешительной переписке (EWD-1009) (PDF). Архив Э.В. Дейкстры. Центр американской истории, Техасский университет в Остине. (транскрипция ) (Май 1987 г.)
- ^ Дональд Кнут (1974). «Структурированное программирование с использованием операторов перехода» (PDF). Вычислительные опросы. 6 (4): 261–301. CiteSeerX 10.1.1.103.6084. Дои:10.1145/356635.356640.
- ^ Брайан В. Керниган; Деннис Ричи (1988). Язык программирования C (2-е изд.). Прентис Холл. стр.60–61. ISBN 978-0-13-308621-8.
- ^ а б c Майкл А. Вайн (2007). Программирование на C для абсолютного новичка. Cengage Learning. п. 262. ISBN 978-1-59863-634-5.
- ^ Сандра Гейслер (2011). Настольный справочник C All-in-One для чайников. Джон Вили и сыновья. С. 217–220. ISBN 978-1-118-05424-6.
- ^ Стивен Прата (2013). C Primer Plus. Эддисон-Уэсли. С. 287–289. ISBN 978-0-13-343238-1.
- ^ а б c d Сартадж Сахни; Роберт Ф. Чмелик; Боб Чмелик (1995). Разработка программного обеспечения на C. Silicon Press. п. 135. ISBN 978-0-929306-16-2.
- ^ «Архивная копия». Архивировано из оригинал на 2010-02-14. Получено 2010-01-30.CS1 maint: заархивированная копия как заголовок (ссылка на сайт)
- ^ «Код завершен, первое издание». Stevemcconnell.com. Получено 2014-07-22.
- ^ «Использование Goto в системном коде - встроено в академические круги». blog.regehr.org.
- ^ Робертс, Э. [1995] «Выходы из цикла и структурированное программирование: возобновление дискуссии», Бюллетень ACM SIGCSE, (27) 1: 268–272.
- ^ Бертран Мейер (2009). Touch of Class: учимся хорошо программировать с объектами и контрактами. Springer Science & Business Media. п. 189. ISBN 978-3-540-92144-8.
- ^ Декстер Козен и Вэй-Лунг Дастин Цзэн (2008). Теорема Бёма – Якопини неверна с теоретической точки зрения (PDF). Мпк 2008. Конспект лекций по информатике. 5133. С. 177–192. CiteSeerX 10.1.1.218.9241. Дои:10.1007/978-3-540-70594-9_11. ISBN 978-3-540-70593-2.
- ^ «Почему« продолжить »считается нарушением C в MISRA C: 2004?». Переполнение стека. 2012-06-11. Получено 2014-07-22.
- ^ Марк Питчфорд; Крис Тэпп (25 февраля 2013 г.). «MISRA C: 2012: множество веских причин для перемен». Электронный дизайн. Получено 2014-07-22.
- ^ Том Уильямс (март 2013 г.). «Правила проверки для C: обеспечение надежности и безопасности». Журнал RTC. Получено 2014-07-22.
- ^ ANSI X3.9-1978. Американский национальный стандарт - язык программирования FORTRAN. Американский национальный институт стандартов. Также известен как ISO 1539-1980, неофициально известный как FORTRAN 77.
- ^ ИСО / МЭК 1539-1: 1997. Информационные технологии - Языки программирования - Фортран - Часть 1: Базовый язык. Неформально известный как Fortran 95. Этот стандарт состоит еще из двух частей. Часть 1 официально принята ANSI.
- ^ Джон Барнс (2006-06-30). Программирование на Аде 2005. Эддисон Уэсли. п. 114–115. ISBN 978-0-321-34078-8.
- ^ «Вопрос 17.10». C-faq.com. Получено 2014-07-22.
- ^ а б «Linux: использование goto в коде ядра». 28 ноября 2005 г. Архивировано с оригинал 28 ноября 2005 г.
- ^ а б https://www.kernel.org/doc/Documentation/CodingStyle
- ^ а б Хорошее использование goto, Саймон Козенс
- ^ «Ветвящиеся операторы (Учебники Java ™> Изучение языка Java> Основы языка)». Docs.oracle.com. 2012-02-28. Получено 2014-07-22.
- ^ «Языковая среда Java». Oracle.com. Получено 2014-07-22.
- ^ Брендер, Рональд Ф. (2002). «Язык программирования BLISS: история» (PDF). Программное обеспечение: практика и опыт. 32 (10): 955–981. Дои:10.1002 / spe.470.
- ^ а б Диомидис Спинеллис (27 мая 2003 г.). Чтение кода: перспектива открытого исходного кода. Эддисон-Уэсли Профессионал. С. 43–44. ISBN 978-0-672-33370-5.
- ^ а б Когда использовать Goto при программировании на C, Алекс Аллен
- ^ «Основной доклад дня 1 - Бьярн Страуструп: стиль C ++ 11 | GoingNative 2012 | Channel 9». Channel9.msdn.com. 2012-02-02. Получено 2014-07-22.
- ^ Дэвид Чисналл (2012). Разговорник Objective-C. Эддисон-Уэсли Профессионал. п.249. ISBN 978-0-321-81375-6.
- ^ "Дэвид Дж. Уиллер • Компьютерное общество IEEE". www.computer.org.
- ^ Wilkes, M. V .; Уиллер, Д. Дж .; Гилл, С. (1951). Подготовка программ для ЭЦП. Эддисон-Уэсли.
- ^ Й. Зидерслебен (2006). «Ошибки и исключения - права и обязанности». В Кристофе Дони (ред.). Дополнительные темы по методам обработки исключений. Springer Science & Business Media. п.277. ISBN 978-3-540-37443-5.
- ^ а б Гай Льюис Стил-младший "Развенчание мифа о" дорогостоящем вызове процедур "или реализациях вызовов процедур, признанных вредными, или лямбда: окончательный GOTO". MIT AI Lab. Записка AI Lab AIM-443. Октябрь 1977 г.
- ^ R5RS Sec. 3.5, Ричард Келси; Уильям Клингер; Джонатан Рис; и другие. (Август 1998 г.). "Пересмотренный5 Отчет об алгоритмической языковой схеме ». Вычисление высшего порядка и символическое вычисление. 3 (1): 7–105. Дои:10.1023 / А: 1010051815785.
- ^ «Пересмотренный отчет ^ 5 по алгоритмической языковой схеме». schemers.org.
- ^ «Расчетный оператор GOTO (устаревший)». Lahey.com. Архивировано из оригинал на 2016-05-26. Получено 2014-07-22.
- ^ «Microsoft QuickBASIC: ON ... GOSUB, ON ... GOTO Statements QuickSCREEN». Microsoft. 1988. Получено 2008-07-03.
- ^ http://www.personal.psu.edu/jhm/f90/statements/goto_a.html
- ^ «НАЗНАЧЕНИЕ - присвоение ярлыка». Software.intel.com. Получено 2014-07-22.
- ^ Вычисленный goto, Компилятор IBM XL C / C ++
- ^ «Список исправлений для компиляторов Intel® Composer XE 2013 SP1 | Зона разработчиков Intel®». Software.intel.com. 2013-08-12. Получено 2014-07-22.
- ^ а б «Ярлыки как значения - Использование коллекции компиляторов GNU (GCC)». Gcc.gnu.org. Получено 2014-07-22.
- ^ Вычислительный центр Мичиганского университета (сентябрь 1974 г.). МТС, Michigan Terminal System. Библиотеки UM. п. 226. УОМ: 39015034770076.
- ^ Справочное руководство HP COBOL II / XL, "Оператор ALTER является устаревшей функцией стандарта ANSI COBOL 1985 года".
- ^ Ван Тассел, Денни (8 июля 2004 г.). «История этикеток в языках программирования». Получено 4 января 2011.
- ^ Перейти к из руководства perl.syn (синтаксис Perl)
- ^ «GOTO для Java». Steik. 6 июля 2009 г. Архивировано с оригинал 15 июня 2012 г.. Получено 28 апреля, 2012.
- ^ Секстон, Алекс. "Лето Гото | Официальный дом Goto.js". Получено 28 апреля, 2012.
- ^ а б Хиндл, Ричи (1 апреля 2004 г.). "goto для Python". Entrian Solutions. Хертфорд, Великобритания: Entrian Solutions Ltd. Получено 28 апреля, 2012.
Модуль 'goto' - это первоапрельская шутка, опубликованная 1 апреля 2004 года. Да, работает, но тем не менее это шутка. Пожалуйста, не используйте это в реальном коде!
- ^ а б сноб (19 сентября 2015 г.). "snoack / python-goto: декоратор функции, который переписывает байт-код, чтобы включить goto в Python". Получено 24 февраля, 2017.
- ^ «Спецификация языка Java, третье издание».
Ключевые слова const и goto зарезервированы, хотя в настоящее время они не используются. Это может позволить компилятору Java создавать более качественные сообщения об ошибках, если эти ключевые слова C ++ неправильно появляются в программах.
- ^ «Спецификация языка Java, третье издание».
В отличие от C и C ++, в языке программирования Java нет оператора goto; метки операторов идентификатора используются с операторами break (§14.15) или continue (§14.16), появляющимися в любом месте помеченного оператора.
- ^ "Руководство по Seed7". Томас Мертес. Получено 2019-09-19.
- ^ "goto - Вручную". PHP. Получено 2014-07-22.
- ^ Бернард А. Галлер, Язык компьютеров, Мичиганский университет, Макгроу-Хилл, 1962 год; страницы 26-28, 197, 211.
- Дейкстра, Эдсгер В. (Март 1968 г.). «Письма в редакцию: перейти к заявлению, признанному вредным» (PDF). Коммуникации ACM. 11 (3): 147–148. Дои:10.1145/362929.362947.CS1 maint: ref = harv (ссылка на сайт)
- Рамшоу, Л. (1988). «Устранение перебоев при сохранении структуры программы». Журнал ACM. 35 (4): 893–920. Дои:10.1145/48014.48021.