En programación de computadoras , COMEFROM (o COME FROM ) es una estructura de flujo de control oscura que se usa en algunos lenguajes de programación , originalmente como una broma. COMEFROM
es el inverso de GOTO
en que puede tomar el estado de ejecución desde cualquier punto arbitrario en el código a una COMEFROM
declaración.
El punto en el código donde ocurre la transferencia de estado generalmente se da como parámetro a COMEFROM
. Si la transferencia ocurre antes o después de la instrucción en el punto de transferencia especificado depende del idioma utilizado. Dependiendo del lenguaje utilizado, múltiples COMEFROM
s que hacen referencia al mismo punto de partida pueden no ser válidos, no ser deterministas, ejecutarse en algún tipo de prioridad definida o incluso inducir una ejecución paralela o concurrente como se ve en Threaded Intercal . [ cita requerida ]
Un ejemplo simple de una COMEFROM x
declaración " " es una etiqueta x
(que no necesita estar ubicada físicamente en ningún lugar cerca de su correspondiente COMEFROM
) que actúa como una "trampilla". Cuando la ejecución del código llega a la etiqueta, el control se pasa a la declaración que sigue a COMEFROM
. Esto también puede ser condicional, pasando el control solo si se satisface una condición, análogo a un GOTO dentro de una instrucción IF. La principal diferencia con GOTO es que GOTO solo depende de la estructura local del código, mientras que COMEFROM depende de la estructura global: un GOTO transfiere el control cuando llega a una línea con una instrucción GOTO, mientras que COMEFROM requiere escanear todo el programa o alcance ver si alguna declaración COMEFROM está dentro del alcance de la línea y luego verificar si se cumple una condición. El efecto de esto es principalmente hacer que la depuración (y la comprensión del flujo de control del programa) sea extremadamente difícil, ya que no hay ninguna indicación cerca de la línea o etiqueta en cuestión de que el control saltará misteriosamente a otro punto del programa; uno debe estudiar la programa completo para ver si alguna declaración COMEFROM hace referencia a esa línea o etiqueta.
Los ganchos del depurador se pueden usar para implementar una declaración COMEFROM, como en el divertido módulo goto de Python ; [1] ver más abajo . Esto también se puede implementar con la función gcc "asm goto" como la usa la opción de configuración del kernel de Linux CONFIG_JUMP_LABEL. Un no-op tiene su ubicación almacenada, para ser reemplazada por un salto a un fragmento ejecutable que al final regresa a la instrucción después del no-op.
Historia
COMEFROM
se vio inicialmente en listas de instrucciones en lenguaje ensamblador de broma (como 'CMFRM'). Fue elaborado en un artículo de Datamation por R. Lawrence Clark en 1973, [2] escrito en respuesta a la carta de Edsger Dijkstra Ir a la declaración considerada perjudicial . COMEFROM finalmente se implementó en la variante C-INTERCAL del lenguaje de programación esotérico INTERCAL junto con el aún más oscuro 'computado COMEFROM
'. También hubo propuestas de Fortran [3] para "asignado COME FROM
" y una DONT
"palabra clave" (para complementar el DO
ciclo " " existente ).
El 1 de abril de 2004, Richie Hindle publicó una implementación de ambos GOTO
y COMEFROM
para el lenguaje de programación Python . [1] A pesar de ser lanzado el Día de los Inocentes y no estar destinado a un uso serio, la sintaxis es válida y la implementación funciona completamente.
Usos practicos
Ejemplos de
El siguiente es un ejemplo de un programa en un dialecto BÁSICO hipotético con " COMEFROM
" en lugar de " GOTO
".
10 COMEFROM 40 20 ENTRADA "¿CUÁL ES SU NOMBRE?" ; UNA IMPRESIÓN DE $ 30 "HOLA" ; A $ 40 REM
Este programa (hipotéticamente) funciona pidiendo al usuario su nombre, saludándolo con el mismo nombre y continuando de nuevo. La instrucción " REM
" en la línea 40 es simplemente un NOP (en este caso, un comentario ) - la COMEFROM
instrucción " " en la línea 10 provoca una bifurcación de regreso a esa línea cuando la ejecución llega a la línea 40, independientemente de su contenido.
Un ejemplo completamente ejecutable en Python con el goto
módulo de broma instalado (que usa ganchos de depuración para controlar la ejecución del programa) se ve así:
from goto import comefrom , labelvienen de . repetir nombre = raw_input ( '¿Cuál es tu nombre?' ) if nombre : print ( "Hola" , nombre ) etiqueta . repetir imprimir ( "¡Adiós!" )
Esta es una implementación en Ruby de la instrucción COME FROM de Intercal.
$ come_from_labels = {}def label ( l ) si $ come_from_labels [ l ] $ come_from_labels [ l ]. fin de llamada findef come_from ( l ) callcc do | bloque | $ come_from_labels [ l ] = bloque de extremo finales
OS / 360 Fortran G
El compilador OS / 360 Fortran G tiene una función de paquete de depuración. Su declaración "AT" es similar a COMEFROM en que entrega el flujo de control al bloque de depuración. Los puntos de interrupción en general son similares. [4]
- Ejemplo 1: los valores de SOLON, GFAR y EWELL se examinan tal como estaban al final del enunciado 10. El enunciado AT indica el enunciado 11.
INTEGER SOLON , GFAR , EWELL . . . 10 SOLON = GFAR * SQRT ( FLOTAR ( EWELL )) 11 IF ( SOLON ) 40 , 50 , 60 . . . DEBUG UNIDAD ( 3 ) AT 11 DISPLAY GFAR , SOLON , EWELL FIN
- Ejemplo 2: todos los valores de STOCK se muestran cuando se encuentra la instrucción 35.
DIMENSIÓN STOCK ( 1000 ), FUERA ( 1000 ) . . . DO 30 I = 1 , 1000 25 STOCK ( I ) = STOCK ( I ) - OUT ( I ) 30 CONTINUAR 35 A = B + C . . . DEBUG UNIDAD ( 3 ) AT 35 DISPLAY STOCK FIN
- Ejemplo 3: el rastreo comienza en la declaración 10, en la declaración 20, el rastreo se detiene mientras se ejecuta el bucle y se reanuda después del bucle. El seguimiento se detiene justo antes de que se ejecute la instrucción 30.
10 A = 1,5 12 L = 1 15 B = A + 1,5 20 DO 22 I = 1 , 5 . . . 22 CONTINUAR 25 C = B + 3.16 30 D = C / 2 PARAR . . . DEBUG UNIDAD ( 3 ), TRACE C DEBUG PAQUETE NÚMERO 1 AT 10 TRACE EN C DEBUG PAQUETE NÚMERO 2 AT 20 TRACE OFF DO 35 I = 1 , 3 . . . 35 CONTINUAR TRACE EN C DEBUG PAQUETE NÚMERO 3 AT 30 TRACE OFF FIN
Ver también
- FX Reid , experto en semántica de
COMEFROM
[5] - Acción a distancia
- Intercal
Serios inventos de programación que involucran ideas parecidas a COMEFROM:
- Pointcut en la programación orientada a aspectos
- Continuación
- Activadores de base de datos
- Patrón de observador
- Ir a / desde bloques de enrutamiento de señales en MATLAB Simulink
Referencias
- ↑ a b Hindle, Richie (1 de abril de 2004), goto para Python , Entrian.
- ^ Clarke, Lawrence , "No sabemos adónde ir si no sabemos de dónde VENIMOS. Esta innovación lingüística está a la altura de todas las expectativas". , Datamation (artículo), Archivado desde el original en 16/07/2018 , recuperada 2004-09-24.
- ^ Modell, Howard; Slater, William (abril de 1978). "Programación estructurada considerada perjudicial" . Avisos ACM SIGPLAN . 13 (4): 76–79. doi : 10.1145 / 953411.953418 . Consultado el 18 de julio de 2014 .
- ^ IBM System / 360 y System / 370 Fortran IV Language, GC28-6515-10, mayo de 1974
- ^ FX Reid, sobre la semántica formal de la declaración COMEFROM. FACS FACTS , edición 2006-1 , páginas 18–20, marzo de 2006.
enlaces externos
- Página de información de COMEFROM
- Artículo de Datamation
- Lista de instrucciones de ensamblador de bromas que incluye CMFRM
- viene del soporte para Perl