Введение

Среда программирования 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.