Prezentarea principalelor componente
ale unui compilator
Definitii
Un translator este
un program care primeste la intrare un text scris intr-un limbaj de programare
- limbaj sursa- si produce la iesire
un text echivalent scris in alt limbaj de programare - limbaj
obiect.
Daca limbajul sursa este un limbaj de nivel inalt, iar
limbajul obiect este un limbaj de nivel inferior (limbaj de asamblare sau
cod masina ), atunci translatorul respectiv se numeste compilator.
Structura unui compilator
Procesul de compilare a unui program are loc in mai multe
faze.
O faza este o operatie unitara in cadrul careia are loc transformarea programului
sursa dintr-o reprezentare in alta.
Principalele faze ale unei compilari sunt cele din figura
de mai jos:
Analiza lexicala: textul sursa este preluat sub forma unei secvente de caractere care sunt grupate apoi in entitati numite atomi; atomilor li se atribuie coduri lexicale, astfel ca , la iesirea acestei faze, programul sursa apare ca o secventa de asemenea coduri. Exemple de atomi: cuvinte cheie, identificatori, constante numerice, semne de punctuatie etc.Analiza sintactica: are ca scop gruparea atomilor rezultati in urma analizei lexicale in structuri sintactice. O structura sintactica poate fi vazuta ca un arbore ale carui noduri terminale reprezinta atomi, īn timp ce nodurile interioare reprezinta siruri de atomi care formeaza o entitate logica . Exemple de structuri sintactice: expresii, instructiuni, declaratii etc.
Pe durata analizei sintactice, de obicei are loc si o analiza semantica, ceea ce inseamna efectuarea unor verificari legate de:
- compatibilitatea tipurilor datelor cu operatiile in care ele sunt implicate
- respectarea regulilor de vizibilitate impuse de limbajul sursa.
Generarea de cod intermediar: in aceasta faza are loc transformarea arborelui sintactic intr-o secventa de instructiuni simple, similare macroinstructiunilor unui limbaj de asamblare. Diferenta dintre codul intermediar si un limbaj de asamblare este in principal aceea ca, in codul intermediar nu se specifica registrele utilizate in operatii. Exemple de reprezentari pentru codul intermediar: notatia postfix, instructiunile cu trei adrese etc. Codul intermediar prezinta avantajul de a fi mai usor de optimizat decat codul masina .
Optimizarea de cod: este o faza optionala , al carei rol este modificarea unor portiuni din codul intermediar generat, astfel incat programul rezultat sa satisfaca anumite criterii de performanta vizand timpul de executie si/sau spatiul de memorie ocupat.
Generarea codului final: presupune transformarea instructiunilor codului intermediar (eventual optimizat) īn instructiuni masina (sau de asamblare) pentru calculatorul tinta (cel pe care se va executa programul compilat).In afara de actiunile enumerate mai sus, procesul de compilare mai include urmatoarele:
Gestionarea tabelei de simboluri: tabela de simboluri (TS) este o structura de date destinata pastrarii de informatii despre simbolurile (numele) care apar in programul sursa; compilatorul face referire la aceasta tabela aproape in toate fazele compilarii.Tratarea erorilor: un compilator trebuie sa fie capabil sa recunoasca anumite categorii de erori care pot sa apara in programul sursa; tratarea unei erori presupune detectarea ei, emiterea unui mesaj corespunzator si revenirea din eroare, adica, pe cat posibil, continuarea procesului de compilare pana la epuizarea textului sursa, astfel incat numarul de compilari necesare eliminarii tuturor erorilor dintr-un program sa fie cat mai mic. Practic, exista erori specifice fiecarei faze de compilare.
Derularea procesului de compilare
Fazele unui proces de compilare se pot īnlantui, īn principiu,
īn doua moduri:
Facilitati de proiectare a compilatoarelor
In sprijinul proiectantilor de compilatoare au fost create
instrumente software precum generatoarele de analizoare lexicale si sintactice,
generatoarele de compilatoare sau sistemele de scriere a translatoarelor.
Aceste instrumente sunt programe care produc compilatoare sau parti din
compilatoare, primind la intrare o specificare a limbajului sursa precum
si a calculatorului tinta.
In cadrul laboratorului vor fi proiectate si utilizate generatoare de analizoare lexicale si sintactice.