Metaprogramarea este un tip de programare asociat cu crearea de programe care generează alte programe ca urmare a muncii lor [1] (în special, în etapa de compilare a codului sursă ) sau programe care se schimbă în timpul rulării ( cod auto-modificabil). ). Primul vă permite să obțineți programe cu mai puțin timp și efort pentru codare decât dacă programatorul le-ar fi scris în întregime de mână, al doilea vă permite să îmbunătățiți proprietățile codului (dimensiune și viteză).
Cu această abordare, codul programului nu este scris manual, ci este creat automat de un program generator bazat pe un alt program.
Această abordare are sens dacă în timpul programării sunt dezvoltate diverse reguli suplimentare ( paradigme de nivel superior , îndeplinirea cerințelor bibliotecilor externe, metode stereotipe pentru implementarea anumitor funcții etc.). În acest caz, o parte a codului (sau a datelor) își pierde sensul și devine doar o implementare mecanică a regulilor. Când această parte devine semnificativă, apare ideea de a seta manual doar partea de conținut și de a adăuga restul automat. Asta face generatorul.
Există două tipuri fundamental diferite de generare de cod:
Cel mai obișnuit și evident exemplu al primului caz este GUI builders , unde metaprogramul vizează programarea utilizatorului , permițând ergonomiștilor care nu sunt programatori să participe direct la dezvoltarea produselor software. În acest caz, metaprogramul se dovedește a fi în mod evident mult mai complex, mai mare și mai consumator de timp de dezvoltat decât codul pe care îl generează, iar dezvoltarea lui este justificată de frecvența de utilizare. Trebuie remarcat faptul că , în practică, de regulă (dar nu neapărat), astfel de metaprograme sunt scrise în limbi imperative pentru a fi utilizate în limbi imperative și sunt furnizate într-o formă compilată. Dezavantajul acestei metode este imposibilitatea reutilizarii codului metaprogramului la dezvoltarea unor metaprograme noi, mai complexe.
Alte exemple sunt generatoarele de parser și lexer , cum ar fi Lex , YACC , ANTLR , bison .
Al doilea caz este încorporarea limbajului și este implementat prin trei metode statice folosind macrocomenzi de limbaj sau încorporarea pură. În acest caz, experiența acumulată în procesul de dezvoltare a metaprogramelor poate fi intens reutilizată în viitor pentru dezvoltarea de noi metaprograme [2] .
Alte exemple:
Capacitatea de a modifica sau adăuga la sine în timpul rulării transformă programul într-o mașină virtuală . Deși o astfel de posibilitate a existat de mult timp la nivelul codurilor de mașină (și a fost utilizată în mod activ, de exemplu, la crearea de viruși polimorfi ), metaprogramarea este de obicei asociată cu transferul unor astfel de tehnologii în limbaje de nivel înalt.
Principalele metode de implementare:
În limbajul Prolog , metaprogramarea vă permite să automatizați dezvoltarea și verificarea (verificarea proprietăților) programelor Prolog. Metaprogramele consideră programele Prolog ca termeni și vă permit să analizați proprietățile și relațiile lor, să construiți programe pentru a controla alte programe Prolog [4] .