
En programación informática , goto es una instrucción de control de flujo que transfiere el control a otra línea de código fuente . A diferencia de una llamada a función que permite regresar al punto de llamada, goto no lo permite. La instrucción se denota de forma diferente según el lenguaje de programación ; algunos usan minúsculas ( ), otros usan mayúsculas ( ), y otros no distinguen entre mayúsculas y minúsculas. Algunos lenguajes hacen que la instrucción sea de dos palabras (es decir, ).gotoGOTOGO TO
La instrucción `goto` se incluye en un lenguaje principalmente para proporcionar acceso a la instrucción de salto en código máquina (también conocida como bifurcación o transferencia), pero debido a los posibles problemas con el uso de la semántica de salto, con el tiempo los lenguajes se han complementado con otros mecanismos de control de flujo destinados a reemplazar la necesidad y el uso de `goto`. Muchos lenguajes modernos no incluyen la instrucción `goto`. Muchos lenguajes que sí la incluyen restringen su uso para limitar los problemas que podría ocasionar. Además, dado que su uso generalmente se considera una mala elección, los desarrolladores de software tienden a evitarla incluso cuando utilizan un lenguaje que la proporciona.
En general, el uso de goto se considera una mala elección, ya que genera código con mayor carga cognitiva y más errores que el código que utiliza un control de flujo más estructurado. El uso de goto era común en los inicios de la informática, pero gracias al esfuerzo conjunto del movimiento de programación estructurada en las décadas de 1960 y 1970, que buscaba reemplazar goto con un control de flujo más estructurado, su uso ha disminuido significativamente. No obstante, goto todavía se utiliza hoy en día, pero generalmente se limita a escenarios específicos .
El teorema del programa estructurado demostró que la instrucción goto no es necesaria para escribir programas que puedan expresarse como diagramas de flujo ; alguna combinación de las tres construcciones de programación de secuencia, selección e iteración es suficiente para cualquier cálculo que pueda realizar una máquina de Turing , con la salvedad de que puede ser necesaria la duplicación de código y variables adicionales. [ 1 ]
Soporte de idiomas
La compatibilidad con goto varía según el lenguaje. Los lenguajes diseñados hace mucho tiempo suelen tener compatibilidad ilimitada, mientras que los lenguajes más recientes tienden a tener compatibilidad restringida o nula. Por ejemplo, C no permite un salto a una etiqueta en una función diferente. [ 2 ] [ 3 ]
C# y Visual Basic .NET admiten goto. [ 4 ] [ 5 ] Sin embargo, no permiten saltar a una etiqueta fuera del ámbito contenedor y respetan la eliminación de objetos y finallylas construcciones, lo que lo hace significativamente menos potente y menos peligroso que goto en otros lenguajes. También hacen que las palabras clave casey defaultsean etiquetas, cuyo ámbito es la instrucción switch que las contiene . goto caseo goto defaultse utiliza como reemplazo de la ejecución implícita , que no está permitida.
Muchos lenguajes carecen de semántica goto. Java tiene una palabra reservadagoto , pero no es utilizable, aunque .classlos archivos compilados generan sentencias goto y label. [ 6 ] Python no admite goto, aunque existen varios módulos de broma que lo proporcionan. [ 7 ] [ 8 ] PHP no admitió goto hasta la versión 5.3. [ 9 ]
PL/I tiene una instrucción goto que desenrolla la pila para una transferencia fuera de bloque y no permite una transferencia dentro de un bloque.
La mayoría de los lenguajes que tienen una instrucción goto-semántica usan la palabra clave goto , pero se usa otra sintaxis; particularmente en lenguajes más antiguos. Por ejemplo, MAD usa TRANSFER TO, [ 10 ] y APL usa una flecha que apunta hacia la derecha, →.
Los lenguajes de programación funcional, como Scheme, generalmente no tienen la instrucción goto, sino que utilizan continuaciones.
Calculado y asignado
En Fortran , un goto calculado salta a una de varias etiquetas en una lista, según el valor de una expresión. Un ejemplo es goto (20,30,40) i. [ 11 ] La construcción equivalente en C es la instrucción switch , y en Fortran más reciente una SELECT CASEconstrucción es la alternativa sintáctica recomendada. [ 12 ] BASIC tenía una 'On GoTo'instrucción que lograba el mismo objetivo, pero en Visual Basic esta construcción ya no es compatible. [ 13 ]
En versiones anteriores a Fortran 95, Fortran también tenía una variante de goto asignada que transfería el control a una etiqueta de instrucción (número de línea) almacenada en (asignada a) una variable entera. Desafortunadamente, era posible saltar a una variable entera que no había sido ASIGNADA, lo que constituía una fuente importante de errores relacionados con las instrucciones goto asignadas. [ 14 ] La assigninstrucción Fortran solo permite asignar un número de línea constante (existente) a la variable entera. Sin embargo, algunos compiladores permitían tratar accidentalmente esta variable como un entero posteriormente, por ejemplo, incrementándola, lo que resultaba en un comportamiento no especificado en el momento de la instrucción goto. El siguiente código demuestra el comportamiento goto icuando la línea i no está especificada:
asignar 200 a i i = i + 1 ir a i ! comportamiento no especificado 200 escribir ( * , * ) "este es un número de línea válido"Varios compiladores de C implementan dos extensiones no estándar de C/C++ relacionadas con las instrucciones goto, introducidas originalmente por gcc . [ 15 ] La extensión de GNU permite obtener la dirección de una etiqueta dentro de la función actual mediante el operador de valor de etiquetavoid* prefijo unario . La instrucción goto también se extiende para permitir el salto a una expresión arbitraria. Esta extensión de C se denomina goto calculado en la documentación de los compiladores de C que la admiten; su semántica es un superconjunto del goto asignado de Fortran, ya que permite expresiones de puntero arbitrarias como destino del goto, mientras que el goto asignado de Fortran no permite expresiones arbitrarias como destino de salto. [ 16 ] Al igual que con el goto estándar en C, la extensión de GNU permite que el destino del goto calculado resida únicamente en la función actual. Intentar saltar fuera de la función actual produce un comportamiento no especificado. [ 16 ]&&void*
Algunas variantes de BASIC también admiten un goto calculado en el sentido utilizado en GNU C, es decir, en el que el destino puede ser cualquier número de línea, no solo uno de una lista. Por ejemplo, en MTS BASIC se podría escribir GOTO i*1000para saltar a la línea cuyo número sea 1000 veces el valor de una variable i (que podría representar una opción de menú seleccionada, por ejemplo). [ 17 ]
Las variables de etiqueta PL/I logran el efecto de la instrucción goto calculada o asignada.
ALTERAR
Hasta 1985, el estándar ANSI COBOL tenía una ALTERinstrucción que podía usarse para cambiar el destino de un GO TO, que debía estar en un párrafo aparte. La ALTERinstrucción se consideró obsoleta en el estándar COBOL de 1985 y se eliminó en 2002 (véase el código COBOL automodificable ). Esta característica, que permitía el polimorfismo , fue frecuentemente criticada y rara vez se usó. [ 18 ]
Perl ir a
Perl tiene una instrucción goto que toma el nombre de una función y transfiere el control sustituyendo efectivamente una llamada a función por otra (una llamada de cola ). La nueva función no regresa al goto, sino al lugar desde donde se llamó a la función original. [ 19 ]
Emulado ir a
Hay varios lenguajes que no admiten directamente goto, pero la emulación de goto proporciona cierta funcionalidad similar, aunque con restricciones. Se puede emular goto en Java, [ 20 ] JavaScript, [ 21 ] y Python. [ 7 ] [ 8 ]
Variable de etiqueta PL/I
El tipo de datos PL/I permite implementar tanto saltos con asignación como calculados, y posibilita bifurcaciones fuera del bloque actual. Un procedimiento puede recibir una etiqueta como argumento, la cual puede finalizar con una bifurcación. El valor de una variable de etiqueta incluye la dirección de un marco de pila, y un salto fuera de bloque elimina un elemento de la pila.label
A continuación se implementa una instrucción goto asignada.
declarar etiqueta donde ; donde = algún lugar ; ir a donde ; ... algún lugar: ...A continuación se implementa una instrucción goto calculada.
declare where ( 5 ) label ; declare inx fixed ; where ( 1 ) = abc ; where ( 2 ) = xyz ; ... goto where ( inx ); ... abc: ... xyz: ...Otra forma de obtener un resultado equivalente es utilizando una matriz de etiquetas constantes que no utilice una labelvariable:
declare inx fixed ; ... goto where ( inx ); ... where ( 1 ): ... where ( 2 ): ...Ejemplos
La sintaxis varía según el idioma, pero a menudo sigue un patrón similar. El objetivo del control se identifica como una etiqueta o un número de línea .
En un archivo por lotes de DOS , goto dirige la ejecución a una etiqueta; un identificador precedido por dos puntos. El destino de goto puede ser una variable. El siguiente ejemplo utiliza goto para implementar ramificaciones de múltiples rutas mediante un goto calculado.
@ echo off SET D8str = %date% SET D8dow = %D8str:~0,3%PARA %% D en ( Lun Mié Vie ) hacer si " %% D" == " %D8dow% " ir a TIENDA%%D echo Hoy, %D8dow% , no es día de compras. ir a fin: SHOPMon echo compra pizza para el almuerzo - El lunes es el día de la pizza. ir al final: SHOPWed echo compra Calzone para llevar a casa - hoy es miércoles. ir al final: SHOPFri echo compra agua con gas por si alguien quiere una bebida sin calorías. : finCrítica
En la reunión previa a ALGOL celebrada en 1959, Heinz Zemanek puso en duda explícitamente la necesidad de las sentencias goto, pero en ese momento, nadie prestó atención a su comentario, incluido Edsger W. Dijkstra , quien más tarde se convirtió en el icónico opositor de goto. [ 22 ] Las décadas de 1970 y 1980 vieron una disminución en el uso de las sentencias goto en favor del paradigma de programación estructurada , siendo goto criticado por conducir a código espagueti inmantenible . Algunos estándares de codificación de estilo de programación , por ejemplo, los Estándares de Codificación GNU Pascal, recomiendan en contra del uso de sentencias goto. [ 23 ] La prueba de Böhm-Jacopini (1966) no resolvió la cuestión de si adoptar la programación estructurada para el desarrollo de software, en parte porque la construcción era más propensa a oscurecer un programa que a mejorarlo porque su aplicación requiere la introducción de variables locales adicionales. [ 24 ] Sin embargo, sí provocó un importante debate entre científicos informáticos, educadores, diseñadores de lenguajes y programadores de aplicaciones que vio un cambio lento pero constante alejándose del uso anteriormente omnipresente de goto. Probablemente la crítica más famosa de goto sea una carta de 1968 de Edsger Dijkstra titulada " La instrucción goto se considera dañina" . [ 22 ] En esa carta, Dijkstra argumentó que las instrucciones goto sin restricciones deberían abolirse de los lenguajes de alto nivel porque complicaban la tarea de analizar y verificar la corrección de los programas (particularmente aquellos que involucran bucles). [ 25 ] La carta en sí provocó un debate, incluyendo una carta " ' GOTO se considera dañino'" [ 26 ] enviada a Communications of the ACM (CACM) en marzo de 1987, así como otras respuestas de otras personas, incluyendo la de Dijkstra titulada " Sobre una correspondencia algo decepcionante" . [ 27 ]
Un punto de vista alternativo se presenta en el libro de Donald Knuth , Structured Programming with go to Statements , que analiza muchas tareas de programación comunes y encuentra que en algunas de ellas goto es la construcción de lenguaje óptima para usar. [ 28 ] En The C Programming Language , Brian Kernighan y Dennis Ritchie advierten que goto es "infinitamente abusable", pero también sugieren que podría usarse para manejadores de errores de fin de función y para rupturas de varios niveles de bucles. [ 29 ] Estos dos patrones se pueden encontrar en numerosos libros posteriores sobre C de otros autores; [ 30 ] [ 31 ] [ 32 ] [ 33 ] un libro de texto introductorio de 2007 señala que el patrón de manejo de errores es una forma de sortear la "falta de manejo de excepciones incorporado dentro del lenguaje C". [ 30 ] Otros programadores, incluyendo al diseñador y codificador del kernel de Linux Linus Torvalds o al ingeniero de software y autor de libros Steve McConnell , también se oponen al punto de vista de Dijkstra, afirmando que goto puede ser una característica útil del lenguaje, mejorando la velocidad, el tamaño y la claridad del código del programa, pero solo cuando es utilizado de manera sensata por un programador igualmente sensato. [ 34 ] [ 35 ] Según el profesor de ciencias de la computación John Regehr , en 2013, había alrededor de 100 000 instancias de goto en el código del kernel de Linux. [ 36 ]
Otros académicos adoptaron un punto de vista más extremo y argumentaron que incluso instrucciones como breaky returndesde el medio de los bucles son una mala práctica ya que no son necesarias en el resultado de Böhm-Jacopini, y por lo tanto abogaron por que los bucles deberían tener un único punto de salida. [ 37 ] Por ejemplo, Bertrand Meyer escribió en su libro de texto de 2009 que instrucciones como breaky continue"son solo el viejo goto con piel de cordero". [ 38 ] Sin embargo, una forma ligeramente modificada del resultado de Böhm-Jacopini permite evitar variables adicionales en la programación estructurada, siempre que se permitan rupturas de varios niveles de los bucles. [ 39 ] Debido a que algunos lenguajes como C no permiten rupturas de varios niveles a través de su breakpalabra clave, algunos libros de texto aconsejan al programador que use goto en tales circunstancias. [ 33 ] El estándar MISRA C 2004 prohíbe goto, continue, así como las múltiples sentencias returny break. [ 40 ] La edición de 2012 del estándar MISRA C rebajó la prohibición de goto de "obligatoria" a "recomendativa"; la edición de 2012 tiene una regla adicional obligatoria que prohíbe solo los saltos hacia atrás, pero no hacia adelante, con goto. [ 41 ] [ 42 ]
FORTRAN introdujo construcciones de programación estructurada en 1978, y en revisiones sucesivas las reglas semánticas relativamente flexibles que rigen el uso permitido de goto se endurecieron; el "rango extendido" en el que un programador podía usar un goto para salir y volver a entrar en un bucle DO aún en ejecución se eliminó del lenguaje en 1978, [ 43 ] y para 1995 varias formas de goto de Fortran, incluyendo el goto calculado y el goto asignado, habían sido eliminadas. [ 44 ] Algunos lenguajes de programación modernos ampliamente utilizados como Java y Python carecen de la instrucción goto, aunque la mayoría proporciona algún medio para salir de una selección, o para salir o pasar al siguiente paso de una iteración. El punto de vista de que perturbar el flujo de control en el código es indeseable puede verse en el diseño de algunos lenguajes de programación, por ejemplo Ada [ 45 ] enfatiza visualmente las definiciones de etiquetas usando corchetes angulares .
La entrada 17.10 en la lista de preguntas frecuentes de comp.lang.c [ 46 ] aborda directamente el problema del uso de goto, indicando:
El estilo de programación, al igual que el estilo de escritura, es en cierto modo un arte y no puede codificarse mediante reglas inflexibles, aunque los debates sobre estilo a menudo parecen centrarse exclusivamente en dichas reglas. En el caso de la instrucción `goto`, se ha observado desde hace tiempo que su uso indiscriminado conduce rápidamente a un código espagueti inmanejable. Sin embargo, una simple prohibición irreflexiva de la instrucción `goto` no garantiza necesariamente una programación elegante: un programador poco estructurado es igualmente capaz de construir un enredo bizantino sin usar ninguna instrucción `goto` (quizás sustituyéndola por bucles anidados de forma extraña y variables de control booleanas). Muchos programadores adoptan una postura intermedia: generalmente se deben evitar las instrucciones `goto`, pero son aceptables en algunas situaciones bien definidas, si es necesario: como instrucciones `break` de varios niveles, para agrupar acciones comunes dentro de una instrucción `switch` o para centralizar tareas de limpieza en una función con varios retornos de error. (...) Ignorar ciertas construcciones a ciegas o seguir reglas sin comprenderlas puede generar tantos problemas como los que se suponía que debían evitar. Además, muchas opiniones sobre estilos de programación son solo eso: opiniones. Pueden estar fuertemente defendidas y fundamentadas, respaldadas por pruebas y argumentos aparentemente sólidos, pero las opiniones contrarias pueden ser igualmente firmes, fundamentadas y argumentadas. Generalmente es inútil enfrascarse en "guerras de estilo", porque en ciertos temas, los oponentes parecen incapaces de ponerse de acuerdo, o de aceptar estar en desacuerdo, o de dejar de discutir.
Patrones más aceptados
Aunque el uso general de goto ha disminuido, existen situaciones en las que goto proporciona una buena manera de expresar la lógica del programa. Si bien es posible expresar la lógica sin goto, el código equivalente es más largo o más difícil de entender. Las situaciones en las que es más probable que goto se considere aceptable incluyen: [ 34 ] [ 47 ]
- Manejo de errores, en particular código de limpieza como la desasignación de recursos. [ 30 ] [ 33 ] [ 48 ] [ 49 ] [ 50 ]
- Implementar una máquina de estados finitos usando una tabla de transición de estados y goto para cambiar entre estados (en ausencia de eliminación de llamadas de cola ), particularmente en código C generado automáticamente. [ 49 ] Por ejemplo, goto en el analizador LR canónico .
- Implementar saltos y continuaciones multinivel si no están directamente soportados en el lenguaje; este es un modismo común en C. [ 33 ] Aunque Java reserva la palabra clave goto, en realidad no la implementa. En cambio, Java implementa sentencias break y continue etiquetadas. [ 51 ] Según la documentación de Java, el uso de sentencias goto para saltos multinivel era el uso más común (90%) de sentencias goto en C. [ 52 ] Java no fue el primer lenguaje en adoptar este enfoque —prohibir goto, pero proporcionar saltos multinivel— el lenguaje de programación BLISS (más precisamente la versión BLISS-11) lo precedió en este aspecto. [ 53 ]
- Sustitutos de las instrucciones break o continue (retry) de un solo nivel cuando la posible introducción de bucles adicionales podría afectar incorrectamente el flujo de control. Esta práctica se ha observado en el código de NetBSD . [ 48 ]
- Extraer elementos de la pila en lenguajes como Algol y PL/I .
- Lenguajes de scripting especializados que operan de manera lineal, como un sistema de diálogo para videojuegos. [ 54 ]
Estos usos son relativamente comunes en C, pero mucho menos comunes en C++ u otros lenguajes con características de nivel superior. [ 50 ] Sin embargo, lanzar y capturar una excepción dentro de una función puede ser extraordinariamente ineficiente en algunos lenguajes; un ejemplo claro es Objective-C , donde goto es una alternativa mucho más rápida. [ 55 ]
Otro uso de goto es modificar código heredado mal factorizado , donde evitarlo requeriría una refactorización extensa o la duplicación de código . Por ejemplo, dada una función grande donde solo cierto código es relevante, goto permite saltar hacia o desde solo el código pertinente, sin modificar la función. Este uso se considera un mal olor de código [ 56 ] , pero se utiliza ocasionalmente.
Alternativas
Programación estructurada
El movimiento de programación estructurada tenía como objetivo eliminar la necesidad y el uso de la instrucción goto mediante la introducción de estructuras de control en un lenguaje como:
- Selección
- Tales como la instrucción condicional (es decir, if-then-else) y la instrucción switch.
- Iteración
- Sentencias de bucle como el bucle for , el bucle while y el bucle do while .
- Salida prematura
- finalizar la ejecución de la estructura de control o una sola iteración
- romper
- iterar
- dejar
- Algunos lenguajes, como PL/I , permiten nombrar la estructura de control.
foo : hacer i = 1 a 10 ; si i = 7 entonces iterar foo ; x ( i ) = 3 ; fin ;
Estos nuevos mecanismos de lenguaje reemplazaron el flujo de control equivalente que antes se escribía usando goto. La instrucción switch reemplaza el goto calculado, en el que la instrucción a la que saltar se determina dinámicamente (condicionalmente).
En determinadas condiciones, es posible eliminar las sentencias goto locales de los programas heredados reemplazándolas por sentencias de salida de bucle multinivel. [ 57 ]
Manejo de excepciones
En la práctica, una adhesión estricta a la plantilla básica de tres estructuras de la programación estructurada produce un código altamente anidado, debido a la incapacidad de salir prematuramente de una unidad estructurada, y una explosión combinatoria con datos de estado del programa bastante complejos para manejar todas las condiciones posibles.
Se han adoptado generalmente dos soluciones: una forma de salir prematuramente de una unidad estructurada y, más generalmente, el manejo de excepciones . Ambas ascienden por la estructura, devolviendo el control a los bloques o funciones que las contienen, pero no saltan a ubicaciones de código arbitrarias. Estas son análogas al uso de una instrucción return en una posición no terminal: no es estrictamente estructurado, debido a la salida temprana, pero es una relajación leve de las restricciones de la programación estructurada. En C, breaky continuepermiten terminar un bucle o continuar a la siguiente iteración , sin requerir una instrucción while o if adicional. En algunos lenguajes también son posibles los breaks multinivel. Para manejar situaciones excepcionales, se agregaron construcciones especializadas de manejo de excepciones , como try- catch- finallyen Java.
Los mecanismos de manejo de excepciones throw-catch también pueden ser fácilmente mal utilizados para crear estructuras de control no transparentes, al igual que se puede abusar de goto. [ 58 ]
llamada de cola
En un artículo presentado en la conferencia ACM de Seattle en 1977, Guy L. Steele resumió el debate sobre la instrucción goto y la programación estructurada, y observó que las llamadas a procedimientos en la posición final de un procedimiento pueden tratarse de manera óptima como una transferencia directa del control al procedimiento llamado, eliminando típicamente las operaciones innecesarias de manipulación de la pila. [ 59 ] Dado que tales "llamadas finales" son muy comunes en Lisp , un lenguaje donde las llamadas a procedimientos son omnipresentes, esta forma de optimización reduce considerablemente el costo de una llamada a procedimiento en comparación con la instrucción goto utilizada en otros lenguajes. Steele argumentó que las llamadas a procedimientos mal implementadas habían llevado a la percepción artificial de que la instrucción goto era barata en comparación con la llamada a procedimiento. Steele argumentó además que "en general, las llamadas a procedimientos pueden considerarse como instrucciones goto que también pasan parámetros, y pueden codificarse uniformemente como instrucciones JUMP en código máquina ", considerando las instrucciones de manipulación de la pila en código máquina "una optimización (¡en lugar de al revés!)". [ 59 ] Steele citó evidencia de que los algoritmos numéricos bien optimizados en Lisp podían ejecutarse más rápido que el código producido por los compiladores Fortran comerciales disponibles en ese momento porque el costo de una llamada a procedimiento en Lisp era mucho menor. En Scheme , un dialecto de Lisp desarrollado por Steele con Gerald Jay Sussman , la optimización de llamadas de cola es obligatoria. [ 60 ]
Aunque el artículo de Steele no introdujo muchas novedades en la informática, al menos tal como se practicaba en el MIT, puso de manifiesto el potencial de la optimización de llamadas a procedimientos, lo que convirtió las cualidades de modularidad de los procedimientos en una alternativa más viable a los hábitos de codificación entonces comunes de grandes procedimientos monolíticos con estructuras de control internas complejas y extensos datos de estado. En particular, las optimizaciones de llamadas de cola analizadas por Steele transformaron el procedimiento en una forma viable de implementar la iteración mediante una única recursión de cola (recursión de cola que llama a la misma función). Además, la optimización de llamadas de cola permite la recursión mutua de profundidad ilimitada, asumiendo llamadas de cola; esto posibilita la transferencia de control, como en las máquinas de estados finitos , que de otro modo se suele lograr con sentencias goto.
Corutina
Una corrutina es una relajación más radical de la programación estructurada, que permite no solo múltiples puntos de salida (como retornos en posiciones distintas a la cola), sino también múltiples puntos de entrada, similares a las sentencias goto. Una corrutina es más restringida que goto, ya que solo puede reanudar una corrutina en ejecución en puntos específicos (continuando después de un yield) en lugar de saltar a un punto arbitrario del código. Una forma limitada de corrutina es un generador . Aún más limitado es un cierre : una función que mantiene el estado (mediante variables estáticas ), pero no la posición de ejecución. Una combinación de variables de estado y control estructurado, en particular una sentencia switch general, puede permitir que una función reanude la ejecución en un punto arbitrario en llamadas posteriores, y es una alternativa estructurada a goto en ausencia de corrutinas. Este es un modismo común en C, por ejemplo.
Continuación
Una continuación es similar a un goto en que transfiere el control desde un punto arbitrario del programa a un punto marcado. Una continuación es más flexible que un goto, ya que puede transferir el control fuera de la función actual, algo que un goto no puede hacer en la mayoría de los lenguajes de programación estructurados. En aquellas implementaciones de lenguaje que mantienen marcos de pila para almacenar variables locales y argumentos de función, ejecutar una continuación implica ajustar la pila de llamadas del programa además de un salto. La función longjmp del lenguaje de programación C es un ejemplo de una continuación de escape que puede usarse para escapar del contexto actual a uno circundante. El operador GO de Common Lisp también tiene esta propiedad de desenrollado de pila, a pesar de que la construcción tiene ámbito léxico , ya que la etiqueta a la que se salta puede referenciarse desde un cierre .
En Scheme , una continuación puede transferir el control de un contexto externo a uno interno. Esto permite escribir estructuras de control como corrutinas y multitarea cooperativa. [ 60 ]
Véase también
- COMEFROM – Sentencia de control de flujo en lenguaje de programación; lo opuesto a goto
- GOSUB – Familia de lenguajes de programación. Páginas que muestran breves descripciones de destinos de redireccionamiento.
- Sentencia switch : instrucción de programación para el control de ramificación basado en un valor.
- Programación no estructurada : paradigma de programación que precede a la programación estructurada.
Notas
- ↑ Watt y Findlay 2004 .
- ↑ Kernighan y Ritchie 1988 , pág. 224, A9.6 Sentencias de salto.
- ↑ Sin embargo, es posible realizar saltos dentro de una cadena de llamadas utilizando lasfunciones setjmp/longjmp.
- ↑ Wagner 2021 .
- ↑ "Instrucción GoTo - Visual Basic | Microsoft Learn" . Microsoft Learn . 15 de septiembre de 2021. Consultado el 25 de septiembre de 2023 .
- ↑ Gosling et al. (2005) A diferencia de C y C++, el lenguaje de programación Java no tiene la instrucción goto; se utilizan etiquetas de identificación con instrucciones break (§14.15) o continue (§14.16) que aparecen en cualquier parte de la instrucción etiquetada. Las palabras clave const y goto están reservadas, aunque actualmente no se utilizan. Esto puede permitir que un compilador de Java genere mejores mensajes de error si estas palabras clave de C++ aparecen incorrectamente en los programas.
- 1 2 Hindle 2004 .
- 1 2 Noack et al. 2015 .
- ↑ Manual de PHP 2021 .
- ^ Galler 1962 , págs. 26-28, 197, 211.
- ↑ , lo que significa que el programa salta a la etiqueta 20, 30 o 40, en caso de que i sea menor que, igual a o mayor que cero.
- ↑ Lahey Computer Systems, Inc. 2004 .
- ↑ Microsoft 2021 .
- ↑ Wehr 1997 .
- ↑ z/OS 2.5.0 en la documentación de IBM 2021 .
- 1 2 GCC, la colección de compiladores GNU 2021 .
- ↑ Fronczak y Lubbers 1974 , pág. 226.
- ↑ Van Tassel 2004 .
- ↑ Manual de sintaxis de Perl 2021 .
- ↑ IR A Java 2009 .
- ↑ Sexton 2012 .
- 1 2 Dijkstra 1968 .
- ↑ Equipo de desarrollo de GNU Pascal 2005 , 5.1 Consejos variados de programación en Pascal.
- ↑ Louden y Lambert 2012 .
- ↑ "El uso indiscriminado de la instrucción goto tiene como consecuencia inmediata que resulta tremendamente difícil encontrar un conjunto de coordenadas significativas para describir el progreso del proceso. ... La instrucción 'go to', tal como está, es demasiado primitiva; es una invitación a que el programa se convierta en un desastre."
- ↑ Rubin 1987 .
- ↑ Dijkstra, Edsger W. Sobre una correspondencia algo decepcionante (EWD-1009) (PDF) . Archivo EW Dijkstra. Centro de Historia Americana, Universidad de Texas en Austin .( transcripción ) (mayo de 1987)
- ↑ Knuth 1974 .
- ↑ Kernighan y Ritchie 1988 , págs. 65–66, 3.8 Ir a y Etiquetas.
- 1 2 3 Vine 2007 , pág. 262.
- ↑ Geisler 2011 .
- ↑ Prata 2013 .
- 1 2 3 4 Sahni y Cmelik 1995 .
- 1 2 3 Andrews 2003 .
- ↑ McConnell 2004 .
- ↑ Regehr 2013 .
- ↑ Roberts 1995 .
- ↑ Meyer 2009 .
- ↑ Kozen y Tseng 2008 .
- ↑ Preguntas de Stack Overflow 2012 .
- ↑ Pitchford y Tapp 2013 .
- ↑ Williams 2013 .
- ↑ ANSI X3.9-1978. Estándar nacional estadounidense – Lenguaje de programación FORTRAN. Instituto Nacional Estadounidense de Estándares. También conocido como ISO 1539-1980, informalmente conocido como FORTRAN 77.
- ↑ ISO/IEC 1539-1:1997. Tecnología de la información – Lenguajes de programación – Fortran – Parte 1: Lenguaje base. Conocido informalmente como Fortran 95. Esta norma consta de dos partes adicionales. La Parte 1 ha sido adoptada formalmente por ANSI.
- ↑ Barnes 2006 .
- ↑ Cumbre 1995 .
- 1 2 Torvalds 2016 .
- 1 2 Spinellis 2003 .
- 1 2 Cozens 2004 .
- 1 2 Allain 2019 .
- ↑ Tutorial de Java 2012 .
- ↑ Gosling y McGilton 1996 .
- ^ Brender 2002 , págs .
- ↑ Hoad, Nathan (28 de julio de 2022). "nathanhoad/godot_dialogue_manager" . GitHub . Consultado el 3 de febrero de 2023 .
- ↑ Chisnall 2012 .
- ↑ Contieri 2021 .
- ↑ Ramshaw 1988 .
- ↑ Siedersleben 2006 .
- 1 2 Steele 1977 .
- ^ Kelsey , Clinger y Rees 1998 .
Referencias
- Allain, Alex (2019). "Cuándo usar goto en C" . Recuperado el 14 de noviembre de 2021 .
- Andrews, Jeremy (13 de enero de 2003). "Linux: Uso de goto en el código del kernel" . Archivado del original el 28 de noviembre de 2005. Recuperado el 14 de noviembre de 2021 .
- Barnes, John (30 de junio de 2006). Programación en Ada 2005. Addison Wesley . págs. 114-115. ISBN 978-0-321-34078-8.
- Brender, Ronald F. (2002). "El lenguaje de programación BLISS: una historia" (PDF) . Software: Practice and Experience . 32 (10): 955– 981. doi : 10.1002/spe.470 . S2CID 45466625 .
- Chisnall, David (2012). Objective-C Phrasebook . Addison - Wesley Professional. pág. 249. ISBN 978-0-321-81375-6.
- Contieri, Maxi (2021-11-02). "Code Smell 100 - GoTo" . Maximiliano Contieri - Diseño de software . Archivado del original el 11-11-2021 . Recuperado el 14-11-2021 .
- Cozens, Simon (16 de abril de 2004). "Buenos usos de goto" . Simon y Henrietta Cozens . Archivado del original el 19 de marzo de 2011.
- Dijkstra, Edsger W. (marzo de 1968). "Cartas al editor: Ir a la declaración considerada dañina" (PDF) . Communications of the ACM . 11 (3): 147– 148. doi : 10.1145/362929.362947 . S2CID 17469809 .
- Dijkstra, Edsger W. Sobre una correspondencia algo decepcionante (EWD-1009) (PDF) . Archivo EW Dijkstra. Centro de Historia Americana, Universidad de Texas en Austin .( transcripción )
- Fronczak, Edward J.; Lubbers, Clark E. (septiembre de 1974). MTS, Michigan Terminal System . Centro de Computación de la Universidad de Michigan. UOM:39015034770076.
- Galler, Bernard A. (1 de enero de 1962). El lenguaje de las computadoras (PDF) . McGraw-Hill.
- GCC, la Colección de Compiladores GNU (2021). "Etiquetas como valores: uso de la Colección de Compiladores GNU (GCC)" . Gcc.gnu.org . Consultado el 13 de noviembre de 2021 .
- Geisler, Sandra (2011). C All-in-One Desk Reference For Dummies . John Wiley & Sons. pp. 217–220 . ISBN 978-1-118-05424-6.
- Equipo de desarrollo de GNU Pascal (2005). "Estándares de codificación de GNU Pascal" . www.gnu-pascal.de . Fundación del Software Libre . Consultado el 10 de noviembre de 2021 .
- Gosling, James ; McGilton, Henry (mayo de 1996). "El entorno del lenguaje Java" . Oracle.com . Recuperado el 22 de julio de 2014 .
- Gosling, James; Joy, Bill ; Steele, Guy Lewis ; Bracha, Gilad (2005). Especificación del lenguaje Java (3.ª ed.). Addison-Wesley. ISBN 0-321-24678-0Archivado del original el 14 de febrero de 2012. Consultado el 8 de febrero de 2019 .
- GOTO para Java (6 de julio de 2009). "GOTO para Java" . steik . Archivado del original el 15 de junio de 2012. Recuperado el 28 de abril de 2012 .
- Hindle, Richie (1 de abril de 2004). "goto para Python" . Entrian Solutions . Hertford, Reino Unido: Entrian Solutions Ltd. Recuperado el 10 de noviembre de 2021 .
- Tutorial de Java (28/02/2012). "Instrucciones de ramificación (Tutoriales de Java > Aprendiendo el lenguaje Java > Conceptos básicos del lenguaje)" . Docs.oracle.com . Consultado el 10/11/2021 .
- Kelsey, R.; Clinger, W.; Rees, J.; et al. (agosto de 1998). " Informe revisado 5 sobre el esquema del lenguaje algorítmico" . Higher-Order and Symbolic Computation . 11 (1): 7– 105. doi : 10.1023/A:1010051815785 . S2CID 14069423 .
- Kernighan, Brian Wilson ; Ritchie, Dennis MacAlistair (1988). Lenguaje de programación C (2.ª ed.). Prentice Hall. ISBN 978-0-13-308621-8.
- Knuth, Donald (1974). "Programación estructurada con instrucciones go to" (PDF) . Computing Surveys . 6 (4): 261– 301. CiteSeerX 10.1.1.103.6084 . doi : 10.1145/356635.356640 . S2CID 207630080. Archivado del original (PDF) el 17 de julio de 2017. Recuperado el 26 de enero de 2017 .
- Kozen, Dexter ; Tseng, Wei-Lung Dustin (julio de 2008). "El teorema de Böhm-Jacopini es falso, proposicionalmente" (PDF) . En Audebaud, Philippe; Paulin-Mohring, Christine (eds.). Matemáticas de la construcción de programas . 9.ª Conferencia Internacional MPC 2008. Lecture Notes in Computer Science. Vol. 5133. Marsella, Francia. pp. 177-192. CiteSeerX 10.1.1.218.9241 . doi : 10.1007/978-3-540-70594-9_11 . ISBN 978-3-540-70593-2.
- Lahey Computer Systems, Inc. (2004). "Computed GOTO Statement (obsoleto)" . Lahey Computer Systems, Inc. Archivado del original el 26 de mayo de 2016. Consultado el 10 de noviembre de 2021 .
- Louden, Kenneth C.; Lambert, Kenneth A. (2012). Lenguajes de programación: principios y prácticas . Cengage Learning. pág . 422. ISBN 978-1-111-52941-3.
- McConnell, Steve (diciembre de 2004). Code Complete: A Practical Handbook of Software Construction, Second Edition (2.ª ed.). Microsoft Press. ISBN 978-0735619678.
- Meyer, Bertrand (2009). Un toque de distinción: Aprender a programar bien con objetos y contratos . Springer Science & Business Media. pág. 189. ISBN 978-3-540-92144-8.
- Microsoft (2021) .Las instrucciones 'On GoTo' y 'On GoSub' ya no son compatibles . Microsoft . Consultado el 10 de noviembre de 2021 .
- Noack, Sebastian; Blank, Douglas; Grainger, Thomas; spacewander (19 de septiembre de 2015). "snoack/python-goto: Un decorador de funciones que reescribe el código de bytes para habilitar goto en Python" . GitHub . Consultado el 10 de noviembre de 2021 .
- Manual de sintaxis de Perl (2021). Ir a (Informe) . Consultado el 14 de noviembre de 2021 .
- Manual de PHP (2021). "ir a" . PHP . Consultado el 13 de noviembre de 2021 .
- Pitchford, Mark; Tapp, Chris (25 de febrero de 2013). "MISRA C:2012: Muchas buenas razones para cambiar" . Electronic Design . Recuperado el 22 de julio de 2014 .
- Prata, Stephen (2013). C Primer Plus . Addison-Wesley. págs. 287-289 . ISBN 978-0-13-343238-1.
- Ramshaw, L. (1988). "Eliminar las instrucciones goto mientras se preserva la estructura del programa" . Journal of the ACM . 35 (4): 893– 920. doi : 10.1145/48014.48021 . S2CID 31001665 .
- Regehr, John (4 de febrero de 2013). "Uso de Goto en el código de sistemas: integrado en el ámbito académico" . blog.regehr.org .
- Roberts, Eric S. (marzo de 1995). "Salidas de bucle y programación estructurada: reabriendo el debate" . Boletín ACM SIGCSE . 27 (1): 268– 272. doi : 10.1145/199691.199815 .
- Rubin, Frank (marzo de 1987) ."GOTO Considered Harmful" Considered Harmful" (PDF) . Communications of the ACM . 30 (3): 195–196 . doi : 10.1145/214748.315722 . S2CID 6853038. Archivado del original (PDF) el 20 de marzo de 2009.
- Sahni, Sartaj; Cmelik, Bob (1995). Desarrollo de software en C. Prensa de silicio. pag. 135.ISBN 978-0-929306-16-2.
- Sexton, Alex (2012). "El verano de Goto | Página oficial de Goto.js" . Archivado del original el 25 de octubre de 2015. Recuperado el 27 de abril de 2012 .
- Siedersleben, Johannes (2006). «Errores y excepciones: derechos y obligaciones». En Christophe Dony (ed.). Temas avanzados en técnicas de manejo de excepciones . Springer Science & Business Media. pág. 277. ISBN 978-3-540-37443-5.
- Spinellis, Diomidis (27 de mayo de 2003). Lectura de código: La perspectiva del código abierto . Addison-Wesley Professional. págs. 43–44 . ISBN 978-0-672-33370-5.
- Preguntas de Stack Overflow (11/06/2012). "¿Por qué "continue" se considera una violación de C en MISRA C:2004?" . Stack Overflow . Consultado el 10/11/2021 .
- Steele, Guy Lewis (enero de 1977). «Desmintiendo el mito de la “llamada a procedimiento costosa” o, implementaciones de llamadas a procedimiento consideradas perjudiciales o, LAMBDA». Actas de la conferencia anual de 1977 sobre ACM '77 . págs. 153–162 . doi : 10.1145/800179.810196 . ISBN 9781450323086. S2CID 9807843 .
- Stroustrup, Bjarne (9 de enero de 2012). "Discurso principal del día 1: Bjarne Stroustrup: estilo C ++ 11 | GoingNative 2012 | Canal 9" . Canal9.msdn.com . Consultado el 10 de noviembre de 2021 .
- Summit, Steve (1995). "comp.lang.c FAQ list · Pregunta 17.10" . C-faq.com . Consultado el 10 de noviembre de 2021 .
- Especificación del lenguaje de programación Go (26 de julio de 2021). "Especificación del lenguaje de programación Go - el lenguaje de programación Go" .
- Torvalds, Linus (2016). "Estilo de codificación del kernel de Linux" . La documentación del kernel de Linux . Recuperado el 10 de noviembre de 2021 .
- Van Tassel, Dennie (8 de julio de 2004). "Historia de las etiquetas en los lenguajes de programación" . Archivado del original el 18 de septiembre de 2024. Recuperado el 4 de enero de 2011 .
- Vine, Michael A. (2007). Programación en C para principiantes absolutos . Cengage Learning. ISBN 978-1-59863-634-5.
- Wagner, Bill (2021). "Instrucción goto - Referencia de C#" . docs.microsoft.com . Recuperado el 09/11/2021 .
- Watt, David Anthony; Findlay, William (2004). Conceptos de diseño de lenguajes de programación . John Wiley & Sons. pág . 228. ISBN 978-0-470-85320-7.
- Wehr, Jason (1997). "Ir a (asignado)" . www.personal.psu.edu/jhm/f90/201.html . Archivado del original el 21 de enero de 2022. Recuperado el 13 de noviembre de 2021 .
- Wilkes, Maurice V .; Wheeler, David J .; Gill, Stanley (1951). La preparación de programas para una computadora digital electrónica . Addison-Wesley .
(a veces llamado WWG , por las iniciales de sus autores) fue el primer libro sobre programación de computadoras .
- Williams, Tom (marzo de 2013). "Verificación de las reglas para C: Garantizando la confiabilidad y la seguridad" . Revista RTC . 22 (3): 12– 15. Recuperado el 10 de noviembre de 2021 .
- z/OS 2.5.0 en la documentación de IBM (2021). "Instrucción goto calculada (extensión de IBM)" . IBM . Consultado el 13 de noviembre de 2021. Este
documento describe la sintaxis, la semántica y la implementación de IBM z/OS XL C/C++ de los lenguajes de programación C y C++. Para una referencia estándar de propósito general de C o C++, consulte cppreference.com.
{{cite web}}: CS1 maint: nombres numéricos: lista de autores ( enlace )
- Comandos BÁSICOS
- Flujo de control
- Edsger W. Dijkstra