En el contexto de la programación de computadoras, la magia es un término informal para la abstracción ; se usa para describir código que maneja tareas complejas mientras oculta esa complejidad para presentar una interfaz simple. El término es algo irónico y, a menudo, tiene malas connotaciones, lo que implica que el verdadero comportamiento del código no es evidente de inmediato. Por ejemplo, los mecanismos de cierre y tipado polimórfico de Perl a menudo se denominan "mágicos". El término implica que la complejidad oculta es al menos en principio comprensible, en contraste con la magia negra y la magia profunda (ver Variantes), que describen técnicas arcanas que están deliberadamente ocultas o son extremadamente difíciles de entender. Sin embargo, el término también se puede aplicar de manera cariñosa, lo que sugiere un "encanto" sobre el código. La acción de tales abstracciones se describe como realizada "automágicamente" , un acrónimo de "automáticamente" y "mágicamente".
Opacidad referencial
"Magia" se refiere a procedimientos que realizan cálculos basados en datos que no se les proporcionan claramente, accediendo a otros módulos, posiciones de memoria o variables globales que no se supone que deben hacer (en otras palabras, no son referencialmente transparentes). De acuerdo con los modelos de arquitectura de software más recientes , incluso cuando se usa programación estructurada , generalmente se prefiere hacer que cada función se comporte de la misma manera cada vez que se le pasan los mismos argumentos, siguiendo así uno de los principios básicos de la programación funcional . Cuando una función rompe esta regla, a menudo se dice que contiene "magia".
Un ejemplo simplificado de magia negativa es el siguiente código en PHP :
function magic () { global $ algunavariable ; echo $ algunavariable ; }$ algunavariable = verdadero ;magia ();
Si bien el código anterior es claro y se puede mantener, si se ve en un proyecto grande, a menudo es difícil entender de dónde magic()
obtiene su valor la función . Se prefiere escribir ese código utilizando el siguiente concepto:
function noMagic ( $ myvariable ) { echo $ myvariable ; }$ algunavariable = verdadero ;noMagic ( $ alguna variable );
No ortogonalidad
Cualquier SV [valor escalar] puede ser mágico, es decir, tiene características especiales que no tiene un SV normal.
- Larry Wall , página del manual de perlguts , [1] Perl 5
Esta definición de mágico o mágico puede extenderse a un tipo de datos , fragmento de código, palabra clave o dirección de máquina que tiene propiedades que no comparten objetos idénticos. Las propiedades mágicas pueden estar documentadas o no.
- En ISO C , los identificadores de archivos (de tipo
FILE
) no se pueden copiar de forma segura ya que sus direcciones [2] pueden ser mágicas. Es decir, el entorno de ejecución puede colocar identificadores de archivos originales en un rango de direcciones codificadas de forma rígida y no proporcionar un comportamiento de identificadores de archivos a una copia creada por el usuario en otra dirección. En consecuencia, las rutinas de biblioteca estándar aceptan punteros a identificadores de archivos, de tipoFILE *
, en su lugar. - En Perl 5, la declaración asigna implícitamente la línea leída del archivo por
a la variable , y aplica la función a la expresión para que cualquier cadena leída correctamente, incluso o la cadena vacía , se evalúe como verdadera y continúe el ciclo. Esto no le sucede a en ningún otro lugar, ni a ninguna otra expresión de control. [3]while(
) $_
defined()
"0"
while()
while()
- En un emulador , especialmente uno en desarrollo, los puntos de llamada del sistema de la máquina emulada pueden ser mágicos; cuando se llaman, el emulador puede ejecutar código nativo por conveniencia, velocidad o acceso al hardware físico, y configurar la CPU y la memoria emuladas como si hubiera ejecutado el código original.
- Por ejemplo, la declaración de BBC BASIC V trata mágicamente las direcciones de llamada del sistema de Acorn MOS ; en lugar de intentar bifurcarse al código ARM en esas direcciones, genera una interrupción de software en el sistema operativo RISC equivalente a la llamada al sistema. [4] El efecto es emular Acorn MOS lo suficiente para que los programas BASIC de 8 bits que no contienen lenguaje ensamblador se ejecuten sin modificaciones.
CALL
- Por ejemplo, la declaración de BBC BASIC V trata mágicamente las direcciones de llamada del sistema de Acorn MOS ; en lugar de intentar bifurcarse al código ARM en esas direcciones, genera una interrupción de software en el sistema operativo RISC equivalente a la llamada al sistema. [4] El efecto es emular Acorn MOS lo suficiente para que los programas BASIC de 8 bits que no contienen lenguaje ensamblador se ejecuten sin modificaciones.
- También en BBC BASIC, la variable numérica no solo controla el formato de impresión, sino que acepta la asignación directa de cadenas de formato ANSI printf , normalmente un error de falta de coincidencia de tipos. [4]
@%
- En JavaScript , la evaluación del
typeof
operador tiene éxito cuando el operando es un identificador no declarado, lo que normalmente daría como resultado unReferenceError
. - Cualquier comentario que tenga un efecto en el código es mágico.
- Las direcciones de E / S mapeadas en memoria y las variables volátiles también son mágicas en este sentido, aunque el término no se aplica normalmente.
Variantes
La magia profunda se refiere a técnicas que no son ampliamente conocidas y que pueden mantenerse deliberadamente en secreto. Podría decirse que el número de tales técnicas ha disminuido en los últimos años, [ ¿cuándo? ] especialmente en el campo de la criptografía, donde la seguridad a través de la oscuridad se ha ido abandonando cada vez más a favor de la seguridad a través del diseño que permite, y a menudo fomenta, el escrutinio público. El Jargon File hace una distinción [5] entre magia profunda , que se refiere a código basado en conocimientos teóricos esotéricos, y magia negra , que se refiere a código basado en técnicas que parecen funcionar pero que carecen de una explicación teórica. También define hechicería pesada , que se refiere al código basado en complejidades oscuras o indocumentadas de hardware o software en particular.
Ver también
- Número mágico (programación)
- Caja negra
- Programación de culto a la carga
Referencias
- ^ "perlguts - perldoc.perl.org" . 5 de octubre de 2014 . Consultado el 18 de febrero de 2015 .
- ^ Banahan, Mike; Brady, Declan; Doran, Mark (1991). "9.10.3 El
stdio.h
archivo de encabezado". El libro C: Con el estándar ANSI C . El conjunto de instrucciones (2ª ed.). Wokingham, Inglaterra: Addison-Wesley Publishers. pag. 234. ISBN 0-201-54433-4.No es seguro copiar estos objetos dentro del programa; a veces sus direcciones pueden ser "mágicas".
- ^ "perlop - perldoc.perl.org" . 7 de septiembre de 2010 . Consultado el 17 de febrero de 2011 .
- ^ a b "27. Palabras clave" (PDF) . Manual de referencia de BBC BASIC (1ª ed.). Cambridge, Inglaterra: Acorn Computers. Octubre de 1992. págs. 229, 349. ISBN 1-85250-103-0. Consultado el 9 de mayo de 2007 .[ enlace muerto ] [se necesita fuente no primaria ]
- ^ "Magia profunda" . Archivo de jerga .