Reflektion (programmering)

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 31 augusti 2021; kontroller kräver 2 redigeringar .

Reflektion ( reflektion ; en holonym för introspektion , engelsk  reflektion ) är en process under vilken ett program kan spåra och modifiera sin egen struktur och sitt beteende under körning. Programmeringsparadigmet som ligger bakom reflektion är en av formerna av metaprogrammering [1] och kallas reflekterande programmering .

Under exekveringen av programinstruktioner (kod) bearbetar datorer data, vilket leder till att de ändras, medan datorer inte ändrar koden. Men i de flesta moderna datorarkitekturer lagras kod som data, och vissa programmeringsspråk har förmågan att behandla inbyggd kod som data, vilket leder till förändringar i själva koden under dess exekvering. Sådana självmodifierande program skapas oftast med högnivåprogrammeringsspråk som använder virtuella maskiner (t.ex. Smalltalk , skriptspråk ). I mindre utsträckning används reflektion i språk med deklarerade eller statiska typer (t.ex. C , ML , Haskell , F# ).

Begreppet reflektion i programmeringsspråk introducerades av Brian Cantwell Smith i sin doktorsavhandling 1982 [ 2] [3] tillsammans med konceptet om en meta -cirkulär utvärderare som en komponent i 3-Lisp .  

Reflektionsorienterad programmering

Reflekterande programmering, eller reflekterande programmering, är en funktionell förlängning av det objektorienterade programmeringsparadigmet . Reflektionsorienterad programmering inkluderar självkontroll, självmodifiering och självkloning. Den största fördelen med det reflektionsorienterade paradigmet ligger dock i den dynamiska modifieringen av programmet, som kan definieras och exekveras medan programmet körs. Vissa imperativa tillvägagångssätt, såsom procedurmässiga och objektorienterade programmeringsparadigm, indikerar att det finns en tydlig fördefinierad sekvens av databehandlingsoperationer. Det reflekterande orienterade programmeringsparadigmet lägger dock till möjligheten att dynamiskt modifiera programinstruktioner vid körning och anropa dem i en modifierad form. Det vill säga att mjukvaruarkitekturen själv avgör vad som exakt kan göras under drift baserat på data, tjänster och specifika operationer.

Applikation

Reflektion kan användas för att observera och modifiera ett program under körning. Den reflekterande komponenten i programmet kan observera exekveringen av ett visst stycke kod och ändra sig själv för att uppnå det önskade målet. Modifiering utförs under programexekveringen genom att dynamiskt ändra koden.

Reflektion kan också användas för att dynamiskt anpassa ett program till olika situationer. Tänk till exempel på ett program som använder två olika klasser Xoch Yför att utföra liknande operationer. Utan reflektion i programkoden kommer klassmetoder Xatt Yanropas explicit. Om programmet är designat med hjälp av det reflektionsorienterade programmeringsparadigmet kommer en del av koden inte att innehålla explicita anrop till klassmetoder Xoch Y; programmet kommer att köra det här avsnittet två gånger: först för klass X, sedan för klass Y.

Ett exempel som illustrerar fördelarna med reflektion är Serialisering av ett objekt till JSON . Utan eftertanke skulle det vara nödvändigt att explicit specificera alla klassfältnamn och hänvisa till deras värden för serialisering. Men eftertanke gör att programmet självt kan bestämma alla tillgängliga fält och få deras textnamn. Således blir serialisering tillgänglig för alla objekt utan att skriva extra kod.

Implementeringar

Program skrivna på programmeringsspråk som stöder reflektion är utrustade med ytterligare funktioner som är svåra att implementera på lågnivåspråk. Vi listar några av dem:

Dessa funktioner kan implementeras på olika sätt. I MOO- språket är reflektion en del av det dagliga programmeringsspråket. Alla anropade metoder får i sammanhanget information om varifrån de anropas och referenser till de objekt som de tillhör. Säkerheten styrs programmatiskt med anropsstacken: callers() anropas för att få en lista över metoder; kontrollerar om callers()[1] har blockerat sig själv.

Kompilerade språk förlitar sig på sina runtime-miljöer för att förse program med information om deras källkod. En körbar fil kompilerad på Objective-C , till exempel, skriver namnen på alla metoder i ett block, skapar en uppslagstabell. I kompilerade språk som stöder att skapa funktioner vid körning, såsom Common Lisp , måste körtiden innehålla en kompilator och en tolk.

Implementeringen av reflektion på språk som inte stöder det utförs med hjälp av programtransformationssystemet för att automatiskt spåra ändringar i källkoden.

Exempel

Ett exempel i C# , där en instans fooav klassen skapas Foooch ett metodanrop görs Hellosom inte använder reflektion och använder det:

// Utan eftertanke nya Foo (). hej (); // Med reflektion Typ typ = System . typ . GetType ( "foo" ); var foo = Aktivator . CreateInstance ( typ ); foo . Gettype (). GetMethod ( "Hej" ). Åberopa ( foo , null );

Liknande exempel för ECMAScript , JavaScript och ActionScript :

// Utan eftertanke nya Foo (). hej () // Med eftertanke // antar att Foo är i detta nya [ ' Foo' ]()[ 'hej' ]() // inga antaganden nya ( eval ( 'Foo' ))()[ 'hej' ]()

Anteckningar

  1. Meta Hullbuts guide .  Matt Hurlbutt om beteendereflektion och implementering
  2. Doktorsavhandling, "Procedural Reflection in Programming Languages", Massachusetts Institute of Technology, Department of Electrical and Computer Science, 1982
  3. Brian C. Smith. Reflektion och semantik i processuella programmeringsspråk. Service Report MIT-LCS-TR-272, Massachusetts Institute of Technology, Cambridge, Massachusetts, januari 1982 (engelska) (länk ej tillgänglig) . Datum för åtkomst: 15 januari 2011. Arkiverad från originalet den 13 december 2015. 

Litteratur

  • Forman, Ira R. och Forman, Nate. Java Reflection in Action. - Manning Publications Co., 2004. - ISBN 1932394184 .
  • Forman, Ira R. och Danforth, Scott H. Putting Metaclasses to Work: A New Dimension in Object-oriented Programming. - Addison Wesley Longman Publishing Co., Inc., 1999. - ISBN 0-201-43305-2 .

Länkar