Metaprogrammering

Metaprogrammering  är en typ av programmering som är associerad med skapandet av program som genererar andra program som ett resultat av deras arbete [ 1] (särskilt vid kompileringen av källkoden ) eller program som ändrar sig själva under körning ( självmodifierande kod ). Den första låter dig få program med mindre tid och ansträngning för kodning än om programmeraren skrev dem helt för hand, den andra låter dig förbättra kodens egenskaper (storlek och hastighet).

Kodgenerering

Med detta tillvägagångssätt skrivs inte programkoden manuellt, utan skapas automatiskt av ett generatorprogram baserat på ett annat program.

Detta tillvägagångssätt är vettigt om olika ytterligare regler utvecklas under programmering ( paradigm på högre nivå , uppfylla kraven från externa bibliotek, stereotypa metoder för att implementera vissa funktioner, etc.). I det här fallet förlorar en del av koden (eller data) sin meningsfulla betydelse och blir endast en mekanisk implementering av reglerna. När denna del blir betydande uppstår idén att manuellt ställa in endast innehållsdelen och lägga till resten automatiskt. Detta är vad generatorn gör.

Det finns två fundamentalt olika typer av kodgenerering:

  1. en generator är ett fysiskt separat binärt program, inte nödvändigtvis skrivet på målspråket.
  2. målspråket är också språket för generatorns implementering, så att metaprogrammet bildar en enda helhet med målprogrammet.

Det vanligaste och uppenbara exemplet på det första fallet är GUI-byggare , där metaprogrammet är inriktat på användarprogrammering , vilket tillåter icke-programmerande ergonomer att direkt delta i utvecklingen av mjukvaruprodukter. I det här fallet visar sig metaprogrammet uppenbarligen vara mycket mer komplext, stort och tidskrävande att utveckla än koden det genererar, och dess utveckling motiveras av hur ofta det används. Det bör noteras att i praktiken, som regel (men inte nödvändigtvis), är sådana metaprogram skrivna på imperativa språk för användning i imperativa språk och tillhandahålls i en kompilerad form. Nackdelen med denna metod är omöjligheten att återanvända metaprogramkoden när man utvecklar nya, mer komplexa metaprogram.

Andra exempel är parser- och lexergeneratorer som Lex , YACC , ANTLR , bison .

Det andra fallet är språkinbäddning och implementeras med tre statiska metoder med hjälp av språkmakron eller ren inbäddning. I det här fallet kan erfarenheten som samlats i processen att utveckla metaprogram intensivt återanvändas i framtiden för utveckling av nya metaprogram [2] .

Andra exempel:

Självmodifierande kod

Möjligheten att ändra eller lägga till sig själv under körning gör programmet till en virtuell maskin . Även om en sådan möjlighet existerade under lång tid på nivån för maskinkoder (och användes aktivt, till exempel när man skapade polymorfa virus ), är metaprogrammering vanligtvis förknippad med överföringen av sådan teknik till högnivåspråk.

Huvudsakliga implementeringsmetoder:

Låter dig visa, skapa och ändra typdefinitioner, anropsstacken vid körning , komma åt en variabel med ett namn som erhålls dynamiskt, etc.

I Prolog- språket låter metaprogrammering dig automatisera utvecklingen och verifieringen (kontrollera egenskaper) av Prolog-program. Metaprogram betraktar Prolog-program som termer och låter dig analysera deras egenskaper och relationer, bygga program för att styra andra Prolog-program [4] .

Se även

Anteckningar

  1. Jonathan Bartlett, Konsten att metaprogrammering, del 1: En introduktion till metaprogrammering . Hämtad 4 oktober 2012. Arkiverad från originalet 24 december 2013.
  2. Paul Hudak. Modulära domänspecifika språk och verktyg . — IEEE Computer Society Press, Department of Computer Science, Yale University, 1998. Arkiverad från originalet den 17 oktober 2013.
  3. Lingua::Romana::Perligata - search.cpan.org
  4. Metakides, G. och Nerode, A. (1998): Principer för logik och logikprogrammering (översättning på rumänska). Technical Publishing House, Bukarest.

Länkar