En programación informática , COMEFROM (o COME FROM ) es una oscura estructura de flujo de control utilizada en algunos lenguajes de programación , originalmente como una broma. COMEFROMes el inverso de GOTOen el sentido de que puede tomar el estado de ejecución desde cualquier punto arbitrario en el código a una COMEFROMdeclaración.
El punto del código donde se produce la transferencia de estado suele indicarse como parámetro a COMEFROM. El hecho de que la transferencia se produzca antes o después de la instrucción en el punto de transferencia especificado depende del lenguaje utilizado. Según el lenguaje utilizado, COMEFROMes posible que varios s que hagan referencia al mismo punto de partida no sean válidos, no sean deterministas, se ejecuten con algún tipo de prioridad definida o incluso induzcan una ejecución paralela o concurrente , como se observa en Threaded Intercal . [ cita requerida ]
Un ejemplo simple de una COMEFROM xdeclaració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 pasa a la declaración que sigue a la COMEFROM. Esto también puede ser condicional, pasando el control solo si se cumple una condición, análogo a un GOTO dentro de una declaració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 declaración GOTO, mientras que COMEFROM requiere escanear todo el programa o ámbito para ver si alguna declaración COMEFROM está dentro del ámbito 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 todo el programa para ver si alguna declaración COMEFROM hace referencia a esa línea o etiqueta.
Los ganchos del depurador se pueden utilizar para implementar una declaración COMEFROM, como en el módulo goto de Python; [1] consulte a continuación. Esto también se puede implementar con la función gcc "asm goto" que utiliza la opción de configuración del kernel de Linux CONFIG_JUMP_LABEL. Una operación no válida 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 de la operación no válida.
Historia
COMEFROMInicialmente, COMEFROM se vio en listas de instrucciones de lenguaje ensamblador de broma (como 'CMFRM'). Fue desarrollado en un artículo de Datamation por R. Lawrence Clark en 1973, [2] escrito en respuesta a la carta de Edsger Dijkstra Go To Statement Considered Harmful . 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 'computed COMEFROM'. También hubo propuestas de Fortran [3] para 'assigned COME FROM' y una DONTpalabra clave ' ' (para complementar el bucle ' ' existente DO).
El 1 de abril de 2004, Richie Hindle publicó una implementación de ambos para el lenguaje de programación Python . [1] A pesar de haber sido publicado el Día de los InocentesGOTO y no estar destinado a un uso serio, la sintaxis es válida y la implementación funciona completamente.
COMEFROM
Usos prácticos
Ejemplos
El siguiente es un ejemplo de un programa en un dialecto BASICCOMEFROM hipotético con " " en lugar de " GOTO".
10 COME DE 40 20 INGRESE "¿CÓMO SE LLAMA?" ; A$ 30 IMPRIMA "HOLA" ; A$ 40 REM
Este programa (hipotéticamente) funciona preguntando al usuario su nombre, saludándolo con el mismo nombre y continuando todo de nuevo. La instrucción " REM" en la línea 40 es simplemente un NOP (en este caso, un REMark o comentario ) — la COMEFROMinstrucción " " en la línea 10 hace que se vuelva 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 gotomódulo joke instalado (que utiliza ganchos de depuración para controlar la ejecución del programa) se ve así:
desde goto importar comefrom , etiqueta
comefrom . repeat
nombre = raw_input ( '¿Cuál es tu nombre? ' )
if nombre :
print ( "Hola" , nombre )
label . repeat
print ( "¡Adiós!" )
Esta es una implementación en Ruby de la declaración COME FROM de Intercal.
$vienen_de_etiquetas = {}
def etiqueta ( l ) si $vienen_de_etiquetas [ l ] $vienen_de_etiquetas [ l ]. llamada fin fin
def come_from ( l ) callcc hacer | bloque | $come_from_labels [ l ] = bloque fin fin
Sistema operativo Fortran G/360
El compilador Fortran G de OS/360 tiene una función de paquete de depuración. Su declaración "AT" es similar a COMEFROM en el sentido de que entrega el flujo de control al bloque de depuración. Los puntos de interrupción en general son similares. [4]
- Ejemplo 1: se examinan los valores de SOLON, GFAR y EWELL tal como estaban al finalizar la declaración 10. La declaración AT indica la declaración 11.
ENTERO SOLON , GFAR , EWELL ... 10 SOLON = GFAR * SQRT ( FLOTANTE ( EWELL ) ) 11 SI ( SOLON ) 40 , 50 , 60 ... UNIDAD DE DEPURACIÓN ( 3 ) EN 11 MOSTRAR GFAR , SOLON , EWELL FIN
- Ejemplo 2: se muestran todos los valores de STOCK cuando se encuentra la declaración 35.
DIMENSIÓN STOCK ( 1000 ), SALIDA ( 1000 )
. . . HACER 30 I = 1 , 1000 25 STOCK ( I ) = STOCK ( I ) - SALIDA ( I ) 30 CONTINUAR 35 A = B + C . . . UNIDAD DE DEPURACIÓN ( 3 ) EN 35 MOSTRAR FIN DE STOCK
- Ejemplo 3: el seguimiento comienza en la instrucción 10, en la instrucción 20, el seguimiento 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 HACER 22 I = 1 , 5 . . . 22 CONTINUAR 25 C = B + 3,16 30 D = C / 2 DETENER . . . UNIDAD DE DEPURACIÓN ( 3 ), RASTREO C NÚMERO DE PAQUETE DE DEPURACIÓN 1 A LAS 10 RASTREO EN C NÚMERO DE PAQUETE DE DEPURACIÓN 2 A LAS 20 RASTREO DESACTIVADO HACER 35 I = 1 , 3 . . . 35 CONTINUAR RASTREO EN C NÚMERO DE PAQUETE DE DEPURACIÓN 3 A LAS 30 RASTREO DESACTIVADO FIN
Véase también
- FX Reid , un experto en la semántica de
COMEFROM[5] - Acción a distancia
- INTERCAL
Serios artilugios de programación que involucran ideas como COMEFROM:
- Punto de corte en la programación orientada a aspectos
- Continuación
- Desencadenadores de bases de datos
- Patrón de observador
- Programación basada en eventos
- Webhook
- Bloques de enrutamiento de señales Goto/From en MATLAB Simulink
Referencias
- ^ ab Hindle, Richie (1 de abril de 2004), goto para Python, Entrian.
- ^ Clarke, Lawrence, "No sabemos a dónde IR si no sabemos de dónde venimos. Esta innovación lingüística cumple con todas las expectativas", Datamation (artículo), archivado desde el original el 16 de julio de 2018 , consultado el 24 de septiembre de 2004.
- ^ Modell, Howard; Slater, William (abril de 1978). «Structured programming regarded dangerous» (La programación estructurada considerada perjudicial). ACM SIGPLAN Notices . 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, número 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 del ensamblador de bromas, incluido CMFRM
- proviene del soporte para Perl