Магия (программирование)

В контексте компьютерного программирования магия — неформальный термин для абстракции ; он используется для описания кода, который обрабатывает сложные задачи, скрывая эту сложность для представления простого интерфейса. Термин несколько ироничен и часто несет в себе плохие коннотации, подразумевая, что истинное поведение кода не сразу очевидно. Например, полиморфные механизмы типизации и замыкания Perl часто называют «магией».

Термин подразумевает, что скрытая сложность, по крайней мере, в принципе понятна, в отличие от вариантов, которые описывают тайные методы, которые намеренно скрыты или чрезвычайно сложны для понимания. Однако этот термин может также применяться ласково, предполагая «очарование» кода.

Действие таких абстракций описывается как совершаемое « автоматически », что является гибридом слов «автоматически» и «магически».

Ссылочная непрозрачность

«Магия» относится к процедурам , которые выполняют вычисления на основе данных, явно им не предоставленных, путем доступа к другим модулям, позициям памяти или глобальным переменным , которые им не предназначены (другими словами, они не являются ссылочно прозрачными). Согласно самым последним моделям архитектуры программного обеспечения , даже при использовании структурного программирования , обычно предпочитают , чтобы каждая функция вела себя одинаково каждый раз, когда ей передаются одни и те же аргументы, тем самым следуя одному из основных принципов функционального программирования . Когда функция нарушает это правило, часто говорят, что она содержит «магию».

Упрощенным примером негативной магии является следующий код на PHP :

функция  magic () {  глобальная  $somevariable ; echo  $somevariable ; }$somevariable  =  true ;магия ();

Хотя код выше понятен, если его увидеть в большом проекте, часто бывает трудно понять, откуда функция magic()берет свое значение. Предпочтительно писать этот код, используя следующую концепцию:

функция  noMagic ( $myvariable ) {  echo  $myvariable ; }$somevariable  =  true ;нетМагии ( $somevariable );

Неортогональность

Любой SV [скалярное значение] может быть магическим, то есть иметь особые свойства, которых нет у обычного SV.

—  Ларри Уолл , страница руководства perlguts , [1] Perl 5

Это определение магии или магического может быть расширено до типа данных , фрагмента кода, ключевого слова или машинного адреса, которые имеют свойства, не разделяемые в остальном идентичными объектами. Магические свойства могут быть или не быть документированы.

  • В ISO C дескрипторы файлов (типа FILE) не могут быть безопасно скопированы, поскольку их адреса [2] могут быть магическими. То есть среда выполнения может поместить исходные дескрипторы файлов в жестко закодированный диапазон адресов и не предоставлять поведение дескриптора файла для созданной пользователем копии по другому адресу. Следовательно, стандартные библиотечные процедуры принимают указатели на дескрипторы файлов типа FILE *.
  • В Perl 5 оператор неявно присваивает строку, прочитанную из файла с помощью <file_handle> , переменной и применяет функцию к выражению, так что любая успешно прочитанная строка, даже пустая строка , оценивается как истинная и продолжает цикл. Этого не происходит с <file_handle> где-либо еще или с любым другим управляющим выражением. [3]while(<file_handle>)$_defined()"0"while()while()
  • В эмуляторе , особенно в том, который находится в стадии разработки, системные точки вызова эмулируемой машины могут быть магическими; при их вызове эмулятор может запустить собственный код для удобства, скорости или доступа к физическому оборудованию и настроить эмулируемый процессор и память так, как если бы он выполнил исходный код.
    • Например, CALLоператор BBC BASIC V обрабатывает системные адреса вызовов Acorn MOS магическим образом: вместо того, чтобы пытаться перейти к коду ARM по этим адресам, он вызывает программное прерывание в RISC OS, эквивалентное системному вызову. [4] [ необходим неосновной источник ] Эффект заключается в том, чтобы эмулировать Acorn MOS в достаточной степени для 8-битных программ BASIC, не содержащих язык ассемблера, для запуска без изменений.
  • Кроме того, в BBC BASIC числовая переменная не только @%управляет форматированием печати, но и допускает прямое назначение строк формата ANSI printf , что обычно приводит к ошибке несоответствия типов. [4]
  • В JavaScript вычисление оператора typeofзавершается успешно, если операнд является необъявленным идентификатором, что обычно приводит к ReferenceError.
  • Любой комментарий , влияющий на код, — это магия.
  • Адреса ввода-вывода, отображенные в памяти, и изменчивые переменные также являются магией в этом смысле, хотя этот термин обычно не применяется.

Смотрите также

Ссылки

  1. ^ "perlguts – perldoc.perl.org". 5 октября 2014 г. Получено 18 февраля 2015 г.
  2. ^ Банахан, Майк; Брэди, Деклан; Доран, Марк (1991). "9.10.3 Заголовочный файл". Книга C: Знакомство со стандартом ANSI C. Набор инструкций (2-е изд.). Уокингем, Англия: Addison-Wesley Publishers. стр. 234. ISBNstdio.h 0-201-54433-4. Копировать эти объекты внутри программы небезопасно; иногда их адреса могут быть «магическими».
  3. ^ "perlop – perldoc.perl.org". 7 сентября 2010 г. Получено 17 февраля 2011 г.
  4. ^ ab "27. Ключевые слова" (PDF) . Справочное руководство BBC BASIC (1-е изд.). Кембридж, Англия: Acorn Computers. Октябрь 1992 г. стр. 229, 349. ISBN 1-85250-103-0. Получено 9 мая 2007 г.[ мертвая ссылка ]
Взято с "https://en.wikipedia.org/w/index.php?title=Magic_(programming)&oldid=1229788162"