Preprocesoarele sintactice au fost introduse odată cu familia de limbaje Lisp. Rolul lor este de a transforma arborii sintactici în conformitate cu un număr de reguli definite de utilizator. Pentru unele limbaje de programare, regulile sunt scrise în același limbaj ca și programul (reflectare la compilare). Acesta este cazul lui Lisp și OCaml. Unele alte limbaje se bazează pe un limbaj complet extern pentru a defini transformările, cum ar fi preprocesorul XSLT pentru XML sau omologul său static tipizat CDuce.

Preprocesoarele sintactice sunt utilizate de obicei pentru a personaliza sintaxa unui limbaj, pentru a extinde un limbaj prin adăugarea de noi primitive sau pentru a încorpora un limbaj de programare specific domeniului (DSL) în interiorul unui limbaj de uz general.

Personalizarea sintaxeiEdit

Un bun exemplu de personalizare a sintaxei este existența a două sintaxe diferite în limbajul de programare Objective Caml. Programele pot fi scrise indiferent folosind „sintaxa normală” sau „sintaxa revizuită” și pot fi tipărite la cerere cu oricare dintre cele două sintaxe.

În mod similar, o serie de programe scrise în OCaml personalizează sintaxa limbajului prin adăugarea de noi operatori.

Extinderea unui limbajEdit

Cele mai bune exemple de extindere a limbajului prin macro-uri se găsesc în familia de limbaje Lisp. În timp ce limbajele, prin ele însele, sunt simple nuclee funcționale tipizate dinamic, distribuțiile standard de Scheme sau Common Lisp permit programarea imperativă sau orientată pe obiecte, precum și tipizarea statică. Aproape toate aceste caracteristici sunt implementate prin preprocesare sintactică, deși trebuie remarcat faptul că faza de „expansiune a macrocomenzilor” a compilării este gestionată de compilator în Lisp. Aceasta poate fi considerată în continuare o formă de preprocesare, deoarece are loc înaintea altor faze de compilare.

Specializarea unui limbajEdit

Una dintre caracteristicile neobișnuite ale familiei de limbaje Lisp este posibilitatea de a folosi macrocomenzi pentru a crea un DSL intern. De obicei, într-un proiect mare bazat pe Lisp, un modul poate fi scris într-o varietate de astfel de minilimbaje, unul poate folosind un dialect de Lisp bazat pe SQL, altul scris într-un dialect specializat pentru interfețe grafice sau pentru pretty-printing, etc. Biblioteca standard a Common Lisp conține un exemplu al acestui nivel de abstractizare sintactică sub forma macroului LOOP, care implementează un minilimbaj de tip Algol pentru a descrie iterația complexă, permițând în același timp utilizarea operatorilor Lisp standard.

Preprocesorul/limbajul MetaOCaml oferă caracteristici similare pentru DSL-uri externe. Acest preprocesor preia descrierea semanticii unui limbaj (adică un interpretor) și, prin combinarea interpretării la compilare și a generării de cod, transformă această definiție într-un compilator pentru limbajul de programare OCaml – și din acest limbaj, fie în bytecode, fie în cod nativ.

.

admin

Lasă un răspuns

Adresa ta de email nu va fi publicată.

lg