- Отражение (программирование)
-
Для улучшения этой статьи желательно?: - Перевести текст с иностранного языка на русский.
- Найти и оформить в виде сносок ссылки на авторитетные источники, подтверждающие написанное.
- Викифицировать статью.
Эта статья или раздел нуждается в переработке. Пожалуйста, улучшите статью в соответствии с правилами написания статей.Парадигмы программирования - Агентно-ориентированная
- Компонентно-ориентированная
- Конкатенативная
- Декларативная (контрастирует с Императивной)
- Событийно-ориентированная
- Комбинаторная
- Императивная (контрастирует с Декларативной)
- Предметно-ориентированная
- Метапрограммирование
- Автоматизация процесса программирования
- Обобщённое программирование
- Рефлексивно-ориентированная
- Итерационная
- Параллельная
- Структурная
В большинстве современных компьютерных архитектур программные инструкции (код) хранятся как данные. Разница между кодом и данными в том, что выполняя код, компьютеры обрабатывают данные. То есть инструкции выполняются, а данные обрабатываются так, как предписано этими инструкциями. Однако программы, написанные с помощью некоторых языков, способны обрабатывать собственные инструкции как данные и выполнять, таким образом, рефлексивные модификации. Такие самомодифицирующиеся программы в основном создаются с помощью высокоуровневых языков программирования, использующих виртуальные машины (например, Smalltalk, скриптовые языки). В меньшей степени рефлексия используется в языках с объявляемыми и/или статическими типами (например, Java, Си, ML, Haskell).
Содержание
Рефлексивно-ориентированное программирование
Рефлексивно-ориентированное программирование, или рефлексивное программирование — функциональное расширение парадигмы объектно-ориентированного программирования. Рефлексивно-ориентированное программирование включает в себя самопроверку, самомодификацию и самоклонирование. Тем не менее, главное достоинство рефлексивно-ориентированной парадигмы заключается в динамической модификации программы, которая может быть определена и выполнена во время работы программы. Некоторые императивные подходы, например, процедурная и объектно-ориентированная парадигмы программирования, указывают, что существует четкая предопределённая последовательность операций обработки данных. Парадигма рефлексивно-ориентированного программирования, тем не менее, добавляет возможность динамической модификации программных инструкций во время работы и их вызова в модифицированном виде. То есть программная архитектура сама определяет, что именно можно делать во время работы исходя из данных, сервисов и специфических операций.
История
Понятие рефлексии в языках программирования введено Brian Cantwell Smith в докторской диссертации 1982 г.[2][3] наряду с понятием meta-circular interpreter, как компонента 3-Lisp.
Применение
Рефлексия может использоваться для наблюдения и изменения программы во время выполнения. Рефлексивный компонент программы может наблюдать за выполнением определённого участка кода и изменять себя для достижения желаемой цели. Модификация выполняется во время выполнения программы путём динамического изменения кода.
Рефлексию можно применять и для динамической адаптации программы к различным ситуациям. Например, рассмотрим программу, использующую два разных класса
X
иY
для выполнения аналогичных операций. Без рефлексии в коде программы методы классовX
иY
будут вызываться явно. Если программа спроектирована с применением рефлексивно-ориентированный парадигмы программирования, некоторый участок кода не будет содержать явных вызовов методов классовX
иY
; программа выполнит этот участок дважды: сначала для классаX
, затем для классаY
.Реализации
Программы, написанные на языках программирования, поддерживающих рефлексию, наделены дополнительными возможностями, реализация которых на языках низкого уровня затруднительна. Перечислим некоторые из них:
- поиск и модификация конструкций исходного кода (блоков, классов, методов, протоколов и т. п.) как объект первого класса во время выполнения;
- изменение имён классов и функций во время выполнения;
- анализ и выполнение строк кода, поступающих извне;
- создание интерпретатора байткода нового языка.
Реализация этих возможностей возможна разными путями. В языке MOO рефлексия является частью ежедневной идиомы программирования. Все вызываемые методы получают в контексте информацию о том, откуда они вызваны, и ссылки на объекты, к которым они принадлежат. Безопасность контролируется программно с помощью стека вызовов: вызывается callers() для получения списка методов; проверяется, не заблокировал ли callers()[1] сам себя.
Компилируемые языки полагаются на свои системы выполнения, обеспечивающие программы информацией о их исходном коде. Скомпилированный на Objective-C выполняемый файл, например, записывает имена всех методов в один блок, создаёт таблицу соответствия. В компилируемых языках, поддерживающих создание функций во время выполнения, таких как Common Lisp, среда выполнения должна включать компилятор и интерпретатор.
Реализация рефлексии на языках, её не поддерживающих, выполняется с помощью системы трансформации программы для автоматического отслеживания изменений исходного кода.
Примеры
Следующие примеры иллюстрируют применение рефлексии на примере создания экземпляра
foo
классаFoo
и вызова методаhello
(илиHello
) в различных языках программирования. Для каждого языка приведено по два примера: первый не использует рефлексию, а второй использует.C#
// Без рефлексии new Foo().Hello(); // С рефлексией Type type=System.Type.GetType("Foo"); var foo=Activator.CreateInstance(type); foo.GetType().GetMethod("Hello").Invoke(foo, null);
ECMAScript
Также работает на JavaScript и ActionScript:
//Без рефлексии new Foo().hello() // С рефлексией // assuming that Foo resides in this new this['Foo']()['hello']() // or without assumption new (eval('Foo'))()['hello']()
Java
// Без рефлексии new Foo().hello(); // С рефлексией Class cls = Class.forName("Foo"); cls.getMethod("hello", null).invoke(cls.newInstance(), null);
Qt/C++
Библиотека Qt расширяет возможности C++ с помощью метаязыка и обеспечивает поддержку рефлексии для ссылок на члены/методы класса и запрос имени объектов Qt с помощью класса QMetaObject, содержащего метаданные об объектах Qt.
// Без рефлексии QObject *obj = new QPushButton; obj->metaObject()->className(); // "QPushButton" // С рефлексией QPushButton::staticMetaObject.className(); // "QPushButton"
Lua
-- Без рефлексии Foo.hello() -- С рефлексией _G['Foo']['hello']()
Objective-C
// Без рефлексии Foo *foo = [[Foo alloc] init]; [foo hello]; // С рефлексией Class cls = NSClassFromString(@"Foo"); id foo = [[cls alloc] init]; SEL selector = NSSelectorFromString(@"hello"); [foo performSelector:selector withObject:nil];
Perl
# Без рефлексии my $foo = Foo->new(); $foo->hello(); # С рефлексией my $class = "Foo"; my $method = "hello"; my $object = $class->new(); $object->$method();
PHP
//Без рефлексии $oFoo = new Foo(); $oFoo->hello(); //С рефлексией $oReflector = new ReflectionClass('Foo'); $oFoo = $oReflector->newInstance(); $oHello = $oReflector->getMethod('hello'); $oHello->invoke($oFoo); //С использованием callback $oFoo = new Foo(); call_user_func(array($oFoo,'hello')); //С использованием синтаксиса переменных переменных $class_name = "Foo"; $f = new $class_name(); $method = "hello"; $f->$method();
Python
# Без рефлексии Foo().hello() # С рефлексией getattr(globals()['Foo'](), 'hello')()
Ruby
# Без рефлексии Foo.new.hello # С рефлексией Object.const_get(:Foo).send(:new).send(:hello)
Smalltalk
"Без рефлексии" Foo new hello "С рефлексией" ((Smalltalk at: #Foo) perform: #new) perform: #hello
Io
Foo := Object clone do( hello := method( "Hello" println ) ) # Без рефлексии Foo hello # С рефлексией getSlot("Foo") getSlot("hello") call
ActionScript 3.0
// Без рефлексии var foo:Foo = new Foo(); foo.hello(); // С рефлексией var cls:Object = getDefinitionByName("Foo"); var foo:Object = new cls(); foo.["hello"]();
Delphi 2010
// Без рефлексии var foo : TFoo; begin foo := TFoo.Create(); foo.Hello(); end; // С рефлексией var c : TRttiContext; t : TRttiInstanceType; foo : TValue; begin c := TRttiContext.Create; t := (c.FindType('TFoo') as TRttiInstanceType); foo := t.GetMethod('Create').Invoke(t.MetaclassType,[]); t.GetMethod('Hello').Invoke(foo,[]); c.Free; end.
См. также
- en:Type introspection
- Самомодифицирующийся код
- Парадигма программирования
- Список рефлективных языков программирования
Ссылки
Notes
- ↑ Руководство Мета Халлбата англ. Matt Hurlbutt по поведенческой рефлексии и её реализации (англ.)
- ↑ , кандидатская диссертация, «Процедурная рефлексия в языках программирования», Массачусетский технологический институт, факультет электротехники и информатики, 1982 (англ.)
- ↑ Brian C. Smith. Рефлексия и семантики в процедурных языках программирования. Служебный отчёт MIT-LCS-TR-272, Массачусетский технологический институт, Кембридж, Mass., январь 1982 (англ.)
Documents
- Jonathan M. Sobel and Daniel P. Friedman. An Introduction to Reflection-Oriented Programming (1996), Indiana University.
Дополнительная информация
- Ira R. Forman and Nate Forman, Java Reflection in Action (2005), ISBN 1-932394-18-4
- Ira R. Forman and Scott Danforth, Putting Metaclasses to Work (1999), ISBN 0-201-43305-2
Ссылки
- Reflection in logic, functional and object-oriented programming: a short comparative study
- An Introduction to Reflection-Oriented Programming
- Brian Foote’s pages on Reflection in Smalltalk
- Java Reflection Tutorial from Sun Microsystems
Категория:- Концепции языков программирования
Wikimedia Foundation. 2010.
Полезное
Смотреть что такое "Отражение (программирование)" в других словарях:
Отражение — Отражение: Отражение (физика) физический процесс взаимодействия волн или частиц с поверхностью. Отражение (геометрия) движение евклидова пространства, множество неподвижных точек которого является гиперплоскостью. Отражение… … Википедия
ПРОГРАММИРОВАНИЕ — особая форма организации проблемного мышления и деятельности, предполагающая составление программы; П. форма связывания идеальной и социокультурной действительностей, своеобразный способ перехода из одной в другую. Поскольку программа должна… … Новейший философский словарь
Отражение (психология) — У этого термина существуют и другие значения, см. Отражение. Отражение это простейшая форма копирования кого либо как способ общения с ним. В человеческом поведении обычно наблюдают виды отражения: перенимание позы, жестикулирование и выделение… … Википедия
Реактивное программирование — Парадигмы программирования Агентно ориентированная Компонентно ориентированная Конкатенативная Декларативная (контрастирует с Императивной) Ограничениями Функциональная Потоком данных Таблично ориентированная (электронные таблицы) Реактивная … Википедия
Пространство имен (программирование) — Пространство имён (от англ. namespace) некоторое множество, под которым подразумевается модель, абстрактное хранилище или окружение, созданное для логической группировки уникальных идентификаторов (т.е. имён). Идентификатор, определенный в… … Википедия
Пространство имён (программирование) — У этого термина существуют и другие значения, см. Пространство имён. Пространство имён (англ. namespace) некоторое множество, под которым подразумевается модель, абстрактное хранилище или окружение, созданное для логической группировки … Википедия
Метаданные в .NET — (англ. .NET metadata) термин, относящийся к платформе Microsoft .NET и обозначающий определённые структуры данных, добавляемые в код Common Intermediate Language для описания высокоуровневой структуры кода. Метаданные описывают все классы и… … Википедия
Метакласс — (англ. Metaclass) в объектно ориентированном программировании это класс, экземпляры которого в свою очередь являются классами[1][2]. Содержание … Википедия
Тип данных — (встречается также термин вид данных) фундаментальное понятие теории программирования. Тип данных определяет множество значений, набор операций, которые можно применять к таким значениям и, возможно, способ реализации хранения значений и… … Википедия
Reflection (значения) — Reflection (альбом) сборник песен группы Paradise Lost. Отражение (программирование) механизм языка программирования, позволяющий во время выполнения исследовать и изменять структуру программы. Отражение (физика) физический процесс взаимодействия … Википедия