Магия (программирование)
В контексте компьютерного программирования магия — это неофициальный термин для обозначения абстракции ; он используется для описания кода, который решает сложные задачи, скрывая при этом эту сложность, чтобы представить простой интерфейс. Этот термин несколько ироничен и часто несет в себе неприятный смысл, подразумевая, что истинное поведение кода не сразу становится очевидным. Например, Perl механизмы полиморфной типизации и замыкания часто называют «магическими».
Этот термин подразумевает, что скрытая сложность, по крайней мере, в принципе понятна, в отличие от вариантов, описывающих тайные техники, которые намеренно скрыты или чрезвычайно сложны для понимания. Однако этот термин также можно применять ласково, подчеркивая «очарование» кода.
Действие таких абстракций описывается как совершающееся « автоматически », смесь слов «автоматически» и «магически».
Ссылочная непрозрачность
[ редактировать ]«Магия» относится к процедурам, которые производят вычисления на основе данных, которые им явно не предоставлены, путем доступа к другим модулям, позициям памяти или глобальным переменным , к которым они не должны (другими словами, они не являются ссылочно прозрачными). Согласно самым последним моделям архитектуры программного обеспечения , даже при использовании структурного программирования обычно предпочитают, чтобы каждая функция вела себя одинаково каждый раз, когда ей передаются одни и те же аргументы, тем самым следуя одному из основных принципов функционального программирования . Когда функция нарушает это правило, часто говорят, что она содержит «магию».
Упрощенным примером негативной магии является следующий код на PHP :
function magic()
{
global $somevariable;
echo $somevariable;
}
$somevariable = true;
magic();
Хотя приведенный выше код понятен, если его увидеть в большом проекте, часто бывает трудно понять, где находится функция. magic()
получает свое значение от. Предпочтительно писать этот код, используя следующую концепцию:
function noMagic($myvariable)
{
echo $myvariable;
}
$somevariable = true;
noMagic($somevariable);
Неортогональность
[ редактировать ]Любое СВ [скалярное значение] может быть магическим, то есть иметь особые свойства, которых нет у обычного СВ.
— Ларри Уолл , perlguts , страница руководства [1] Перл 5
Это определение магии или волшебства может быть расширено до типа данных , фрагмента кода, ключевого слова или машинного адреса, которые имеют свойства, не разделяемые другими идентичными объектами. Магические свойства могут быть задокументированы, а могут и не быть задокументированы.
- В ISO C дескрипторы файлов (типа
FILE
) нельзя безопасно скопировать в качестве их адресов [2] может быть магия. То есть среда выполнения может поместить исходные дескрипторы файлов в жестко запрограммированный диапазон адресов и не обеспечивать поведение дескрипторов файлов для созданной пользователем копии по другому адресу. Следовательно, стандартные библиотечные процедуры принимают указатели на дескрипторы файлов типаFILE *
, вместо. - В Perl 5 оператор
while(<file_handle>)
строку, прочитанную из файла с помощью <file_handle> неявно присваивает переменной$_
и применяетdefined()
функцию к выражению, чтобы любая успешно прочитанная строка, даже"0"
или пустая строка , оценивается как истина и продолжаетсяwhile()
петля. Этого не происходит с <file_handle> , ни с ниwhile()
с любым другим управляющим выражением. [3] - В эмуляторе эмулируемой машины , особенно в разработке, точки системного вызова могут быть волшебными; когда они вызываются, эмулятор может запускать собственный код для удобства, скорости или доступа к физическому оборудованию, а также настраивать эмулируемый процессор и память так, как если бы он выполнял исходный код.
- Например,
CALL
оператор BBC BASIC V волшебным образом обрабатывает адреса системных вызовов Acorn MOS ; вместо того, чтобы пытаться перейти к коду ARM по этим адресам, он вызывает программное прерывание в ОС RISC, эквивалентное системному вызову. [4] [ нужен неосновной источник ] Эффект состоит в том, чтобы эмулировать Acorn MOS в достаточной степени, чтобы 8-битные программы BASIC, не содержащие ассемблер, могли работать без изменений.
- Например,
- Также в BBC BASIC не только числовая переменная
@%
контролировать форматирование печати, принимает прямое присвоение ANSI строки формата printf , обычно это ошибка несоответствия типов. [4] - В JavaScript оценка
typeof
оператор завершается успешно, если операнд является необъявленным идентификатором, что обычно приводит кReferenceError
. - Любой комментарий , влияющий на код, — это волшебство.
- Адреса ввода-вывода, отображаемые в памяти, и изменчивые переменные также являются магическими в этом смысле, хотя этот термин обычно не применяется.
См. также
[ редактировать ]- Магическое число (программирование)
- Черный ящик
- Программирование культа карго
- Номер «ничего в рукаве»
Ссылки
[ редактировать ]- ^ «perlguts – perldoc.perl.org» . 5 октября 2014 года . Проверено 18 февраля 2015 г.
- ^ Банахан, Майк; Брэди, Деклан; Доран, Марк (1991). "9.10.3
stdio.h
Заголовочный файл». Книга C: Представление стандарта ANSI C. Набор инструкций (2-е изд.). Уокингем, Англия: Addison-Wesley Publishers. стр. 234. ISBN 0-201-54433-4 .Копировать эти объекты внутри программы небезопасно; иногда их адреса могут быть «волшебными».
- ^ «perlop – perldoc.perl.org» . 7 сентября 2010 г. Проверено 17 февраля 2011 г.
- ^ Перейти обратно: а б «27. Ключевые слова» (PDF) . Справочное руководство BBC BASIC (1-е изд.). Кембридж, Англия: Acorn Computers. Октябрь 1992 г., стр. 229, 349. ISBN. 1-85250-103-0 . Проверено 9 мая 2007 г. [ мертвая ссылка ]