stringtranslate.com

Ir a

Tecla " GOTO " en la computadora doméstica ZX Spectrum de 1982, implementada con BASIC nativo (entrada de comando con una sola tecla).

Goto ( goto , GOTO , GO TO , GoTo u otras combinaciones de casos, según el lenguaje de programación) es una declaración que se encuentra en muchos lenguajes de programación de computadoras . Realiza una transferencia de control unidireccional a otra línea de código; por el contrario, una llamada a función normalmente devuelve el control. Las ubicaciones a las que se salta generalmente se identifican mediante etiquetas , aunque algunos idiomas usan números de línea . A nivel de código de máquina , a gotoes una forma de declaración de salto o rama , en algunos casos combinada con un ajuste de pila. Muchos idiomas apoyan la gotodeclaración y muchos no (ver § soporte de idiomas).

El teorema del programa estructurado demostró que el gotoenunciado no es necesario para escribir programas que puedan expresarse como diagramas de flujo ; alguna combinación de las tres construcciones de programación de secuencia, selección/elección y repetición/iteración es suficiente para cualquier cálculo que pueda realizar una máquina de Turing , con la salvedad de que es posible que sea necesario introducir duplicación de código y variables adicionales. [1]

El uso de goto era común anteriormente, pero desde la llegada de la programación estructurada en las décadas de 1960 y 1970, su uso ha disminuido significativamente. Sigue utilizándose en ciertos patrones de uso comunes, pero generalmente se utilizan alternativas si están disponibles. En el pasado, hubo un debate considerable en el mundo académico y la industria sobre las ventajas del uso de declaraciones goto. La principal crítica es que el código que utiliza declaraciones goto es más difícil de entender que las construcciones alternativas. Los debates sobre sus usos (más limitados) continúan en los círculos académicos y de la industria del software.

Uso

goto label

La gotodeclaración a menudo se combina con la declaración if para provocar una transferencia de control condicional.

IF condition THEN goto label

Los lenguajes de programación imponen diferentes restricciones con respecto al destino de una gotodeclaración. Por ejemplo, el lenguaje de programación C no permite saltar a una etiqueta contenida dentro de otra función, [2] sin embargo, los saltos dentro de una sola cadena de llamadas son posibles usando las funciones setjmp/longjmp .

Crítica

En la reunión previa a ALGOL celebrada en 1959, Heinz Zemanek puso en duda explícitamente la necesidad de las declaraciones GOTO; en ese momento nadie [ cita necesaria ] prestó atención a su comentario, incluido Edsger W. Dijkstra , quien más tarde se convirtió en el oponente icónico de GOTO. [3] Las décadas de 1970 y 1980 vieron una disminución en el uso de declaraciones GOTO a favor del paradigma de programación estructurada , con GOTO criticado por conducir a un código espagueti que no se puede mantener . Algunos estándares de codificación de estilos de programación , por ejemplo los estándares de codificación GNU Pascal, recomiendan no utilizar declaraciones GOTO. [4] La prueba de Böhm-Jacopini (1966) no resolvió la cuestión de si adoptar programación estructurada para el desarrollo de software, en parte porque era más probable que la construcción oscureciera un programa que lo mejorara porque su aplicación requiere la introducción de conocimientos locales adicionales. variables. [5] Sin embargo, desató un destacado debate entre científicos informáticos, educadores, diseñadores de lenguajes y programadores de aplicaciones que vieron un alejamiento lento pero constante del uso anteriormente ubicuo de GOTO. Probablemente la crítica más famosa a GOTO sea una carta de 1968 de Edsger Dijkstra titulada " Declaración de Go-to considerada dañina ". [3] En esa carta, Dijkstra argumentó que las declaraciones GOTO sin restricciones deberían ser abolidas de los lenguajes de nivel superior porque complicaban la tarea de analizar y verificar la corrección de los programas (particularmente aquellos que involucran bucles). [6] La carta en sí provocó un debate, incluida una carta ""GOTO considerada dañina" [7] enviada a Comunicaciones del ACM (CACM) en marzo de 1987, así como otras respuestas de otras personas, incluido On de Dijkstra. "Una correspondencia algo decepcionante" . [8]

Un punto de vista alternativo se presenta en Programación estructurada de Donald Knuth con declaraciones go to , que analiza muchas tareas de programación comunes y encuentra que en algunas de ellas GOTO es el constructo de lenguaje óptimo a usar. [9] En The C Programming Language , Brian Kernighan y Dennis Ritchie advierten que gotoes "infinitamente abusable", pero también sugieren que podría usarse para controladores de errores de fin de función y para interrupciones de bucles de varios niveles. [10] Estos dos patrones se pueden encontrar en numerosos libros posteriores sobre C de otros autores; [11] [12] [13] [14] un libro de texto introductorio de 2007 señala que el patrón de manejo de errores es una forma de solucionar la "falta de manejo de excepciones integrado dentro del lenguaje C". [11] Otros programadores, incluido el diseñador y codificador del kernel de Linux Linus Torvalds o el ingeniero de software y autor de libros Steve McConnell , también objetan el punto de vista de Dijkstra, afirmando que los GOTO pueden ser una característica útil del lenguaje, mejorando la velocidad, el tamaño y la claridad del código del programa. pero sólo cuando lo utiliza de forma sensata un programador igualmente sensato. [15] [16] Según el profesor de informática John Regehr , en 2013, había alrededor de 100.000 instancias de goto en el código del kernel de Linux. [17]

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. [18] Por ejemplo, Bertrand Meyer escribió en su libro de texto de 2009 que instrucciones como breaky continue"son simplemente las viejas gotocon piel de oveja". [19] 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 interrupciones de bucles de varios niveles. [20] Debido a que algunos lenguajes como C no permiten saltos de varios niveles a través de su breakpalabra clave, algunos libros de texto recomiendan al programador utilizarlos gotoen tales circunstancias. [14] La norma MISRA C 2004 prohíbe goto, continue, así como declaraciones múltiples returny . [21] La edición de 2012 de la norma MISRA C rebajó la prohibición de "obligatoria" a "consultiva"; La edición de 2012 tiene una regla adicional obligatoria que prohíbe solo los saltos hacia atrás, pero no hacia adelante, con . [22] [23]breakgotogoto

FORTRAN introdujo construcciones de programación estructurada en 1978, y en revisiones sucesivas se hicieron más estrictas las reglas semánticas relativamente flexibles que rigen el uso permitido de goto; 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 fue eliminado del lenguaje en 1978, [24] y en 1995 varias formas de Fortran GOTO, incluido Computed GOTO y el GOTO asignado, había sido eliminado. [25] Algunos lenguajes de programación modernos ampliamente utilizados, como Java y Python , carecen de la declaración GOTO (consulte soporte de lenguaje), aunque la mayoría proporciona algún medio para salir de una selección, o salir o pasar al siguiente paso de una iteración. . El punto de vista de que alterar 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 [26] enfatiza visualmente las definiciones de etiquetas usando corchetes angulares .

La entrada 17.10 en la lista de preguntas frecuentes de comp.lang.c [27] aborda la cuestión del uso de GOTO directamente, indicando

El estilo de programación, como el estilo de escritura, es algo así como un arte y no puede codificarse mediante reglas inflexibles, aunque las discusiones sobre estilo a menudo parecen centrarse exclusivamente en torno a dichas reglas. En el caso de la declaración goto, se ha observado durante mucho tiempo que el uso ilimitado de goto conduce rápidamente a un código espagueti que no se puede mantener. Sin embargo, una prohibición simple e irreflexiva de la declaración goto no conduce necesariamente de inmediato a una programación hermosa: un programador no estructurado es igualmente capaz de construir una maraña bizantina sin usar ningún goto (quizás sustituyendo bucles extrañamente anidados y variables de control booleanas). . Muchos programadores adoptan una postura moderada: los goto generalmente deben evitarse, pero son aceptables en algunas situaciones bien restringidas, si es necesario: como declaraciones de interrupción de varios niveles, para fusionar acciones comunes dentro de una declaración de cambio o para centralizar tareas de limpieza en una función con varios retornos de error. (...) Evitar ciegamente ciertas construcciones o seguir reglas sin comprenderlas puede llevar a tantos problemas como los que se suponía que las reglas debían evitar. Además, muchas opiniones sobre el estilo de programación son sólo eso: opiniones. Pueden estar fuertemente argumentadas y sentidas, pueden estar respaldadas por evidencia y argumentos aparentemente sólidos, pero las opiniones contrarias pueden sentirse, apoyarse y argumentarse con la misma fuerza. Generalmente es inútil dejarse arrastrar a "guerras de estilos", porque en ciertos temas, los oponentes nunca parecen estar de acuerdo, o aceptar estar en desacuerdo, o dejar de discutir.

Patrones de uso comunes

Si bien el uso general de goto ha ido disminuyendo, todavía hay situaciones en algunos lenguajes en los que goto proporciona la forma más corta y directa de expresar la lógica de un programa (si bien es posible expresar la misma lógica sin gotos, el código equivalente será más largo). y muchas veces más difíciles de entender). En otros lenguajes, existen alternativas estructuradas, en particular excepciones y llamadas finales.

Las situaciones en las que goto suele ser útil incluyen:

Estos usos son relativamente comunes en C, pero mucho menos comunes en C++ u otros lenguajes con características de nivel superior. [34] Sin embargo, lanzar y detectar una excepción dentro de una función puede ser extraordinariamente ineficiente en algunos lenguajes; un buen ejemplo es Objective-C , donde goto es una alternativa mucho más rápida. [37]

Otro uso de las sentencias goto es modificar código heredado mal factorizado , donde evitar un goto requeriría una extensa refactorización o duplicación de código . Por ejemplo, dada una función grande donde solo cierto código es de interés, una instrucción goto permite saltar hacia o desde solo el código relevante, sin modificar la función de otra manera. Este uso se considera olor a código , [38] pero encuentra uso ocasional.

Alternativas

Programación estructurada

La noción moderna de subrutina fue inventada por David Wheeler al programar el EDSAC . Para implementar una llamada y un retorno en una máquina sin una instrucción de llamada de subrutina, utilizó un patrón especial de código automodificable, conocido como salto de Wheeler . [39] Esto dio como resultado la capacidad de estructurar programas utilizando ejecuciones bien anidadas de rutinas extraídas de una biblioteca. Esto no habría sido posible usando only goto, ya que el código de destino, extraído de la biblioteca, no sabría a dónde regresar.

Posteriormente, se diseñaron lenguajes de alto nivel como Pascal en torno al soporte de la programación estructurada , que se generalizó desde subrutinas (también conocidas como procedimientos o funciones) hacia estructuras de control adicionales como:

Estos nuevos mecanismos de lenguaje reemplazaron flujos equivalentes que anteriormente se habrían escrito usando gotosys if. La bifurcación multidireccional reemplaza el "goto calculado" en el que la instrucción a la que saltar se determina dinámicamente (condicionalmente).

Bajo ciertas condiciones, es posible eliminar declaraciones goto locales de programas heredados reemplazándolas con declaraciones de salida de bucle multinivel. [40]

Excepciones

En la práctica, una adherencia 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.

Generalmente se han adoptado dos soluciones: una forma de salir prematuramente de una unidad estructurada y, de manera más general, excepciones : en ambos casos, éstas suben por la estructura, devolviendo el control a los bloques o funciones circundantes, pero no saltan a ubicaciones de código arbitrarias. Estos son análogos al uso de una declaración de retorno en una posición no terminal: no estrictamente estructurada, debido a una salida anticipada, pero sí una leve relajación de las restricciones de la programación estructurada. En C, breakpermite continueterminar un bucle o continuar con la siguiente iteración , sin requerir una whiledeclaración adicional if. En algunos idiomas también son posibles las pausas de varios niveles. Para manejar situaciones excepcionales, se agregaron construcciones especializadas en manejo de excepciones , como try// en Java.catchfinally

También se puede abusar fácilmente de los mecanismos de manejo de excepciones throw-catch para crear estructuras de control no transparentes, al igual que se puede abusar de goto. [41]

Llamadas de cola

En un artículo presentado en la conferencia ACM en Seattle en 1977, Guy L. Steele resumió el debate sobre 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 más óptima como una transferencia directa de control. al procedimiento llamado, eliminando normalmente operaciones innecesarias de manipulación de la pila. [42] Dado que tales "llamadas de cola" 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 el GOTO utilizado en otros lenguajes. Steele argumentó que las llamadas a procedimientos mal implementadas habían llevado a una percepción artificial de que el GOTO era barato en comparación con la llamada a procedimientos. Steele argumentó además que "en general, las llamadas a procedimientos pueden considerarse útiles como declaraciones GOTO que también pasan parámetros y pueden codificarse uniformemente como instrucciones JUMP de código de máquina ", y que las instrucciones de manipulación de la pila de código de máquina "se consideran una optimización (en lugar de viceversa). !)". [42] 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 comerciales de Fortran disponibles en ese momento porque el costo de una llamada a un procedimiento en Lisp era mucho menor. En Scheme , un dialecto Lisp desarrollado por Steele con Gerald Jay Sussman , la optimización de las llamadas de cola es obligatoria. [43]

Aunque el artículo de Steele no introdujo muchas novedades en la informática, al menos tal como se practicaba en el MIT, sacó a la luz el alcance de la optimización de llamadas a procedimientos, lo que convirtió las cualidades de los procedimientos que promueven la modularidad en una alternativa más creíble a la hábitos de codificación entonces comunes de grandes procedimientos monolíticos con complejas estructuras de control interno y extensos datos de estado. En particular, las optimizaciones de llamadas de cola discutidas por Steele convirtieron el procedimiento en una forma creíble de implementar la iteración mediante recursión de cola única (recursión de cola llamando a la misma función). Además, la optimización de llamadas de cola permite la recursividad mutua de profundidad ilimitada, asumiendo llamadas de cola; esto permite la transferencia de control, como en las máquinas de estados finitos , que de otro modo generalmente se logra con declaraciones goto.

Corrutinas

Las corrutinas son una relajación más radical de la programación estructurada, permitiendo no solo múltiples puntos de salida (como en los retornos en posición no final), sino también múltiples puntos de entrada, similares a las declaraciones goto. Las corrutinas son más restringidas que goto, ya que solo pueden reanudar una corrutina actualmente en ejecución en puntos específicos (continuando después de un rendimiento) en lugar de saltar a un punto arbitrario en el código. Una forma limitada de corrutinas son los generadores , que son suficientes para algunos propósitos. Aún más limitados son los cierres : subrutinas que mantienen el estado (a través de variables estáticas ), pero no la posición de ejecución. Una combinación de variables de estado y control estructurado, en particular una declaración de cambio general, puede permitir que una subrutina reanude la ejecución en un punto arbitrario en llamadas posteriores, y es una alternativa estructurada a las declaraciones goto en ausencia de corrutinas; este es un modismo común en C, por ejemplo.

Continuaciones

Una continuación es similar a GOTO en que transfiere el control desde un punto arbitrario del programa a un punto previamente marcado. Una continuación es más flexible que GOTO en aquellos lenguajes que la admiten, porque puede transferir el control fuera de la función actual, algo que 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 el almacenamiento de variables locales y argumentos de funciones, 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 Common Lisp GO también tiene esta propiedad de desenrollado de pila, a pesar de que la construcción tiene un alcance léxico , ya que se puede hacer referencia a la etiqueta a la que se saltará desde un cierre .

En Scheme , las continuaciones pueden incluso mover el control de un contexto externo a uno interno si se desea. Este control casi ilimitado sobre qué código se ejecuta a continuación hace que las estructuras de control complejas, como las corrutinas y la multitarea cooperativa, sean relativamente fáciles de escribir. [43]

Paso de mensajes

En paradigmas no procesales, goto es menos relevante o está completamente ausente. Una de las principales alternativas es el paso de mensajes , que es de particular importancia en computación concurrente , comunicación entre procesos y programación orientada a objetos . En estos casos, los componentes individuales no tienen una transferencia arbitraria de control, pero el control general puede programarse de formas complejas, como mediante preferencia . Los influyentes lenguajes Simula y Smalltalk estuvieron entre los primeros en introducir los conceptos de mensajes y objetos. Al encapsular datos de estado, la programación orientada a objetos redujo la complejidad del software a las interacciones (mensajes) entre objetos.

Variaciones

Hay varias construcciones de lenguaje diferentes en la clase de declaraciones goto .

.mw-parser-output .vanchor>:target~.vanchor-text{background-color:#b1d2ff}@media screen{html.skin-theme-clientpref-night .mw-parser-output .vanchor>:target~.vanchor-text{background-color:#0f4dc9}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .vanchor>:target~.vanchor-text{background-color:#0f4dc9}}IR A calculadoyAsignado IR A

En Fortran , un calculadoGOTO 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. [44] La construcción equivalente en C es la instrucción switch , y en el nuevo Fortran una SELECT CASEconstrucción es la alternativa sintáctica recomendada. [45] BASIC tenía una 'On GoTo'declaración que lograba el mismo objetivo, pero en Visual Basic esta construcción ya no es compatible. [46]

En versiones anteriores a Fortran 95, Fortran también tenía una variante goto asignada que transfiere el control a una etiqueta de declaración (número de línea) que se almacena (asigna a) una variable entera. Lamentablemente, era posible saltar a una variable entera a la que no se le había ASIGNADO y era una fuente importante de errores relacionados con los gotos asignados. [47] La assign​​declaración Fortran solo permite asignar un número de línea constante (existente) a la variable entera. Sin embargo, algunos compiladores permitieron tratar accidentalmente esta variable como un número entero a partir de entonces, por ejemplo, incrementarla, lo que resultó en un comportamiento no especificado en ese gotomomento. El siguiente código demuestra el comportamiento de la goto ilínea i cuando no se especifica:

 asigne 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 C/C++ no estándar relacionadas con gotos introducidos originalmente por gcc . [48] ​​La extensión GNU permite obtener la dirección de una etiqueta dentro de la función actual utilizando el operador de valor de etiquetavoid* de prefijo unario . La instrucción goto también se amplía para permitir saltar 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, porque permite expresiones de puntero arbitrarias como objetivo de salto, mientras que el goto asignado de Fortran no permite expresiones arbitrarias como objetivo de salto. [49] Al igual que con el goto estándar en C, la extensión GNU C permite que el destino del goto calculado resida solo en la función actual. Intentar saltar fuera de la función actual da como resultado un comportamiento no especificado. [49] &&void*

Algunas variantes de BASIC también soportan un GOTO calculado en el sentido usado en GNU C, es decir, en el que el objetivo puede ser cualquier número de línea, no sólo uno de una lista. Por ejemplo, en MTS BASIC se podría escribir GOTO i*1000para saltar a la línea numerada 1000 veces el valor de una variable i (que podría representar una opción de menú seleccionada, por ejemplo). [50]

Las variables de etiqueta PL/I logran el efecto de GOTOs calculados o asignados.

ALTERAR

Hasta el estándar ANSI COBOL de 1985 tenía la declaración ALTER que podía usarse para cambiar el destino de un GO TO existente, que tenía que estar en un párrafo aparte. [51] La característica, que permitía el polimorfismo , fue frecuentemente condenada y rara vez utilizada. [52]

Perl IR A

En Perl , existe una variante de la gotodeclaración que no es en absoluto una declaración GOTO tradicional. Toma un nombre de función y transfiere el control sustituyendo efectivamente una llamada de función por otra (una llamada de cola ): la nueva función no regresará a GOTO, sino al lugar desde donde se llamó la función original. [53]

Ir a emulado

Hay varios lenguajes de programación que no admiten GOTO de forma predeterminada. Al utilizar la emulación GOTO, todavía es posible utilizar GOTO en estos lenguajes de programación, aunque con algunas restricciones. Se puede emular GOTO en Java, [54] JavaScript, [55] y Python. [56] [57]

Variables de etiqueta PL/I

PL/I tiene el tipo de datos LABEL , que se puede utilizar para implementar tanto el "goto asignado" como el "goto calculado". PL/I permite ramas fuera del bloque actual. Un procedimiento que llama puede pasar una etiqueta como argumento a un procedimiento llamado que luego puede salir con una rama. El valor de una variable de etiqueta incluye la dirección de un marco de pila, y al salir del bloque se abre la pila.

/* Esto implementa el equivalente de */ /* el goto asignado */ declarar dónde etiqueta; donde = en algún lugar; Ir a dónde; ... en algún lugar: /* declaración */ ; ...
/* Esto implementa el equivalente de */ /* el goto calculado */ declarar donde (5) etiqueta; declarar inx fijo; donde(1) = abc; donde(2) = xyz; ... ir a donde(inx); ... abc: /* declaración */ ; ... xyz: /* declaración */ ; ...

Una forma más sencilla de obtener un resultado equivalente es usar una matriz constante de etiqueta que ni siquiera necesita una declaración explícita de una variable de tipo LABEL :

/* Esto implementa el equivalente de */ /* el goto calculado */ declarar inx fijo; ... ir a donde(inx); ... donde(1): /* declaración */ ; ... donde(2): /* declaración */ ; ...

MS/DOS IR A

En un archivo por lotes de DOS , Goto dirige la ejecución a una etiqueta que comienza con dos puntos. El objetivo de Goto puede ser una variable.

@ eco desactivado SET  D8str = %fecha% SET  D8dow = %D8str:~0,3%FOR  %% D in  ( lunes miércoles viernes )  do  if  " %% D"  ==  " %D8dow% "  goto  SHOP%%D echo Hoy, %D8dow% , no es un día de compras. ir al  final: SHOPMon echo comprar pizza para el almuerzo - El lunes es el día de la pizza. ir al  final: COMPRARMiércoles , compre Calzone para llevar a casa; hoy es miércoles. ir al  final: SHOPFri echo, compre Seltzer en caso de que alguien quiera una bebida sin calorías. : fin

Ayuda de idioma

Muchos idiomas apoyan esta gotoafirmación y muchos no. En Java , gotoes una palabra reservada , pero no se puede utilizar, aunque .classlos archivos compilados generan GOTO y LABEL. [58] Python no tiene soporte para goto, aunque hay varios módulos de broma que lo brindan. [56] [57] No hay una declaración goto en Seed7 y también se omiten las declaraciones goto ocultas como las declaraciones break y continue. [59] En PHP no había soporte nativo gotohasta la versión 5.3 (había bibliotecas disponibles para emular su funcionalidad). [60]

C# y Visual Basic .NET son compatibles goto. [61] [62] Sin embargo, no permite saltar a una etiqueta fuera del alcance actual y respeta la eliminación de objetos y las construcciones finales, lo que la hace significativamente menos poderosa y peligrosa que la gotopalabra clave en otros lenguajes de programación. También crea etiquetas de declaraciones predeterminadas y de caso , cuyo alcance es la declaración de cambio adjunta ; goto case o goto default se utilizan a menudo como reemplazo explícito del fallo implícito, que C# no permite.

El lenguaje de programación PL/I tiene una instrucción GOTO que desenrolla la pila para una transferencia fuera de bloque y no permite una transferencia a un bloque desde fuera de él.

Otros idiomas pueden tener sus propias palabras clave separadas para errores explícitos, que pueden considerarse una versión gotorestringida a este propósito específico. Por ejemplo, Go usa la fallthroughpalabra clave y no permite la falla implícita en absoluto, [63] mientras que Perl 5 usa nextla falla explícita de manera predeterminada, pero también permite establecer la falla implícita como comportamiento predeterminado para un módulo.

La mayoría de los lenguajes que tienen declaraciones goto lo llaman así, pero en los primeros días de la informática se usaban otros nombres. Por ejemplo, en MAD se utilizó la instrucción TRANSFER TO. [64] APL utiliza una flecha que apunta hacia la derecha, para ir a.

C tiene goto y se usa comúnmente en varios modismos, como se analizó anteriormente.

Los lenguajes de programación funcionales como Scheme generalmente no tienen goto, sino que utilizan continuaciones.

Ver también

Notas

  1. ^ Vatios y Findlay 2004.
  2. ^ Kernighan y Ritchie 1988, pág. 224, A9.6 Declaraciones de salto.
  3. ^ ab Dijkstra 1968.
  4. ^ Equipo de desarrollo de GNU Pascal 2005, 5.1 Consejos variados de programación de Pascal.
  5. ^ Louden y Lambert 2012.
  6. ^ "El uso desenfrenado de la declaración goto tiene como consecuencia inmediata que se vuelve terriblemente difícil encontrar un conjunto significativo de coordenadas para describir el progreso del proceso... La declaración 'ir a' tal como está es demasiado primitiva , es demasiado una invitación a arruinar el propio programa."
  7. ^ Rubin 1987.
  8. ^ Dijkstra, Edsger W. Sobre una correspondencia algo decepcionante (EWD-1009) (PDF) . Archivo EW Dijkstra. Centro de Historia Estadounidense, Universidad de Texas en Austin .(transcripción) (mayo de 1987)
  9. ^ Knuth 1974.
  10. ^ Kernighan y Ritchie 1988, págs. 65–66, 3.8 Ir a y etiquetas.
  11. ^ abc Vid 2007, pag. 262.
  12. ^ Geisler 2011.
  13. ^ Prata 2013.
  14. ^ abcd Sahni y Cmelik 1995.
  15. ^ abc Andrews 2003.
  16. ^ McConnell 2004.
  17. ^ Regehr 2013.
  18. ^ Roberts 1995.
  19. ^ Meyer 2009.
  20. ^ Kozen y Tseng 2008.
  21. ^ Preguntas de desbordamiento de pila 2012.
  22. ^ Pitchford y Tapp 2013.
  23. ^ Williams 2013.
  24. ^ ANSI X3.9-1978. Estándar Nacional Americano – Lenguaje de programación FORTRAN. Instituto Americano de Estándares Nacionales. También conocida como ISO 1539-1980, informalmente conocida como FORTRAN 77
  25. ^ ISO/IEC 1539-1:1997. Tecnologías de la información – Lenguajes de programación – Fortran – Parte 1: Lenguaje base. Conocido informalmente como Fortran 95. Este estándar tiene otras dos partes. La Parte 1 ha sido adoptada formalmente por ANSI.
  26. ^ Barnes 2006.
  27. ^ Cumbre 1995.
  28. ^ ab Torvalds 2016.
  29. ^ ab Cozens 2004.
  30. ^ Tutorial de Java 2012.
  31. ^ Gosling y McGilton 1996.
  32. ^ Brender 2002, págs. 960–965.
  33. ^ ab Spinellis 2003.
  34. ^ ab Allain 2019.
  35. ^ Stroustrup 2012.
  36. ^ Hoad, Nathan (28 de julio de 2022). "nathanhoad/godot_dialogue_manager". GitHub . Consultado el 3 de febrero de 2023 .
  37. ^ Chisnall 2012.
  38. ^ Contieri 2021.
  39. ^ Wilkes, Wheeler y Gill 1951.
  40. ^ Ramshaw 1988.
  41. ^ Siedersleben 2006.
  42. ^ ab Steele 1977.
  43. ^ ab Kelsey, Clinger y Rees 1998.
  44. ^ , lo que significa que el programa salta a la etiqueta 20, 30 o 40, en caso de que i sea menor, igual o mayor que cero.
  45. ^ Lahey Computer Systems, Inc 2004.
  46. ^ Microsoft 2021.
  47. ^ Wehr 1997.
  48. ^ z/OS 2.5.0 en la documentación de IBM 2021.
  49. ^ ab GCC, la colección de compiladores GNU 2021.
  50. ^ Fronczak y Lubbers 1974, pág. 226.
  51. ^ La declaración ALTER se consideró obsoleta en el estándar COBOL 1985 y se eliminó en 2002; ver COBOL > Código automodificable
  52. ^ Van Borla 2004.
  53. ^ Manual de sintaxis de Perl 2021.
  54. ^ IR A para Java 2009.
  55. ^ Sextón 2012.
  56. ^ ab Hindle 2004.
  57. ^ ab Noack y col. 2015.
  58. ^ Gosling y col. (2005) A diferencia de C y C++, el lenguaje de programación Java no tiene una declaración goto; Las etiquetas de declaración de identificador se utilizan con declaraciones de interrupción (§14.15) o continuación (§14.16) que aparecen en cualquier lugar dentro de la declaración etiquetada. Las palabras clave const y goto están reservadas, aunque no se utilicen actualmente. Esto puede permitir que un compilador de Java produzca mejores mensajes de error si estas palabras clave de C++ aparecen incorrectamente en los programas.
  59. ^ Manual del lenguaje de programación Seed7 2021.
  60. ^ Manual de PHP 2021.
  61. ^ Wagner 2021.
  62. ^ "Declaración GoTo - Visual Basic | Microsoft Learn". Microsoft aprende . 15 de septiembre de 2021 . Consultado el 25 de septiembre de 2023 .
  63. ^ La especificación del lenguaje de programación Go 2021.
  64. ^ Galler 1962, págs. 26-28, 197, 211.

Referencias