En el contexto de la programación informática, magia es un término informal para abstracción ; se utiliza 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 tipificación polimórfica 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, sugiriendo 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".
"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 se supone que no deben (en otras palabras, no son referencialmente transparentes). Según los modelos de arquitectura de software más recientes , incluso cuando se utiliza 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 infringe esta regla, a menudo se dice que contiene "magia".
Un ejemplo simplificado de magia negativa es el siguiente código en PHP :
función mágica () { global $ alguna variable ; echo $alguna variable ; }$alguna variable = verdadero ;magia ();
Si bien el código anterior es claro, 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 usando el siguiente concepto:
function noMagic ( $mivariable ) { echo $mivariable ; }$alguna variable = verdadero ;noMagic ( $alguna variable );
Cualquier SV [valor escalar] puede ser mágico, es decir, tiene características especiales que un SV normal no tiene.
— Larry Wall , página del manual de perlguts , [1] Perl 5
Esta definición de mágico o mágico se puede extender 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.
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 y no proporcionar un comportamiento de identificador 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 tipo FILE *
.while(<file_handle>)
$_
defined()
"0"
while()
while()
CALL
declaración de BBC BASIC V trata mágicamente las direcciones de llamada al sistema de Acorn MOS ; en lugar de intentar pasar 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] [ se necesita fuente no primaria ] 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.@%
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]typeof
operador tiene éxito cuando el operando es un identificador no declarado, lo que normalmente daría como resultado un archivo ReferenceError
.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 con el tiempo, especialmente en el campo de la criptografía , donde la seguridad mediante la oscuridad se ha abandonado cada vez más en favor de la seguridad mediante el diseño que permite, y a menudo fomenta, el escrutinio público.
The Jargon File hace una distinción entre magia profunda , que se refiere a códigos basados en conocimientos teóricos esotéricos, y magia negra , que se refiere a códigos basados en técnicas que parecen funcionar pero que carecen de una explicación teórica. [5] También define hechicería intensa , que se refiere al código basado en complejidades oscuras o no documentadas de hardware o software particular. Por ejemplo, el infame comentario “No se espera que entiendas esto” : muchos lectores de Lions' Book, un comentario didácticamente anotado sobre el código fuente del kernel de la versión 6 de Unix, interpretó este comentario, que se encuentra en el código, para sugerir que en el oscuro fragmento se mostraba cierta sabiduría teórica profunda, pero en realidad su función "mágica" dependía simplemente de una peculiaridad. de la forma en que se optimizó el compilador de C para el hardware PDP-11 en el que se diseñó para ejecutar la versión 6 de Unix.
stdio.h
0-201-54433-4. No es seguro copiar estos objetos dentro del programa; A veces sus direcciones pueden ser "mágicas".