Metaprogramarea

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ă).

Generarea codului

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:

  1. un generator este un program binar separat fizic, nu neapărat scris în limba țintă.
  2. limba țintă este și limba implementării generatorului, astfel încât metaprogramul formează un singur întreg cu programul țintă.

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:

Cod auto-modificabil

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:

Vă permite să vizualizați, să creați și să modificați definițiile de tip, stiva de apeluri în timpul execuției , să accesați o variabilă printr-un nume obținut dinamic etc.

Î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] .

Vezi și

Note

  1. Jonathan Bartlett, Arta metaprogramarii, Partea 1: O introducere în metaprogramare . Preluat la 4 octombrie 2012. Arhivat din original la 24 decembrie 2013.
  2. Paul Hudak. Limbaje și instrumente modulare specifice domeniului . — IEEE Computer Society Press, Departamentul de Informatică, Universitatea Yale, 1998. Arhivat din original pe 17 octombrie 2013.
  3. Lingua::Romana::Perligata - search.cpan.org
  4. Metakides, G. și Nerode, A. (1998): Principles of logic and logic programming (traducere în limba română). Editura Tehnica, Bucuresti.

Link -uri