Reflexió (informàtica): diferència entre les revisions

Contingut suprimit Contingut afegit
m Correcció lingüística i millora del format.
Línia 1:
En [[informàtica]], la '''reflexió''' (també anomenada pel seu mot anglès, '''''reflection''''') és la capacitat d'un programa d'examinar, i eventualment modificar, les seves estructures internes d'alt nivell (per exemple els seus [[programació orientada a objectes|objectes]]) durant la seva [[execució]].
 
== Introspecció i intercessió ==
 
Hom distingueixdistingeix dues tècniques usades pels sistemes dotats de reflexió :
 
* La '''La [[introspecció (informàtica)|introspecció]]''', és la capacitat d'un programa d'examinar el seu propi estat.
* La '''La [[intercessió (informàtica)|intercessió]]''', és la capacitat d'un programa de modificar el seu propi estat d'execució o d'alterar la seva pròpia interpretació o significat.
 
La introspecció és utilitzada per efectuar mesures de rendiment, monitoritzarmonitorar els mòduls o depurar un programa. Està implémentadaimplementada en llenguatges com [[Smalltalk]] o [[Llenguatge Java|Java]] que proveeixen eines per conèixer la [[Classe (informàtica)|classe]] d'un objecte, els seus [[atribut]]s, els seus [[Mètode (informàtica)|mètode]]s, etc. La introspecció no existeix en llenguatges com el [[Llenguatge C|C]] o el [[Pascal (Llenguatge de programació)|Pascal]].
 
La intercessió permet a un programa evolucionar automàticament en funció del seu entorn. Aquesta propietat apareix als llenguatges com [[SmallTalk]]Smalltalk o [[Python]], però no la trobarem en llenguatges com Java.
 
== Reflexió estructural i reflexió comportamental ==
Paral·lelament al concepte d'introspecció i d'intercessió, hi ha dos tipus de reflexió  : la reflexió estructural i la reflection comportamental.
 
Paral·lelament al concepte d'introspecció i d'intercessió, hi ha dos tipus de reflexió  : la reflexió estructural i la reflectionreflexió comportamental.
La '''reflexió estructural''' consisteix en [[Reificació|reificar]] el codi d'un programa i tots els [[Tipus abstracte |tipus abstractes]] accessibles per aquest programa. Al primer cas, la reificació del codi d'un programa permet de manipular aquest programa durant l'execució. És possible així de mantenir un programa al mateix temps que aquest executa les seves tasques. Al segon cas, la reificació dels tipus abstractes permet al programa d'examinar i de modificar l'estructura de tipus complexos. Es pot així, per exemple, posar a punt algorismes genèrics de [[serialització]].
 
La '''reflexió estructural''' consisteix ena [[Reificació|reificar]] el codi d'un programa i tots els [[Tipustipus abstracte |tipus abstractes]] accessibles per aquest programa. Al primer cas, la reificació del codi d'un programa permet de manipular aquest programa durant l'execució. És possible així de mantenir un programa al mateix temps que aquest executa les seves tasques. Al segon cas, la reificació dels tipus abstractes permet al programa d'examinar i de modificar l'estructura de tipus complexos. Es pot així, per exemple, posar a punt algorismes genèrics de [[serialització]].
La '''reflexió comportamental''' (o reflexió de comportament) concerneix més particularment l'execució del programa i el seu entorn. Per aquest tipus de reflexió, un programa té mitjans per sabercom s'interpreta i té la possibilitat de modificar la seva manera de ser executat, intervenint sobre les estructures de dades de l'avaluador del programa i sobre l'avaluador en sí mateix. Així, el programa pot obtenir informacions sobre la seva implementació o inclús s'auto-reorganitza amb el propòsit d'adapatar-se millor al seu « entorn ».
 
La '''reflexió comportamental''' (o reflexió de comportament) concerneix més particularment l'execució del programa i el seu entorn. Per aquest tipus de reflexió, un programa té mitjans per sabercomsaber com s'interpreta i té la possibilitat de modificar la seva manera de ser executat, intervenint sobre les estructures de dades de l'avaluador del programa i sobre l'avaluador en si mateix. Així, el programa pot obtenir informacions sobre la seva implementació o inclúsfins i tot s'auto-reorganitza amb el propòsit d'adapataradaptar-se millor al seu « entorn ».
== Reflexió i programmació orientada a objectes ==
 
== Reflexió i programmacióprogramació orientada a objectes ==
En [[programació orientada a objectes]], l'arquitectura reflexiva està implementada pel concepte dels [[Metaobjecte|metaobjectes]]. Aquests representent elements dles programes orientats a objectes com les classes, els missatges i les funcions genèriques. La manipulació d'aquests metaobjectes es fa per un [[protocol de meta-objectes]] que permet de decidir els comportements del llenguatge. [[CLOS]] ha estat el primer llenguatge a tenir implementat un protocol de meta-objectes.
 
En [[programació orientada a objectes]], l'arquitectura reflexiva està implementada pel concepte dels [[Metaobjecte|metaobjectesmetaobjecte]]s. Aquests represententrepresenten elements dlesdels programes orientats a objectes com les classes, els missatges i les funcions genèriques. La manipulació d'aquests metaobjectes es fa per un [[protocol de meta-objectesmetaobjectes]] que permet de decidir els comportementscomportaments del llenguatge. [[CLOS]] ha estat el primer llenguatge a tenir implementat un protocol de meta-objectesmetaobjectes.
 
== Llenguatge reflexiu ==
 
Els llenguatges següents suporten la reflexió :
 
* [[SmallTalkSmalltalk]]
* [[CLOS]]
* [[Python]]
Linha 34 ⟶ 35:
* [[Objective-C]]
* [[PHP]], des de la versió 5
* els llenguatges que funcionen ambsobre l'arquitexturala plataforma [[.NET]] (com el [[C sharp|C#]])
 
Entre els llenguatges on no hi ha distinció entre la compilació i l'execució ([[Lisp]] per exemple), no hi ha diferència entre la interpretació del codecodi i la reflexió.
 
== Exemple ==
 
L'exemple següent està escrit en [[Llenguatge Java|Java]] :
 
<source lang="Java">
// Sense usar la reflexió
Foo foo = new Foo ();
Foo foo.hello = new Foo();
foo.hello();
</source>
 
<source lang="Java">
// Usant la reflexió
Class cl = Class.forName ("Foo");
MethodClass methodcl = clClass.getMethod forName("holaFoo", null);
Method method.invoke (= cl.newInstance getMethod()"hello", null);
method.invoke(cl.newInstance(), null);
</source>
 
Els dos trossos de codi creen una instància de la classe ''Foo'' i criden el seu mètode ''holahello''.
 
Al primer programa, el nom de les classes i els mètodes està codificat en cru, no es pot usar el nom d'una altra classe. Al segon programa, alen contraricanvi, el nom de les classes i mètodes pot variar durant l'execució.
 
== Bibliografia ==
Linha 66 ⟶ 71:
* [[Reificació]]
* [[Metaobjecte]]
* [[Protocol dels meta-objectesmetaobjectes]]
 
[[Categoria:Programació]]