Magic (programming)
From Wikipedia, the free encyclopedia
This article needs additional citations for verification. Please help improve this article by adding reliable references. Unsourced material may be challenged and removed. (September 2007) |
In the context of computer programming, magic is an informal term for abstraction - it is used to describe code that handles complex tasks while hiding that complexity to present a simple interface. The term is somewhat tongue-in-cheek and carries good connotations, implying that the interface simplifies an otherwise difficult or tedious task. For example, Perl's polymorphic typing and closure mechanisms are often called "magic". The term implies that the hidden complexity is at least in principle understandable, in contrast to black magic and deep magic, which describe arcane techniques that are deliberately hidden or extremely difficult to understand.
Contents |
[edit] Referential non-transparency
In recent years, however, a negative interpretation of the term has been gaining popularity. In this usage, "magic" refers to procedures which make calculations based on data not clearly provided to them, by accessing other modules, memory positions or global variables that they are not supposed to (in other words, they are not referentially transparent). According to most recent software architecture models, even when using structured programming, it is usually preferred to make each function behave the same way every time the same arguments are passed to it, therefore following one of the basic principles of functional programming. When a function breaks this rule, it is often said to contain "magic".
A simplified example of negative magic is the following code in PHP:
function Magic() {
global $somevariable;
echo $somevariable;
}
$somevariable = true;
Magic();
While the code above is clear and maintainable, if it is seen in a large project, it is often hard to understand where the function Magic() gets its value from. It is preferred to write that code using the following concept:
function noMagic($myvariable) {
echo $myvariable;
}
$somevariable = true;
noMagic($somevariable);
[edit] Non-orthogonality
"Any SV [scalar value] may be magical, that is, it has special features that a normal SV does not have." β Larry Wall, in Perl 5 manual page perlguts(1)
This definition of magic or magical can be extended to a data type, code fragment, keyword, or machine address that has properties not shared by otherwise identical objects. The magic may be documented or undocumented.
- In ISO C, file handles (of type
FILE
) cannot be safely copied as their addresses[1] may be magic. That is, the runtime environment may place original file handles in a hard-coded address range, and not provide file handle behaviour to user-created copies at another address. - In Perl 5, the statement
while(<
file-handle>)
assigns the line read from the file to the variable$_
, and evaluates"0"
and the empty string as true. This does not happen to<
file-handle>
anywhere else, or towhile()
with any other control expression.[2] - Another Perl example is the auto-increment operator
++
which treats a string variable as an alphanumeric odometer when it is not numeric and has never been used in a numeric context. Thus it may behave differently on two variables that are equal at face value.[2] - In Microsoft Excel 97 the cell range
X97:L97
is magic inasmuch as it helps enable the flight simulator Easter egg. - The
CALL
statement of BBC BASIC V (RISC OS) is magic on certain target addresses; instead of branching to ARM code at those addresses, it issues software interrupts corresponding to the system calls of Acorn MOS.[3] - Also in BBC BASIC, not only does the numeric variable
@%
control print formatting, it accepts direct assignment of ANSIprintf
format strings, normally a type mismatch error.[3] - Any comment that has an effect on the code is magic.
- In an emulator, especially one in development, the emulated machine's system call addresses may be magic; when they are called, the emulator may run native code for increased speed or to talk to physical hardware, and set up the emulated CPU and memory as if it had executed the original code without actually doing so.
- Memory-mapped I/O addresses and volatile variables are magic, although the techniques are so common that the term is not normally applied.
[edit] See also
- Magic number (programming)
- Black magic (programming)
- Deep magic (programming)
- Voodoo programming
[edit] References
- ^ Banahan, Mike; Brady, Declan; Doran, Mark (1991). "9.10.3 The
stdio.h
header file", The C book: Featuring the ANSI C standard, 2nd ed., The Instruction Set, Wokingham, England: Addison-Wesley Publishers, xiv, 310 pp. ISBN 0-201-54433-4. βIt is not safe to copy these objects within the program; sometimes their addresses may be 'magic'.β - ^ a b Perl 5.005, manual page perlop(1)
- ^ a b (October 1992) "27. Keywords", BBC BASIC Reference Manual (PDF), 1st ed., Cambridge, England: Acorn Computers, ix, 457, xvi pp. ISBN 1-852-50103-0. Retrieved on 2007-05-09.