Heijastus (ohjelmointi)

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 31. elokuuta 2021 tarkistetusta versiosta . tarkastukset vaativat 2 muokkausta .

Reflektio ( reflection ; holonyymi sanalle introspection , englanniksi  reflektio ) on prosessi, jonka aikana ohjelma voi seurata ja muokata omaa rakennettaan ja käyttäytymistään ajon aikana. Reflektorin taustalla oleva ohjelmointiparadigma on yksi metaohjelmoinnin muodoista [1] ja sitä kutsutaan reflektiiviseksi ohjelmoimiseksi .

Ohjelmakäskyjen (koodin) suorittamisen aikana tietokoneet käsittelevät dataa, mikä johtaa sen muutokseen, kun taas tietokoneet eivät muuta koodia. Useimmissa nykyaikaisissa tietokonearkkitehtuureissa koodi kuitenkin tallennetaan datana, ja joillakin ohjelmointikielillä on kyky käsitellä alkuperäistä koodia datana, mikä johtaa itse koodin muutoksiin sen suorittamisen aikana. Tällaiset itsemuovautuvat ohjelmat luodaan enimmäkseen korkean tason ohjelmointikielillä, jotka käyttävät virtuaalikoneita (esim. Smalltalk , komentosarjakielet ). Vähäisemmässä määrin reflektiota käytetään kielissä, joilla on deklaroitu tai staattinen tyyppi (esim . C , ML , Haskell , F# ).

Brian Cantwell Smith esitteli ohjelmointikielten reflektion käsitteen vuoden 1982 väitöskirjassaan [ 2 ] [3] sekä meta - circular-arvioijan käsitteen 3-Lispin komponenttina .  

Heijastussuuntautunut ohjelmointi

Reflektiivinen ohjelmointi tai reflektiivinen ohjelmointi on olio-ohjelmoinnin paradigman toiminnallinen laajennus . Heijastussuuntautunut ohjelmointi sisältää itsetarkistuksen, itsemuokkauksen ja itsekloonauksen. Heijastussuuntautuneen paradigman tärkein etu on kuitenkin ohjelman dynaaminen modifikaatio, joka voidaan määritellä ja suorittaa ohjelman ollessa käynnissä. Jotkut pakolliset lähestymistavat, kuten proseduuri- ja olioohjelmointiparadigmat, osoittavat, että tietojenkäsittelytoimintoja on ennalta määrätty selkeästi. Reflektoroiva ohjelmointiparadigma lisää kuitenkin mahdollisuuden dynaamisesti muokata ohjelman käskyjä ajon aikana ja kutsua niitä muokatussa muodossa. Toisin sanoen ohjelmistoarkkitehtuuri itse määrittää datan, palvelujen ja tiettyjen toimintojen perusteella mitä toiminnan aikana voidaan tehdä.

Sovellus

Heijastusta voidaan käyttää ohjelman tarkkailuun ja muokkaamiseen suorituksen aikana. Ohjelman heijastava komponentti voi tarkkailla tietyn koodinpalan suorittamista ja muuttaa itseään saavuttaakseen halutun tavoitteen. Muokkaus suoritetaan ohjelman suorituksen aikana dynaamisesti muuttamalla koodia.

Heijastusta voidaan käyttää myös ohjelman mukauttamiseen dynaamisesti erilaisiin tilanteisiin. Harkitse esimerkiksi ohjelmaa, joka käyttää kahta eri luokkaa Xja Ysuorittaa samanlaisia ​​toimintoja. Ilman heijastusta ohjelmakoodissa, luokkamenetelmiä Xkutsutaan Yeksplisiittisesti. Jos ohjelma on suunniteltu käyttämällä heijastussuuntautunutta ohjelmointiparadigmaa, jokin koodin osa ei sisällä eksplisiittisiä kutsuja luokkamenetelmille Xja Y; ohjelma suorittaa tämän osion kahdesti: ensin luokalle X, sitten luokalle Y.

Esimerkki, joka havainnollistaa heijastuksen etuja, on objektin serialisointi JSONiin . Ilman reflektointia olisi tarpeen määrittää eksplisiittisesti kaikkien luokkakenttien nimet ja viitata niiden arvoihin sarjoitusta varten. Mutta heijastus antaa ohjelman itse määrittää kaikki käytettävissä olevat kentät ja saada niiden tekstilliset nimet. Näin ollen sarjointi tulee saataville mille tahansa objektille ilman ylimääräisen koodin kirjoittamista.

Toteutukset

Ohjelmointikielillä kirjoitetut ohjelmat, jotka tukevat heijastusta, on varustettu lisäominaisuuksilla, joita on vaikea toteuttaa matalan tason kielillä. Luettelemme joitain niistä:

Nämä ominaisuudet voidaan toteuttaa eri tavoin. MOO - kielessä reflektio on osa päivittäistä ohjelmointikieltä. Kaikki kutsutut menetelmät saavat kontekstissa tietoa siitä, mistä niitä kutsutaan, ja viittauksia objekteihin, joihin ne kuuluvat. Suojausta ohjataan ohjelmallisesti kutsupinon avulla: callers() -komentoa kutsutaan saadakseen luettelon menetelmistä; tarkistaa, ovatko soittajat()[1] estäneet itsensä.

Käännetyt kielet luottavat ajonaikaisiin ympäristöihinsä tarjotakseen ohjelmille tietoja lähdekoodistaan. Esimerkiksi Objective-C :lle käännetty suoritettava tiedosto kirjoittaa kaikkien menetelmien nimet yhteen lohkoon, luo hakutaulukon. Käännetyillä kielillä, jotka tukevat funktioiden luomista ajonaikaisesti, kuten Common Lisp , ajon aikana tulee sisältää kääntäjä ja tulkki.

Heijastuksen toteutus kielillä, jotka eivät tue sitä, suoritetaan ohjelman muunnosjärjestelmän avulla, joka seuraa automaattisesti muutoksia lähdekoodissa.

Esimerkkejä

Esimerkki C#foo :ssa, jossa luodaan luokan ilmentymä Fooja tehdään metodikutsu Hello, joka ei käytä heijastusta ja käyttää sitä:

// Ilman heijastusta uusi Foo (). hei (); // Heijastuksella Tyyppityyppi = System . tyyppi . GetType ( "foo" ); var foo = Aktivaattori . CreateInstance ( tyyppi ); foo . Hae tyyppi (). GetMethod ( "Hei" ). Kutsu ( foo , null );

Samanlainen esimerkki ECMAScriptistä , JavaScriptistä ja ActionScriptistä :

// Ilman heijastusta uusi Foo (). hei () // Heijastuksella // olettaen, että Foo on tässä uudessa tässä [ 'Foo' ]()[ 'hello' ]() // ei oletuksia uusi ( eval ( 'Foo' ))()[ 'hello' ]()

Muistiinpanot

  1. Meta Hullbutin opas .  Matt Hurlbutt käyttäytymisheijastuksesta ja toteutuksesta
  2. Väitöskirja, "Procedural Reflection in Programming Languages", Massachusetts Institute of Technology, Department of Electrical and Computer Science, 1982
  3. Brian C. Smith. Reflektori ja semantiikka proseduuriohjelmointikielissä. Huoltoraportti MIT-LCS-TR-272, Massachusetts Institute of Technology, Cambridge, Mass., tammikuu 1982 (englanniksi) (linkki ei ole käytettävissä) . Käyttöpäivä: 15. tammikuuta 2011. Arkistoitu alkuperäisestä 13. joulukuuta 2015. 

Kirjallisuus

  • Forman, Ira R. ja Forman, Nate. Java Reflection in Action. - Manning Publications Co., 2004. - ISBN 1932394184 .
  • Forman, Ira R. ja Danforth, Scott H. Metaluokkien laittaminen töihin: Uusi ulottuvuus olio-ohjelmoinnissa. - Addison Wesley Longman Publishing Co., Inc., 1999. - ISBN 0-201-43305-2 .

Linkit