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).
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:
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:
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:
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] .