Metaprogrammering är processen att skriva datorprogram som i sin tur skriver andra program. Metaprogrammeringsprocessen tillåter större flexibilitet för datorprogrammerare eftersom arbete som vanligtvis utförs under körningsperioden allokeras till kompileringsperioden. Denna process frigör programmerarens tid att fokusera på andra uppgifter eftersom det minskar den tid det tar att manuellt skriva ett programs kod. Omkompilering är onödig eftersom metaprogrammering gör att program kan hantera nya situationer med större effektivitet. ”Metaspråk” är termen för datorspråket som metaprogrammet använder.
Objektspråk är datorspråket för de program som är skrivna av metaprogrammeringsprocessen. Reflexivitet är en term som ges till metaspråk, som också kan åstadkomma metaprogrammering. Metaprogrammering fungerar på olika sätt. Ett sätt är att applikationsprogrammeringsgränssnittet tillåter programmeringskoden att komma åt insidan av runtime-motorn.
Ett annat sätt som metaprogrammering fungerar är genom att låta program skriva andra program genom den dynamiska exekveringsprocessen. I det här fallet används stränguttryck i denna process. Även om samma språk kan användas i dessa två processer är det inte ovanligt att språken gynnar en process framför den andra.
Metaprogrammering fungerar också genom att kringgå språket. Det möjliggör ändring av språk genom programtransformationssystem. Denna procedur ger metaprogrammering friheten att använda språk även om språket inte använder några metaprogrammeringsegenskaper.
En källkod behövs inte för metaprogrammering. Det kan göras genom en inkrementell kompilering eller av program som kan ändras i körtid. Datorspråket Lisp är det föredragna språket för metaprogrammeringsprocessen. Detta beror på enkelheten hos denna typ av datorspråk samt dess kraft.
Metaprogrammering som använder Lisp-språket fungerar genom att tillåta utvärdering av kod under programdefinitionsperioden, i motsats till körtidsperioden. Denna process gör metaprogrammeringsspråket och värdprogrammeringsspråket samma. När detta inträffar kan dessa Lisp-rutiner återvinnas för metaprogrammeringsprocessen.
Andra språk har använt denna exakta process med integrationen av en programtolk. Denna tolk arbetar med data i programmet. Domänspecifika programmeringsspråk inom metaprogrammering är en annan form som skapar parsers och lexikalanalysatorer. Dessa tillåter användaren att använda reguljära uttryck för att definiera språket.