В контексте компьютерного программирования магия — неформальный термин для абстракции ; он используется для описания кода, который обрабатывает сложные задачи, скрывая эту сложность для представления простого интерфейса. Термин несколько ироничен и часто несет в себе плохие коннотации, подразумевая, что истинное поведение кода не сразу очевидно. Например, полиморфные механизмы типизации и замыкания Perl часто называют «магией».
Термин подразумевает, что скрытая сложность, по крайней мере, в принципе понятна, в отличие от вариантов, которые описывают тайные методы, которые намеренно скрыты или чрезвычайно сложны для понимания. Однако этот термин может также применяться ласково, предполагая «очарование» кода.
Действие таких абстракций описывается как совершаемое « автоматически », что является гибридом слов «автоматически» и «магически».
«Магия» относится к процедурам , которые выполняют вычисления на основе данных, явно им не предоставленных, путем доступа к другим модулям, позициям памяти или глобальным переменным , которые им не положено делать (другими словами, они не являются ссылочно прозрачными). Согласно самым последним моделям архитектуры программного обеспечения , даже при использовании структурного программирования обычно предпочитают, чтобы каждая функция вела себя одинаково каждый раз, когда ей передаются одни и те же аргументы, тем самым следуя одному из основных принципов функционального программирования . Когда функция нарушает это правило, часто говорят, что она содержит «магию».
Упрощенным примером негативной магии является следующий код на PHP :
функция magic () { глобальная $somevariable ; echo $somevariable ; }$somevariable = true ;магия ();
Хотя код выше понятен, если его увидеть в большом проекте, часто бывает трудно понять, откуда функция magic()
берет свое значение. Предпочтительно писать этот код, используя следующую концепцию:
функция noMagic ( $myvariable ) { echo $myvariable ; }$somevariable = true ;нетМагии ( $somevariable );
Любой SV [скалярное значение] может быть магическим, то есть иметь особые свойства, которых нет у обычного SV.
— Ларри Уолл , страница руководства perlguts , [1] Perl 5
Это определение магии или магического может быть расширено до типа данных , фрагмента кода, ключевого слова или машинного адреса, которые имеют свойства, не разделяемые в остальном идентичными объектами. Магические свойства могут быть или не быть документированы.
FILE
) не могут быть безопасно скопированы, поскольку их адреса [2] могут быть магическими. То есть среда выполнения может поместить исходные дескрипторы файлов в жестко закодированный диапазон адресов и не предоставлять поведение дескриптора файла для созданной пользователем копии по другому адресу. Следовательно, стандартные библиотечные процедуры принимают указатели на дескрипторы файлов типа FILE *
.while(<file_handle>)
$_
defined()
"0"
while()
while()
CALL
оператор BBC BASIC V обрабатывает системные адреса вызовов Acorn MOS магическим образом: вместо того, чтобы пытаться перейти к коду ARM по этим адресам, он вызывает программное прерывание в RISC OS, эквивалентное системному вызову. [4] [ необходим неосновной источник ] Эффект заключается в том, чтобы эмулировать Acorn MOS в достаточной степени для 8-битных программ BASIC, не содержащих язык ассемблера, для запуска без изменений.@%
управляет форматированием печати, но и допускает прямое назначение строк формата ANSI printf , что обычно приводит к ошибке несоответствия типов. [4]typeof
завершается успешно, если операнд является необъявленным идентификатором, что обычно приводит к ReferenceError
.stdio.h
0-201-54433-4. Копировать эти объекты внутри программы небезопасно; иногда их адреса могут быть «магическими».