Reflection - біографія, альбоми, пісні, кліпи


В інформатиці відбиття або рефлексія (синонім інтроспекція, англ. Reflection) означає процес, під час якого програма може відстежувати і модифікувати власну структуру і поведінку під час виконання. Парадигма програмування, покладена в основу відображення, називається рефлексивним програмуванням. Це один з видів метапрограмування.
У більшості сучасних комп'ютерних архітектур програмні інструкції (код) зберігаються як дані. Різниця між кодом і даними в тому, що виконуючи код, комп'ютери обробляють дані. Тобто інструкції виконуються, а дані обробляються так, як наказано цими інструкціями. Однак програми, написані за допомогою деяких мов, здатні обробляти власні інструкції як дані і виконувати, таким чином, рефлексивні модифікації. Такі самомодифицирующиеся програми в основному створюються за допомогою високорівневих мов програмування, що використовують віртуальні машини (наприклад, Smalltalk, скриптові мови). У меншій мірі рефлексія використовується в мовах з оголошувати та / або статичними типами (наприклад, Сі, ML, Haskell, F #).



рефлексивно-орієнтоване програмування
рефлексивно-орієнтоване програмування, або рефлексивне програмування - функціональне розширення парадигми об'єктно-орієнтованого програмування. Рефлексивно-орієнтоване програмування включає в себе самоперевірку, самомодіфікаціі і самоклонірованіе. Проте, головне достоїнство рефлексивно-орієнтованої парадигми полягає у динамічній модифікації програми, яка може бути визначена і виконана під час роботи програми. Деякі імперативні підходи, наприклад, процедурна і об'єктно-орієнтована парадигми програмування, вказують, що існує чітка зумовлена ​​послідовність операцій обробки даних. Парадигма рефлексивно-орієнтованого програмування, проте, додає можливість динамічної модифікації програмних інструкцій під час роботи і їх виклику в модифікованому вигляді. Тобто програмна архітектура сама визначає, що саме можна робити під час роботи виходячи з даних, сервісів і специфічних операцій.
Історія
Поняття рефлексії в мовах програмування введено Brian Cantwell Smith в докторській дисертації 1982 поряд з поняттям meta- circular interpreter, як компонента 3-Lisp.
Застосування
Рефлексія може використовуватися для спостереження і зміни програми під час виконання. Рефлексивний компонент програми може спостерігати за виконанням певної ділянки коду і змінювати себе для досягнення бажаної мети. Модифікація виконується під час виконання програми шляхом динамічної зміни коду.
Рефлексію можна застосовувати і для динамічної адаптації програми до різних ситуацій. Наприклад, розглянемо програму, що використовує два різних класи X і Y для виконання аналогічних операцій. Без рефлексії в коді програми методи класів X і Y будуть викликатися явно. Якщо програма спроектована із застосуванням рефлексивно-орієнтований парадигми програмування, деякий ділянку коду не міститиме явних викликів методів класів X і Y; програма виконає цю ділянку двічі: спочатку для класу X, потім для класу Y.
Реалізації
Програми, написані на мовах програмування, що підтримують рефлексію, наділені додатковими можливостями, реалізація яких на мовах низького рівня скрутна. Перерахуємо деякі з них:

пошук і модифікація конструкцій вихідного коду (блоків, класів, методів, протоколів і т. п.) як об'єкт першого класу під час виконання;
зміна імен класів і функцій під час виконання ;
аналіз і виконання рядків коду, що надходять ззовні;
створення інтерпретатора байткода нової мови.

Реалізація цих можливостей можлива різними шляхами. У мові MOO рефлексія є частиною щоденної ідіоми програмування. Всі викликаються методи отримують в контексті інформацію про те, звідки вони викликані, і посилання на об'єкти, до яких вони належать. Безпека контролюється програмно за допомогою стека викликів: викликається callers () для отримання списку методів; перевіряється, чи не заблокував Чи callers () [1] сам себе.
Компільовані мови покладаються на свої системи виконання, що забезпечують програми інформацією про їх вихідному коді. Скомпільований на Objective-C виконуваний файл, наприклад, записує імена всіх методів в один блок, створює таблицю відповідності. У компільованих мовах, що підтримують створення функцій під час виконання, таких як Common Lisp, середа виконання повинна включати компілятор і інтерпретатор.
Реалізація рефлексії на мовах, її що не підтримують, виконується за допомогою системи трансформації програми для автоматичного відстеження змін вихідного коду. [ Br] Приклади
Наступні приклади ілюструють застосування рефлексії на прикладі створення екземпляра foo класу Foo і виклику методу hello (або Hello) в різних мовах програмування. Для кожної мови приведено по два приклади: перший не використовує рефлексію, а другий використовує.
C #



/ / Без рефлексії
new Foo (). Hello (); [ Br]
/ / З рефлексією
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 foo = Class.forName ("Foo ");
foo.getMethod (" hello ", null). invoke (foo.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



/ / Без рефлексії [ Br] 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 (); [Br ] $ method = "hello";
$ f-> $ method ();



Python



# Без рефлексії [ Br] Foo (). hello ()

# З рефлексією
getattr (globals () ['Foo'] (), 'hello') ()


[ Br] 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
[ Br]

/ / Без рефлексії
var foo: Foo = new Foo ();
foo.hello ();

/ / З рефлексією
var cls: Object = getDefinitionByName ("Foo");
var foo: Object = new cls ();
foo ["hello"] ();



Delphi 2010 [Br ]


/ / Без рефлексії
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, []); [Br ] t.GetMethod ('Hello'). Invoke (foo, []);
c.Free;
end.



Див також

en: Type introspection
самомодифицирующихся код
Парадигма програмування
Список рефлективних мов програмування

Посилання
Notes

Documents
[ Br] Jonathan M. Sobel and Daniel P. Friedman. (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

Посилання



from Sun Microsystems