Введение
Среда программирования Magic
В контексте компьютерного программирования, "магия" – это неформальный термин для обозначения абстракции; он используется для описания кода, который выполняет сложные задачи, скрывая эту сложность и предоставляя простой интерфейс. Термин носит несколько ироничный характер и часто имеет негативные коннотации, подразумевая, что истинное поведение кода не очевидно с первого взгляда. Например, полиморфная типизация и замыкания в Perl часто называют "магией". Термин подразумевает, что скрытая сложность, по крайней мере в принципе, понятна, в отличие от "черной магии" и "глубокой магии" (см. раздел "Варианты"), которые описывают эзотерические техники, намеренно скрытые или чрезвычайно трудные для понимания. Однако этот термин может также использоваться с симпатией, подразумевая своеобразное "очарование" кода. Действие таких абстракций описывается как происходящее "автомагически" – это смешение слов "автоматически" и "магически".
Неортогональность
Любое SV [скалярное значение] может быть магическим, то есть обладать особыми свойствами, которых нет у обычного SV. Это определение магии или магического можно распространить на тип данных, фрагмент кода, ключевое слово или машинный адрес, обладающие свойствами, не свойственными в противном случае идентичным объектам. Магические свойства могут быть задокументированы, а могут и не быть. В ISO C файловые дескрипторы (типа ) нельзя безопасно копировать, поскольку их адреса могут быть магическими. То есть, среда выполнения может помещать исходные файловые дескрипторы в жестко заданный диапазон адресов и не предоставлять поведение файлового дескриптора пользовательской копии, созданной по другому адресу. Следовательно, стандартные библиотечные процедуры принимают указатели на файловые дескрипторы типа , вместо этого. В Perl 5 оператор while неявно присваивает строку, прочитанную из файла , переменной , и применяет функцию к выражению, так что любая успешно прочитанная строка, даже или пустая строка, оценивается как истина и продолжает цикл. Это не происходит ни с чем другим, ни с каким-либо другим управляющим выражением. В эмуляторе, особенно находящемся в разработке, точки системных вызовов эмулируемой машины могут быть магическими; при их вызове эмулятор может запускать собственный код для удобства, скорости или доступа к физическому оборудованию и настраивать эмулированный процессор и память так, как если бы выполнялся исходный код. Например, в BBC BASIC V адреса системных вызовов Acorn MOS обрабатываются магическим образом; вместо попытки перехода к коду ARM по этим адресам, он вызывает программное прерывание в RISC OS, эквивалентное системному вызову. Эффект заключается в достаточной эмуляции Acorn MOS для 8-битных BASIC-программ, не содержащих ассемблер, чтобы они работали без изменений. Также в BBC BASIC числовая переменная не только управляет форматированием вывода, но и принимает прямое присваивание строк формата ANSI, что обычно является ошибкой несоответствия типов. Кроме того, она определяет настоящую магию, которая относится к коду, основанному на неочевидных или недокументированных особенностях конкретного оборудования или программного обеспечения. Например, печально известный комментарий «Вы не должны это понимать» (You are not expected to understand this) — многие читатели книги Лайона, дидактически аннотированного комментария к исходному коду ядра Unix версии 6, интерпретировали этот комментарий, найденный в коде, как намек на то, что в этом фрагменте содержится глубокая теоретическая мудрость, но на самом деле его «магическая» функция была просто обусловлена особенностью оптимизации компилятора C для аппаратного обеспечения PDP 11, на котором была разработана версия 6 Unix.
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 magical properties may or may not be documented. In ISO C, file handles (of type ) cannot be safely copied as their addresses 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 a user created copy at another address. Consequently, the standard library routines accept pointers to file handles, of type , instead. In Perl 5, the statement while implicitly assigns the line read from the file by to the variable , and applies the function to the expression so that any successfully read string, even or the empty string, evaluates as true and continues the loop. This does not happen to anywhere else, or to with any other control expression. In an emulator, especially one in development, the emulated machine's system call points may be magic; when they are called, the emulator may run native code for convenience, speed or access to physical hardware, and set up the emulated CPU and memory as if it had executed the original code. For instance, the statement of BBC BASIC V treats the system call addresses of Acorn MOS magically; instead of attempting to branch to ARM code at those addresses, it raises a software interrupt in RISC OS equivalent to the system call. The effect is to emulate Acorn MOS sufficiently for 8 bit BASIC programs not containing assembly language to run without modification. Also in BBC BASIC, not only does the numeric variable control print formatting, it accepts direct assignment of ANSI format strings, normally a type mismatch error. It also defines heavy wizardry, which refers to code based on obscure or undocumented intricacies of particular hardware or software. For an example, the infamous “You are not expected to understand this” comment: many readers of Lions’ Book, a didactically annotated commentary on the Unix version 6 kernel source code, interpreted this comment, found in the code, to suggest some deep theoretical wisdom was on display in the obscure snippet, but in fact its "magical" function was merely dependant on a peculiarity of the way the C compiler was optimised for the PDP 11 hardware on which version 6 of Unix was designed to run.