Reflexe (programování)

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 31. srpna 2021; kontroly vyžadují 2 úpravy .

Odraz ( reflexe ; holonymum pro introspekci , anglicky  reflexe ) je proces, během kterého může program sledovat a upravovat svou vlastní strukturu a chování za běhu. Programovací paradigma , které je základem reflexe, je jednou z forem metaprogramování [1] a nazývá se reflexivní programování .

Při provádění programových instrukcí (kódu) počítače zpracovávají data, což vede k jejich změně, zatímco počítače kód nemění. Ve většině moderních počítačových architektur je však kód uložen jako data a některé programovací jazyky mají schopnost zacházet s nativním kódem jako s daty, což vede ke změnám v samotném kódu během jeho provádění. Takové samo-modifikační programy jsou většinou vytvářeny pomocí programovacích jazyků na vysoké úrovni, které používají virtuální stroje (např. Smalltalk , skriptovací jazyky ). V menší míře se reflexe používá v jazycích s deklarovanými nebo statickými typy (např . C , ML , Haskell , F# ).

Koncept reflexe v programovacích jazycích představil Brian Cantwell Smith ve své doktorské práci v roce 1982 [ 2] [3] spolu s konceptem meta - kruhového hodnotitele jako součásti 3-Lisp .  

Programování zaměřené na reflexi

Reflektivně orientované programování, neboli reflektivní programování, je funkční rozšíření paradigmatu objektově orientovaného programování . Programování zaměřené na reflexi zahrnuje samokontrolu, vlastní modifikaci a samoklonování. Hlavní výhoda paradigmatu orientovaného na reflexi však spočívá v dynamické modifikaci programu, kterou lze definovat a provádět za běhu programu. Některé imperativní přístupy, jako jsou procedurální a objektově orientované programovací paradigmata, naznačují, že existuje jasná předem definovaná sekvence operací zpracování dat. Paradigma reflektivně orientovaného programování však přidává možnost dynamicky upravovat instrukce programu za běhu a volat je v upravené podobě. To znamená, že samotná softwarová architektura určuje, co přesně lze během provozu dělat na základě dat, služeb a konkrétních operací.

Aplikace

Odraz lze použít k pozorování a úpravě programu během provádění. Reflexní složka programu může pozorovat provádění určitého kusu kódu a měnit se tak, aby dosáhl požadovaného cíle. Modifikace se provádí během provádění programu dynamickou změnou kódu.

Reflexe lze také použít k dynamickému přizpůsobení programu různým situacím. Zvažte například program, který používá dvě různé třídy Xa Yprovádí podobné operace. Bez odrazu v kódu programu Xbudou metody třídy Yvolány explicitně. Pokud je program navržen pomocí paradigmatu programování orientovaného na reflexi, některá část kódu nebude obsahovat explicitní volání metod třídy Xa Y; program provede tuto sekci dvakrát: nejprve for class X, potom for class Y.

Příkladem, který ilustruje výhody reflexe, je serializace objektu do JSON . Bez reflexe by bylo nutné explicitně specifikovat všechny názvy polí tříd a odkazovat na jejich hodnoty pro serializaci. Ale reflexe umožňuje programu samotnému určit všechna dostupná pole a získat jejich textová jména. Serializace se tak stane dostupnou pro jakýkoli objekt bez psaní dalšího kódu.

Implementace

Programy napsané v programovacích jazycích, které podporují reflexi, jsou vybaveny dalšími funkcemi, které je obtížné implementovat v jazycích nižší úrovně. Uvádíme některé z nich:

Tyto funkce lze implementovat různými způsoby. V jazyce MOO je reflexe součástí každodenního programátorského idiomu. Všechny volané metody dostávají v kontextu informace o tom, odkud jsou volány, a odkazy na objekty, ke kterým patří. Zabezpečení je řízeno programově pomocí zásobníku volání: volá se callers() , aby získal seznam metod; zkontroluje, zda se callers()[1] zablokovalo.

Kompilované jazyky se spoléhají na svá runtime prostředí, která poskytují programům informace o jejich zdrojovém kódu. Spustitelný soubor zkompilovaný na Objective-C například zapíše názvy všech metod do jednoho bloku, vytvoří vyhledávací tabulku. V kompilovaných jazycích, které podporují vytváření funkcí za běhu, jako je Common Lisp , musí běhové prostředí obsahovat kompilátor a interpret.

Implementace reflexe v jazycích, které ji nepodporují, se provádí pomocí systému transformace programu pro automatické sledování změn ve zdrojovém kódu.

Příklady

Příklad v C# , ve kterém je vytvořena instance footřídy Fooa je provedeno volání metody Hello, která nepoužívá reflexi a používá ji:

// Bez odrazu nový Foo (). ahoj (); // S odrazem Typ typu = System . typ . GetType ( "foo" ); var foo = Aktivátor . CreateInstance ( typ ); foo . Gettype (). GetMethod ( "Ahoj" ). Invoke ( foo , null );

Podobný příklad pro ECMAScript , JavaScript a ActionScript :

// Bez odrazu nový Foo (). ahoj () // S odrazem // za předpokladu, že Foo je v tomto novém [ ' Foo' ]()[ 'hello' ]() // žádné předpoklady nové ( eval ( 'Foo' ))()[ 'ahoj' ]()

Poznámky

  1. Meta Hullbut's Guide .  Matt Hurlbutt o reflexi a implementaci chování
  2. Disertační práce, "Procedurální reflexe v programovacích jazycích", Massachusetts Institute of Technology, Department of Electrical and Computer Science, 1982
  3. Brian C. Smith. Reflexe a sémantika v procedurálních programovacích jazycích. Servisní zpráva MIT-LCS-TR-272, Massachusetts Institute of Technology, Cambridge, Massachusetts, leden 1982 (anglicky) (odkaz není k dispozici) . Datum přístupu: 15. ledna 2011. Archivováno z originálu 13. prosince 2015. 

Literatura

  • Forman, Ira R. a Forman, Nate. Java Reflection v akci. - Manning Publications Co., 2004. - ISBN 1932394184 .
  • Forman, Ira R. a Danforth, Scott H. Uvedení metatříd do práce: Nová dimenze objektově orientovaného programování. - Addison Wesley Longman Publishing Co., Inc., 1999. - ISBN 0-201-43305-2 .

Odkazy