De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda

GoTo ( goto , GOTO , GO TO u otras combinaciones de mayúsculas y minúsculas, 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 accede se suelen identificar mediante etiquetas , aunque algunos idiomas utilizan 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 admiten lagotodeclaración, y muchos no lo hacen (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 la duplicación de código y variables adicionales. [1]

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

Uso [ editar ]

goto label

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

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 un salto 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 [ editar ]

En la reunión previa a ALGOL celebrada en 1959, Heinz Zemanek expresó explícitamente sus dudas sobre la necesidad de declaraciones de GOTO; en ese momento nadie [ cita requerida ] prestó atención a su comentario, incluido Edsger W. Dijkstra , quien más tarde se convirtió en el icónico oponente de GOTO. [3] Las décadas de 1970 y 1980 vieron un declive en el uso de declaraciones GOTO a favor del paradigma de " programación estructurada " , con goto criticado por conducir a un " código espagueti no mantenible " (ver más abajo). Algunos estándares de codificación de estilo de programación , por ejemplo, los estándares de codificación GNU Pascal, no recomiendan el uso de declaraciones GOTO. [4]La prueba de Böhm-Jacopini (1966) no resolvió la cuestión de si se debía adoptar la 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 variables locales adicionales. [5] Sin embargo, provocó un debate prominente entre científicos informáticos, educadores, diseñadores de lenguajes y programadores de aplicaciones que vieron un cambio lento pero constante lejos del uso antes ubicuo de GOTO. Probablemente la crítica más famosa de GOTO es una carta de 1968 de Edsger Dijkstra titulada Ir a la declaración considerada perjudicial . [3] [6]En esa carta, Dijkstra argumentó que las declaraciones GOTO irrestrictas 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). La carta en sí provocó un debate, incluida una carta "'GOTO Considered Dañino' Considerado Dañino" [7] enviada a Comunicaciones de la ACM (CACM) en marzo de 1987, así como otras respuestas de otras personas, incluida la de Dijkstra On a Somewhat Disappointing Correspondencia . [8]

Un punto de vista alternativo se presenta en Donald Knuth 's de programación estructurado con ir a los estados , que analiza muchas tareas comunes de programación y encuentra que en algunos de ellos GOTO es la óptima construcción del lenguaje de uso. [9] En The C Programming Language , Brian Kernighan y Dennis Ritchie advierten que gotoes "infinitamente abusivo", 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 evitar la "falta de manejo de excepciones integrado en el lenguaje C". [11] Otros programadores, incluido el diseñador y codificador del núcleo 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 solo cuando se usa de una manera sensata por un programador igualmente sensato. [15] [16] Según el profesor de ciencias de la computación John Regehr , en 2013, hubo 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 las 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 solo punto de salida. [18] Por ejemplo, Bertrand Meyer escribió en su libro de texto de 2009 que las instrucciones como breaky continue"son solo las viejas gotocon piel de oveja". [19] Una forma ligeramente modificada del resultado de Böhm – Jacopini permite, sin embargo, evitar variables adicionales en la programación estructurada, siempre que se permitan interrupciones multinivel de los bucles. [20] Debido a que algunos lenguajes como C no permiten interrupciones de varios niveles a través de susbreakpalabra clave, algunos libros de texto aconsejan al programador que la utilice gotoen tales circunstancias. [14] La norma MISRA C 2004 prohíbe goto, continueasí como declaraciones múltiples returny break. [21] La edición de 2012 de la norma MISRA C rebajó la prohibición gotodel estado "obligatorio" a "consultivo"; 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. [22] [23]

FORTRAN introdujo construcciones de programación estructurada en 1978, y en sucesivas revisiones se endurecieron las reglas semánticas relativamente flexibles que gobiernan el uso permitido de goto; el "rango extendido" en el que un programador podía usar un GOTO para entrar y salir de un bucle DO aún en ejecución se eliminó del lenguaje en 1978, [24] y en 1995 varias formas de Fortran GOTO, incluido el GOTO computarizado y el Assigned GOTO, había sido eliminado. [25] Algunos lenguajes de programación modernos ampliamente utilizados, como Java y Python, carecen de la declaración GOTO (consulte el soporte del lenguaje) , aunque la mayoría proporciona algunos medios para salir de una selección, o para salir o moverseen el siguiente paso de una iteración. El punto de vista de que perturbar el flujo de control en el código no es deseable 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 el problema 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 ser codificado por reglas inflexibles, aunque las discusiones sobre el estilo a menudo parecen centrarse exclusivamente en tales 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 necesariamente conduce de inmediato a una programación hermosa: un programador no estructurado es tan capaz de construir una maraña bizantina sin usar ningún goto (quizás sustituyendo bucles extrañamente anidados y variables de control booleanas, en su lugar) . 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 entenderlas puede generar tantos problemas como se suponía que debían evitar las reglas. Además, muchas opiniones sobre el estilo de programación son solo eso: opiniones. Pueden estar fuertemente argumentadas y sentirse fuertemente, pueden estar respaldadas por evidencia y argumentos aparentemente sólidos, pero las opiniones opuestas pueden sentirse, respaldadas y argumentadas con la misma fuerza. Por lo general, es inútil verse arrastrado a "guerras de estilo", porque en ciertos temas, los oponentes nunca parecen estar de acuerdo, o estar de acuerdo en estar en desacuerdo, o dejar de discutir.) Evitar ciegamente ciertas construcciones o seguir reglas sin entenderlas puede generar tantos problemas como se suponía que debían evitar las reglas. Además, muchas opiniones sobre el estilo de programación son solo eso: opiniones. Pueden estar fuertemente argumentadas y sentirse fuertemente, pueden estar respaldadas por evidencia y argumentos aparentemente sólidos, pero las opiniones opuestas pueden sentirse, respaldadas y argumentadas con la misma fuerza. Por lo general, es inútil verse arrastrado a "guerras de estilo", porque en ciertos temas, los oponentes nunca parecen estar de acuerdo, o estar de acuerdo en estar en desacuerdo, o dejar de discutir.) Evitar ciegamente ciertas construcciones o seguir reglas sin entenderlas puede generar tantos problemas como se suponía que debían evitar las reglas. Además, muchas opiniones sobre el estilo de programación son solo eso: opiniones. Pueden estar fuertemente argumentadas y sentirse fuertemente, pueden estar respaldadas por evidencia y argumentos aparentemente sólidos, pero las opiniones opuestas pueden sentirse, respaldadas y argumentadas con la misma fuerza. Por lo general, es inútil verse arrastrado a "guerras de estilo", porque en ciertos temas, los oponentes nunca parecen estar de acuerdo, o estar de acuerdo en estar en desacuerdo, o dejar de discutir.pueden estar respaldadas por pruebas y argumentos aparentemente sólidos, pero las opiniones opuestas pueden sentirse, apoyarse y argumentarse con la misma fuerza. Por lo general, es inútil verse arrastrado a "guerras de estilo", porque en ciertos temas, los oponentes nunca parecen estar de acuerdo, o estar de acuerdo en estar en desacuerdo, o dejar de discutir.pueden estar respaldadas por pruebas y argumentos aparentemente sólidos, pero las opiniones opuestas pueden sentirse, apoyarse y argumentarse con la misma fuerza. Por lo general, es inútil verse arrastrado a "guerras de estilo", porque en ciertos temas, los oponentes nunca parecen estar de acuerdo, o estar de acuerdo en estar en desacuerdo, o dejar de discutir.

Patrones de uso comunes [ editar ]

Si bien el uso general de gotos ha ido disminuyendo, todavía hay situaciones en algunos idiomas en las que un goto proporciona la forma más corta y sencilla 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 a menudo más difícil de entender). En otros lenguajes, existen alternativas estructuradas, en particular excepciones y llamadas de cola.

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

  • Para que el código sea más legible y más fácil de seguir [28] [29]
  • Para hacer programas más pequeños y deshacerse de la duplicación de código [28] [29]
  • Implemente 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. [30] Por ejemplo, goto en el analizador sintáctico canónico LR .
  • Implementar interrupción de varios niveles y continuar si no se admite directamente en el idioma; este es un modismo común en C. [14] Aunque Java reserva la palabra clave goto, en realidad no la implementa. En su lugar, Java implementa declaraciones etiquetadas break y continue etiquetadas. [31] Según la documentación de Java, el uso de gotos para descansos de varios niveles fue el uso más común (90%) de gotos en C. [32] Java no fue el primer lenguaje en adoptar este enfoque, prohibiendo goto, pero proporcionando descansos de varios niveles: el lenguaje de programación BLISS (más precisamente la versión BLISS-11 del mismo) lo precedió en este sentido. [33] : 960–965
  • Sustitutos de las declaraciones de interrupción o continuación (reintento) 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 código Netbsd . [34]
  • Manejo de errores (en ausencia de excepciones), particularmente código de limpieza como la desasignación de recursos. [11] [14] [34] [30] [35] C ++ ofrece una alternativa a la declaración goto para este caso de uso, que es: La adquisición de recursos es inicialización (RAII) mediante el uso de destructores o el uso de las excepciones try and catch utilizadas en el manejo de excepciones . [36] setjmp y longjmp son otra alternativa y tienen la ventaja de poder deshacer parte de la pila de llamadas .
  • haciendo estallar la pila, por ejemplo, Algol, PL / I.

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

Otro uso de las declaraciones goto es modificar el código heredado mal factorizado , donde evitar un goto 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 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 , pero encuentra un uso ocasional.

Alternativas [ editar ]

Programación estructurada [ editar ]

La noción moderna de subrutina fue inventada por David Wheeler al programar el EDSAC . [38] Para implementar una llamada y regresar en una máquina sin una pila, usó un patrón especial de código auto-modificable, conocido como salto de Wheeler. [39] Esto resultó en la capacidad de estructurar programas usando ejecuciones bien anidadas de rutinas extraídas de una biblioteca. Esto no habría sido posible usando solo goto, ya que el código de destino, extraído de la biblioteca, no sabría a dónde saltar.

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

  • Bucles usando declaraciones while, repeat untilodo yfor
  • switchtambién conocido como casedeclaraciones, una forma de ramificación de múltiples vías

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

Excepciones [ editar ]

En la práctica, una estricta adherencia a la plantilla básica de tres estructuras de programación estructurada produce un código altamente anidado, debido a la incapacidad de salir de una unidad estructurada prematuramente, y una explosión combinatoria con datos de estado de programa bastante complejos para manejar todas las condiciones posibles.

En general, se han adoptado dos soluciones: una forma de salir de una unidad estructurada prematuramente y, de manera más general, excepciones : en ambos casos, estas suben por la estructura y devuelven el control a los bloques o funciones encerrados, pero no saltan a ubicaciones de códigos arbitrarios. 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 temprana, sino una leve relajación de las restricciones de la programación estructurada. En C, breaky continuepermite que uno termine un bucle o continúe con la siguiente iteración , sin requerir una declaración whileo extra if. En algunos idiomas también son posibles las pausas de varios niveles. Para manejar situaciones excepcionales, especializadoSe agregaron construcciones de manejo de excepciones , como try/ catch/ finallyen Java.

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

Llamadas de cola [ editar ]

En un artículo entregado a la conferencia ACM en Seattle en 1977, Guy L. Steele resumió el debate sobre el 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 de control. al procedimiento llamado, eliminando típicamente operaciones de manipulación de pila innecesarias. [41] Dado que tales "llamadas de cola" son muy comunes en Lisp, un lenguaje donde las llamadas a procedimiento son ubicuas, esta forma de optimización reduce considerablemente el costo de una llamada a procedimiento en comparación con el GOTO utilizado en otros idiomas. Steele argumentó que las llamadas de procedimiento mal implementadas habían llevado a una percepción artificial de que el GOTO era barato en comparación con la llamada de procedimiento. 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 máquina ", y las instrucciones de manipulación de pila de código máquina "se consideran una optimización (en lugar de viceversa !) ". [41] Steele citó evidencia de que los algoritmos numéricos bien optimizados en Lisp podrían ejecutarse más rápido que el código producido por los compiladores comerciales Fortran disponibles en ese momento porque el costo de una llamada a procedimiento en Lisp era mucho menor. En Scheme , un dialecto Lisp desarrollado por Steele con Gerald Jay Sussman , la optimización de la llamada de cola es obligatoria. [42]

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 estructuras de control interno complejas y datos de estado extensos. En particular, las optimizaciones de llamadas de cola discutidas por Steele convirtieron el procedimiento en una forma creíble de implementar la iteración a través de la recursividad de cola única (la recursión de cola 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, lo que permite la transferencia de control, como en las máquinas de estados finitos., que de lo contrario generalmente se logra con declaraciones goto.

Corutinas [ editar ]

Las corrutinas son una relajación más radical de la programación estructurada, que permiten no solo múltiples puntos de salida (como en los retornos en la 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 instrucción de conmutación general, puede permitir que una subrutina reanude la ejecución en un punto arbitrario en llamadas posteriores, y es una alternativa estructurada a las instrucciones goto en ausencia de corrutinas; este es un modismo común en C, por ejemplo.

Continuaciones [ editar ]

Una continuación es similar a un GOTO en que transfiere el control desde un punto arbitrario en el programa a un punto previamente marcado. Una continuación es más flexible que GOTO en los lenguajes que la admiten, porque 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 el almacenamiento de 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. LaEl 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 la etiqueta a la que se va a saltar puede ser referenciada 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]

Mensaje pasando [ editar ]

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

Variaciones [ editar ]

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

GOTO calculado y GOTO asignado [ editar ]

En Fortran , un cálculoGOTO 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. La construcción equivalente en C es la instrucción switch y en la versión más reciente de Fortran, una CASEdeclaración es la alternativa sintáctica recomendada. [44] BASIC tiene el ON ... GOTOconstructo que logra el mismo objetivo. [45]

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 (se asigna a) una variable entera. Desafortunadamente, era posible saltar a una variable entera que no había sido ASIGNADA, y era una fuente importante de errores relacionados con los gotos asignados. [46] La assigndeclaración de Fortran solo permite que se asigne un número de línea constante (existente) a la variable entera. Sin embargo, fue posible tratar accidentalmente esta variable como un número entero a partir de entonces, por ejemplo, incrementarla, dando como resultado un comportamiento no especificado en el gotomomento. El siguiente código demuestra el comportamiento de goto icuando la línea i no está especificada: [47]

 asigne 200  a  i  i  =  i + 1  goto i  ! comportamiento no especificado 200  escribir ( * , * )  "este es un número de línea válido"

Varios compiladores de C implementan dos extensiones de C / C ++ no estándar relacionadas con los gotos introducidos originalmente por gcc . [48] [49] La extensión GNU permite obtener la dirección de una etiqueta dentro de la función actual como un operador de valor de etiqueta devoid* 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 conoce como un 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 destino de goto, mientras que el goto asignado de Fortran no permite expresiones arbitrarias como destino de salto. [50] &&void*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. [50]

Algunas variantes de BASIC también admiten un GOTO calculado en el sentido utilizado en GNU C, es decir, en el que el objetivo 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 numerada 1000 veces el valor de una variable i (que podría representar una opción de menú seleccionada, por ejemplo). [51]

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

ALTERAR [ editar ]

Hasta el estándar ANSI COBOL de 1985 tenía el verbo ALTER que podía usarse para cambiar el destino de un GO TO existente, que tenía que estar en un párrafo por sí mismo. [52] La característica, que permitía el polimorfismo , fue condenada con frecuencia y rara vez se usó. [53]

Perl GOTO [ editar ]

En Perl , hay una variante de la gotodeclaración que no es una declaración GOTO tradicional en absoluto. 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á al GOTO, sino al lugar desde el cual se llamó a la función original. [54]

GOTO emulado [ editar ]

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

Variables de etiqueta PL / I [ editar ]

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 bifurcaciones fuera del bloque actual. Un procedimiento de llamada 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 un goto fuera del bloque 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 dónde (5) etiqueta; declarar inx fijo; donde (1) = abc; donde (2) = xyz; ... ir a donde (inx); ... abc: / * sentencia * /; ... 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): / * sentencia * /; ... donde (2): / * sentencia * /; ...

MS / DOS GOTO [ editar ]

Goto dirige la ejecución a una etiqueta que comienza con dos puntos. El objetivo de Goto puede ser una variable.

@ echo desactivado SET  D8str = % fecha% SET  D8dow = % D8str: ~ 0,3%PARA  %% D en  ( Lun Mié Vie )  hacer  si  " %% D"  ==  " % D8dow% "  ir a  SHOP %% D echo Hoy, % D8dow% , no es un día de compras.ir al  final: 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: COMPRAR Fri echo compra Seltzer en caso de que alguien quiera una bebida sin calorías.: fin

Soporte de idiomas [ editar ]

Muchos idiomas apoyan la gotodeclaración y muchos no. En Java , gotoes una palabra reservada , pero no se puede utilizar, aunque el archivo compilado.class genera GOTO y LABEL. [59] [60] Python no tiene soporte para goto, aunque hay varios módulos de broma que lo proporcionan. [57] [58] No hay una declaración goto en Seed7 y los gotos ocultos como las declaraciones break y continue también se omiten. [61] En PHP no había soporte nativo gotohasta la versión 5.3 (las bibliotecas estaban disponibles para emular su funcionalidad). [62]

El lenguaje de programación C # tiene goto. Sin embargo, no permite saltar a una etiqueta fuera del alcance actual, lo que la hace significativamente menos poderosa y peligrosa que la gotopalabra clave en otros lenguajes de programación. También crea etiquetas de sentencias de caso y predeterminadas , cuyo alcance es la sentencia de cambio adjunta ; goto case o goto default se usa a menudo como un reemplazo explícito de fallthrough implícito, que C # no permite.

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

La mayoría de los lenguajes que tienen sentencias 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. [63] APL usa una flecha que apunta hacia la derecha, para goto.

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

También hay una gotofunción en Perl .

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

Ver también [ editar ]

  • VIENE DE
  • Flujo de control
  • GOSUB
  • Sentencia de cambio : una rama de múltiples vías (o goto condicional)
  • Programación no estructurada
  • Considerado perjudicial

Referencias [ editar ]

  1. ^ David Anthony Watt; William Findlay (2004). Conceptos de diseño de lenguajes de programación . John Wiley e hijos. pag. 228 . ISBN 978-0-470-85320-7.
  2. ^ "El nuevo estándar C: 6.8.6.1" . c0x.coding-guidelines.com .
  3. ↑ a b Dijkstra, 1968 .
  4. ^ "Estándares de codificación GNU Pascal" . www.gnu-pascal.de .
  5. ^ Kenneth Louden, Lambert (2011). Lenguajes de programación: principios y prácticas . Aprendizaje Cengage. pag. 422 . ISBN 978-1-111-52941-3.
  6. ^ "EWD 215: un caso contra la declaración GO TO" (PDF) .
  7. ^ Frank Rubin (marzo de 1987). " " GOTO Considerado Dañino "Considerado Dañino" (PDF) . Comunicaciones de la ACM . 30 (3): 195-196. doi : 10.1145 / 214748.315722 . Archivado desde el original (PDF) el 20 de marzo de 2009.
  8. ^ Dijkstra, Edsger W. En una correspondencia algo decepcionante (EWD-1009) (PDF) . Archivo EW Dijkstra. Centro de Historia Estadounidense de la Universidad de Texas en Austin . ( transcripción ) (mayo de 1987)
  9. ^ Donald Knuth (1974). "Programación estructurada con ir a Declaraciones" (PDF) . Encuestas de Computación . 6 (4): 261-301. CiteSeerX 10.1.1.103.6084 . doi : 10.1145 / 356635.356640 .  
  10. ^ Brian W. Kernighan; Dennis Ritchie (1988). Lenguaje de programación C (2ª ed.). Prentice Hall. págs.  60–61 . ISBN 978-0-13-308621-8.
  11. ↑ a b c Michael A. Vine (2007). Programación en C para principiantes absolutos . Aprendizaje Cengage. pag. 262. ISBN 978-1-59863-634-5.
  12. ^ Sandra Geisler (2011). C Referencia de escritorio todo en uno para principiantes . John Wiley e hijos. págs. 217–220. ISBN 978-1-118-05424-6.
  13. ^ Stephen Prata (2013). C Primer Plus . Addison-Wesley. págs. 287–289. ISBN 978-0-13-343238-1.
  14. ^ a b c d Sartaj Sahni; Robert F. Cmelik; Bob Cmelik (1995). Desarrollo de software en C . Silicon Press. pag. 135. ISBN 978-0-929306-16-2.
  15. ^ "Copia archivada" . Archivado desde el original el 14 de febrero de 2010 . Consultado el 30 de enero de 2010 .Mantenimiento de CS1: copia archivada como título ( enlace )
  16. ^ "Código completo, primera edición" . Stevemcconnell.com . Consultado el 22 de julio de 2014 .
  17. ^ "Uso de Goto en el código de sistemas - incrustado en la academia" . blog.regehr.org .
  18. ^ Roberts, E. [1995] "Salidas de bucle y programación estructurada: reapertura del debate", Boletín ACM SIGCSE, (27) 1: 268-272.
  19. ^ Bertrand Meyer (2009). Toque de clase: aprender a programar bien con objetos y contratos . Springer Science & Business Media. pag. 189. ISBN 978-3-540-92144-8.
  20. ^ Dexter Kozen y Wei-Lung Dustin Tseng (2008). El teorema de Böhm-Jacopini es falso, proposicionalmente (PDF) . Mpc 2008 . Apuntes de conferencias en informática. 5133 . págs. 177-192. CiteSeerX 10.1.1.218.9241 . doi : 10.1007 / 978-3-540-70594-9_11 . ISBN   978-3-540-70593-2.
  21. ^ "¿Por qué" continuar "se considera una infracción C en MISRA C: 2004?" . Desbordamiento de pila. 2012-06-11 . Consultado el 22 de julio de 2014 .
  22. ^ Mark Pitchford; Chris Tapp (25 de febrero de 2013). "MISRA C: 2012: muchas buenas razones para cambiar" . Diseño Electrónico . Consultado el 22 de julio de 2014 .
  23. ^ Tom Williams (marzo de 2013). "Verificación de reglas para C: garantía de confiabilidad y seguridad" . Revista RTC . Consultado el 22 de julio de 2014 .
  24. ^ ANSI X3.9-1978. Estándar nacional estadounidense - Lenguaje de programación FORTRAN. Instituto Americano de Estándares Nacionales. También conocido como ISO 1539-1980, informalmente conocido 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. Hay dos partes más en este estándar. La Parte 1 ha sido adoptada formalmente por ANSI.
  26. John Barnes (30 de junio de 2006). Programación en Ada 2005 . Addison Wesley . pag. 114-115. ISBN 978-0-321-34078-8.
  27. ^ "Pregunta 17.10" . C-faq.com . Consultado el 22 de julio de 2014 .
  28. ^ a b "Linux: Usar goto en el código del kernel" . 28 de noviembre de 2005. Archivado desde el original el 28 de noviembre de 2005.
  29. ^ a b https://www.kernel.org/doc/Documentation/CodingStyle
  30. ^ a b Buenos usos de goto , Simon Cozens
  31. ^ "Declaraciones de bifurcación (Tutoriales de Java ™> Aprendizaje del lenguaje Java> Conceptos básicos del lenguaje)" . Docs.oracle.com. 2012-02-28 . Consultado el 22 de julio de 2014 .
  32. ^ "El entorno del lenguaje Java" . Oracle.com . Consultado el 22 de julio de 2014 .
  33. ^ Brender, Ronald F. (2002). "El lenguaje de programación BLISS: una historia" (PDF) . Software: práctica y experiencia . 32 (10): 955–981. doi : 10.1002 / spe.470 .
  34. ↑ a b Diomidis Spinellis (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.
  35. ^ a b Cuándo usar Goto al programar en C , Alex Allain
  36. ^ "Keynote del día 1 - Bjarne Stroustrup: Estilo C ++ 11 | GoingNative 2012 | Canal 9" . Channel9.msdn.com. 2012-02-02 . Consultado el 22 de julio de 2014 .
  37. ^ David Chisnall (2012). Libro de frases de Objective-C . Addison-Wesley Professional. pag. 249 . ISBN 978-0-321-81375-6.
  38. ^ "David J. Wheeler • Sociedad de informática IEEE" . www.computer.org .
  39. ^ Wilkes, MV; Wheeler, DJ; Gill, S. (1951). Elaboración de Programas para Computadora Electrónica Digital . Addison-Wesley.
  40. ^ J. Siedersleben (2006). "Errores y excepciones - Derechos y obligaciones". En Christophe Dony (ed.). Temas avanzados en técnicas de manejo de excepciones . Springer Science & Business Media. pag. 277 . ISBN 978-3-540-37443-5.
  41. ^ a b Guy Lewis Steele, Jr .. "Desmentir el mito de la 'llamada a procedimiento costoso', o las implementaciones de llamadas a procedimiento consideradas perjudiciales, o Lambda: The Ultimate GOTO". Laboratorio de IA del MIT. Nota de laboratorio de IA AIM-443. Octubre de 1977.
  42. ^ R5RS Sec. 3,5, Richard Kelsey; William Clinger; Jonathan Rees; et al. (Agosto de 1998). " 5 Informe revisado sobre el esquema de lenguaje algorítmico" . Computación simbólica y de orden superior . 3 (1): 7–105. doi : 10.1023 / A: 1010051815785 .
  43. ^ "Informe revisado ^ 5 sobre el esquema de lenguaje algorítmico" . schemers.org .
  44. ^ "Declaración GOTO calculada (obsoleta)" . Lahey.com. Archivado desde el original el 26 de mayo de 2016 . Consultado el 22 de julio de 2014 .
  45. ^ "Microsoft QuickBASIC: ON ... GOSUB, ON ... QuickSCREEN de declaraciones GOTO" . Microsoft . 1988 . Consultado el 3 de julio de 2008 .
  46. ^ http://www.personal.psu.edu/jhm/f90/statements/goto_a.html
  47. ^ "ASIGNAR - Asignación de etiquetas" . Software.intel.com . Consultado el 22 de julio de 2014 .
  48. ^ Computado goto , compilador IBM XL C / C ++
  49. ^ "Lista de arreglos de compiladores Intel® Composer XE 2013 SP1 | Zona de desarrolladores Intel®" . Software.intel.com. 2013-08-12 . Consultado el 22 de julio de 2014 .
  50. ^ a b "Etiquetas como valores: uso de la colección del compilador GNU (GCC)" . Gcc.gnu.org . Consultado el 22 de julio de 2014 .
  51. ^ Centro de Informática de la Universidad de Michigan (septiembre de 1974). MTS, sistema de terminales de Michigan . Bibliotecas UM. pag. 226. UOM: 39015034770076.
  52. ^ Manual de referencia de HP COBOL II / XL , "La declaración ALTER es una característica obsoleta del estándar ANSI COBOL de 1985".
  53. ^ Van Tassel, Dennie (8 de julio de 2004). "Historia de las etiquetas en lenguajes de programación" . Consultado el 4 de enero de 2011 .
  54. ^ Goto , del manual perl.syn (sintaxis de Perl)
  55. ^ "GOTO para Java" . steik . 6 de julio de 2009. Archivado desde el original el 15 de junio de 2012 . Consultado el 28 de abril de 2012 .
  56. ^ Sexton, Alex. "El verano de Goto | Inicio oficial de Goto.js" . Consultado el 28 de abril de 2012 .
  57. ↑ a b Hindle, Richie (1 de abril de 2004). "Ir a Python" . Soluciones de Entrian . Hertford, Reino Unido: Entrian Solutions Ltd . Consultado el 28 de abril de 2012 . El módulo 'goto' fue una broma de April Fool, publicada el 1 de abril de 2004. Sí, funciona, pero es una broma de todos modos. ¡No lo use en código real!
  58. ↑ a b snoack (19 de septiembre de 2015). "snoack / python-goto: un decorador de funciones, que reescribe el código de bytes, para habilitar goto en Python" . Consultado el 24 de febrero de 2017 .
  59. ^ "La especificación del lenguaje Java, tercera edición" . Las palabras clave const y goto están reservadas, aunque no se utilizan 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.
  60. ^ "La especificación del lenguaje Java, tercera edición" . A diferencia de C y C ++, el lenguaje de programación Java no tiene instrucción goto; Las etiquetas de declaración de identificación se utilizan con declaraciones de interrupción (§14.15) o continuar (§14.16) que aparecen en cualquier lugar dentro de la declaración etiquetada.
  61. ^ "Manual de Seed7" . Thomas Mertes . Consultado el 19 de septiembre de 2019 .
  62. ^ "Ir a - Manual" . PHP . Consultado el 22 de julio de 2014 .
  63. ^ Bernard A. Galler, El lenguaje de las computadoras , Universidad de Michigan, McGraw-Hill, 1962; páginas 26-28, 197, 211.
  • Dijkstra, Edsger W. (marzo de 1968). "Cartas al editor: Ir a declaración considerada perjudicial" (PDF) . Comunicaciones de la ACM . 11 (3): 147-148. doi : 10.1145 / 362929.362947 .
  • Ramshaw, L. (1988). "Eliminando go to's conservando la estructura del programa". Revista de la ACM . 35 (4): 893–920. doi : 10.1145 / 48014.48021 .
  • https://golang.org/ref/spec#Fallthrough_statements
  • http://web.engr.uky.edu/~elias/tutorials/perldoc-html/Switch.html#Allowing-fall-through