Metaohjelmoinnilla tarkoitetaan erilaisia tapoja, joilla ohjelmalla on tietoa itsestään tai joilla se voi manipuloida itseään.

C#:n kaltaisissa kielissä reflektio on eräs metaohjelmoinnin muoto, koska ohjelma voi tutkia tietoa itsestään. Esimerkiksi palauttaa listan kaikista objektin ominaisuuksista.

Kielissä, kuten ActionScriptissä, voit evaluoida funktioita ajonaikana luodaksesi uusia ohjelmia, kuten eval(”x” + i). DoSomething() vaikuttaisi objektiin nimeltä x1, kun i on 1 ja x2, kun i on 2.

Viimeiseksi, toinen yleinen metaohjelmoinnin muoto on, kun ohjelma voi muuttaa itseään ei-triviaalilla tavalla. LISP on hyvin tunnettu tästä, ja Paul Graham puolusti sitä noin kymmenen vuotta sitten. Minun täytyy etsiä joitakin hänen erityisiä kirjoituksiaan. Mutta ideana on, että ohjelma muuttaisi toista ohjelman osaa sen tilan perusteella. Tämä mahdollistaa sellaisen joustavuuden tehdä päätöksiä ajonaikana, joka on hyvin vaikeaa useimmissa nykyään suosituissa kielissä.

On myös syytä huomata, että vanhoina hyvinä aikoina, jolloin ohjelmoitiin pelkällä assemblerilla, ohjelmat, jotka muuttivat itseään ajonaikana, olivat välttämättömiä ja hyvin arkipäiväisiä.

Paul Grahamin esseestä ”Mikä teki Lispistä erilaisen”:

Monissa ohjelmointikielissä on olemassa jotakin, jota kutsutaan nimellä makro. Mutta Lisp-makrot ovat ainutlaatuisia. Ja uskokaa tai älkää, mutta se mitä ne tekevät, liittyy sulkeisiin. Lispin suunnittelijat eivät laittaneet kaikkia näitä sulkuja kieleen vain ollakseen erilainen. Blub-ohjelmoijalle Lisp-koodi näyttää oudolta. Mutta nuo sulkeet ovat siellä syystä. Ne ovat ulkoinen todiste perustavanlaatuisesta erosta Lispin ja muiden kielten välillä.

Lisp-koodi on tehty Lisp-tieto-objekteista. Eikä siinä triviaalissa mielessä, että lähdetiedostot sisältävät merkkejä, ja merkkijonot ovat yksi kielen tukemista tietotyypeistä. Lisp-koodi, sen jälkeen kun jäsentäjä on lukenut sen, on tehty tietorakenteista, joita voi läpikäydä.

Jos ymmärrät, miten kääntäjät toimivat, kyse ei oikeastaan ole niinkään siitä, että Lispillä on outo syntaksi, vaan siitä, että Lispillä ei ole syntaksia. Kirjoitat ohjelmia jäsennyspuihin, jotka syntyvät kääntäjän sisällä, kun muita kieliä jäsennetään. Mutta nämä jäsennyspuut ovat täysin ohjelmiesi käytettävissä. Voit kirjoittaa ohjelmia, jotka käsittelevät niitä. Lispissä näitä ohjelmia kutsutaan makroiksi. Ne ovat ohjelmia, jotka kirjoittavat ohjelmia.

Ohjelmia, jotka kirjoittavat ohjelmia? Milloin haluaisit koskaan tehdä sellaista? Ei kovin usein, jos ajatellaan Cobolilla. Koko ajan, jos ajattelet Lispissä. Tässä olisi kätevää, jos voisin antaa esimerkin tehokkaasta makrosta ja sanoa, että tuossa! miten on? Mutta jos tekisin niin, se näyttäisi vain siansaksaa sellaiselle, joka ei tunne Lispiä; tässä ei ole tilaa selittää kaikkea, mitä pitäisi tietää ymmärtääkseen, mitä se tarkoittaa. Ansi Common Lispissä yritin edetä niin nopeasti kuin pystyin, ja siitä huolimatta pääsin makroihin vasta sivulla 160.

Mutta luulen, että voin esittää eräänlaisen argumentin, joka voisi olla vakuuttava. Viaweb-editorin lähdekoodista oli luultavasti noin 20-25% makroja. Makrot ovat vaikeampia kirjoittaa kuin tavalliset Lisp-funktiot, ja niiden käyttämistä pidetään huonona tyylinä silloin kun niitä ei tarvita. Jokainen makro tuossa koodissa on siis olemassa, koska sen on pakko olla. Tämä tarkoittaa sitä, että ainakin 20-25 prosenttia tämän ohjelman koodista tekee asioita, joita ei voi helposti tehdä millään muulla kielellä. Vaikka Blubin ohjelmoija suhtautuisi kuinka epäilevästi väitteisiini Lispin salaperäisistä voimista, tämän pitäisi tehdä hänet uteliaaksi. Emme kirjoittaneet tätä koodia omaksi huviksemme. Olimme pieni startup-yritys, joka ohjelmoi niin kovaa kuin pystyi asettaakseen teknisiä esteitä itsemme ja kilpailijoidemme välille.

Epäluuloinen henkilö saattaisi alkaa miettiä, oliko tässä jotain korrelaatiota. Suuri osa koodistamme teki asioita, joita on hyvin vaikea tehdä muilla kielillä. Tuloksena syntynyt ohjelmisto teki asioita, joita kilpailijoidemme ohjelmistot eivät pystyneet tekemään. Ehkä siinä oli jonkinlainen yhteys. Kannustan sinua seuraamaan tuota ketjua. Tuossa kainalosauvoillaan hoipertelevassa vanhassa miehessä saattaa olla muutakin kuin miltä näyttää.

Vastaa

Sähköpostiosoitettasi ei julkaista.