Preprocesator - Preprocessor

În informatică , un preprocesor (sau precompilator ) este un program care își procesează datele de intrare pentru a produce ieșire care este utilizată ca intrare într-un alt program. Se spune că ieșirea este o formă preprocesată a datelor de intrare, care este adesea utilizată de unele programe ulterioare, cum ar fi compilatoarele . Cantitatea și tipul procesării depinde de natura preprocesatorului; unii preprocesori sunt capabili doar să efectueze substituții textuale și macro expansiuni relativ simple , în timp ce altele au puterea limbajelor de programare depline .

Un exemplu obișnuit din programarea computerului este procesarea efectuată pe codul sursă înainte de următorul pas de compilare. În unele limbaje de calculator (de exemplu, C și PL / I ) există o fază de traducere cunoscută sub numele de preprocesare . Poate include, de asemenea, procesarea macro, includerea fișierelor și extensii de limbă.

Preprocesoare lexicale

Preprocesoare lexicale sunt cel mai scăzut nivel de preprocesoare , deoarece acestea necesită doar analiza lexicală , adică, acestea operează pe textul sursă, înainte de orice parsare , prin efectuarea de substituție simplă de cuvinte pot secvențe de caractere pentru alte secvențe de caractere de cuvinte pot , în funcție de utilizator-definite reguli. În mod obișnuit, acestea efectuează substituirea macro , includerea textuală a altor fișiere și compilarea sau includerea condiționată.

C preprocesor

Cel mai frecvent exemplu în acest sens este preprocesorul C , care ia linii care încep cu „#” ca directive . Deoarece nu știe nimic despre limba de bază, utilizarea sa a fost criticată și multe dintre caracteristicile sale au fost integrate direct în alte limbi. De exemplu, macro-urile înlocuite cu linii și șabloane agresive, includ importuri în timp de compilare (aceasta necesită păstrarea informațiilor de tip în codul obiect, ceea ce face imposibilă adaptarea acestei caracteristici într-o limbă); compilare condiționată se realizează în mod eficient if-then-elseși eliminarea de cod mort în unele limbi. Cu toate acestea, un punct cheie de reținut este că toate directivele preprocesorului ar trebui să înceapă pe o nouă linie.

Alți preprocesori lexicali

Alți preprocesori lexicali includ m4 de uz general , cel mai frecvent utilizat în sistemele de construcție multiplataforma, cum ar fi autoconf , și GEMA , un procesor macro sursă deschisă care funcționează pe tipare de context.

Preprocesoare sintactice

Preprocesoarele sintactice au fost introduse cu familia de limbi Lisp . Rolul lor este de a transforma arborii de sintaxă în conformitate cu o serie de reguli definite de utilizator. Pentru unele limbaje de programare, regulile sunt scrise în același limbaj ca programul (reflecție în timp de compilare). Acesta este cazul cu Lisp și OCaml . Unele alte limbi se bazează pe un limbaj complet extern pentru a defini transformările, cum ar fi preprocesorul XSLT pentru XML sau omologul său tipic CDuce .

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

Personalizarea sintaxei

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

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

Extinderea unui limbaj

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

Specializarea unei limbi

Una dintre caracteristicile neobișnuite ale familiei de limbi Lisp este posibilitatea de a utiliza macrocomenzi pentru a crea un DSL intern. De obicei, într - o mare Lisp pe bază de proiect, un modul poate fi scris într - o varietate de astfel de minilanguages , o poate , folosind un SQL dialect pe bază de Lisp , un alt scris într - un dialect specializat pentru GUIs sau destul de imprimare, etc. Common Lisp Biblioteca standard conține un exemplu al acestui nivel de abstractizare sintactică sub forma macrocomandelor LOOP, care implementează un minilingv de tip Algol pentru a descrie iterația complexă, permițând totodată utilizarea operatorilor standard Lisp.

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

Preprocesator cu scop general

Majoritatea preprocesoarelor sunt specifice unei anumite sarcini de prelucrare a datelor (de exemplu, compilarea limbajului C). Un preprocesator poate fi promovat ca având un scop general , ceea ce înseamnă că nu este destinat unui anumit limbaj de utilizare sau de programare și este destinat să fie utilizat pentru o mare varietate de sarcini de procesare a textului.

M4 este probabil cel mai cunoscut exemplu al unui astfel de preprocesor cu scop general, deși preprocesorul C este uneori folosit într-un rol care nu este specific C. Exemple:

  • folosind preprocesorul C pentru preprocesarea JavaScript .
  • folosind preprocesorul C pentru procesarea arborelui de dispozitive în nucleul Linux .
  • folosind M4 (a se vedea exemplul din articol) sau preprocesorul C ca motor de șabloane , la generarea HTML .
  • imake , o interfață make care folosește preprocesorul C, scrisă pentru X Window System, dar acum depreciată în favoarea automake-ului .
  • grompp , un preprocesor pentru fișierele de intrare de simulare pentru GROMACS (un cod open-source rapid, gratuit, pentru unele probleme în chimia calculațională ) care apelează preprocesorul de sistem C (sau alt preprocesor determinat de fișierul de intrare de simulare) pentru a analiza topologia, folosind în principal mecanismele #define și #include pentru a determina topologia eficientă la timpul de rulare grompp.

GPP este un preprocesor lexical de uz general care seamănă cu CPP. Printre altele, poate fi folosit pentru preprocesarea fișierelor de reducere.

Vezi si

Referințe

linkuri externe