Metaprogrammering er en type programmering , der er forbundet med oprettelsen af programmer , der genererer andre programmer som et resultat af deres arbejde [1] (især på det stadie, hvor deres kildekode kompileres ) eller programmer, der ændrer sig selv under kørsel ( selvmodificerende kode ) ). Den første giver dig mulighed for at få programmer med mindre tid og kræfter til kodning, end hvis programmøren skrev dem helt i hånden, den anden giver dig mulighed for at forbedre kodens egenskaber (størrelse og hastighed).
Med denne tilgang skrives programkoden ikke manuelt, men oprettes automatisk af et generatorprogram baseret på et andet program.
Denne tilgang giver mening, hvis der udvikles forskellige yderligere regler under programmering ( paradigmer på højere niveau , opfyldelse af kravene fra eksterne biblioteker, stereotype metoder til implementering af visse funktioner osv.). I dette tilfælde mister en del af koden (eller dataene) sin meningsfulde betydning og bliver kun en mekanisk implementering af reglerne. Når denne del bliver væsentlig, opstår ideen om manuelt kun at indstille indholdsdelen og tilføje resten automatisk. Dette er hvad generatoren gør.
Der er to grundlæggende forskellige typer kodegenerering:
Det mest almindelige og oplagte eksempel på det første tilfælde er GUI-byggere , hvor metaprogrammet er målrettet brugerprogrammering , hvilket giver ikke-programmerende ergonomer mulighed for direkte at deltage i udviklingen af softwareprodukter. I dette tilfælde viser metaprogrammet sig naturligvis at være meget mere komplekst, stort og tidskrævende at udvikle end den kode, det genererer, og dets udvikling er begrundet i hyppigheden af dets brug. Det skal bemærkes, at i praksis, som regel (men ikke nødvendigvis), er sådanne metaprogrammer skrevet på imperative sprog til brug i imperative sprog og leveres i en kompileret form. Ulempen ved denne metode er umuligheden af at genbruge metaprogramkoden ved udvikling af nye, mere komplekse metaprogrammer.
Andre eksempler er parser- og lexer- generatorer såsom Lex , YACC , ANTLR , bison .
Det andet tilfælde er sprogindlejring og implementeres ved tre statiske metoder ved hjælp af sprogmakroer eller ren indlejring. I dette tilfælde kan den erfaring, der er opsamlet i processen med at udvikle metaprogrammer, blive intensivt genbrugt i fremtiden til udvikling af nye metaprogrammer [2] .
Andre eksempler:
Evnen til at ændre eller tilføje til sig selv under kørsel gør programmet til en virtuel maskine . Selvom en sådan mulighed eksisterede i lang tid på niveau med maskinkoder (og blev aktivt brugt, for eksempel ved oprettelse af polymorfe vira ), er metaprogrammering normalt forbundet med overførsel af sådanne teknologier til sprog på højt niveau.
Vigtigste implementeringsmetoder:
I Prolog -sproget giver metaprogrammering dig mulighed for at automatisere udviklingen og verifikationen (kontrol af egenskaber) af Prolog-programmer. Metaprogrammer betragter Prolog-programmer som termer og giver dig mulighed for at analysere deres egenskaber og relationer, bygge programmer til at styre andre Prolog-programmer [4] .