Faze ale compilatorului cu exemplu

Cuprins:

Anonim

Care sunt fazele proiectării compilatorului?

Compilatorul funcționează în diferite faze, fiecare fază transformă programul sursă de la o reprezentare la alta. Fiecare fază preia intrări din etapa sa anterioară și își transmite ieșirea în faza următoare a compilatorului.

Există 6 faze într-un compilator. Fiecare din această fază ajută la convertirea limbii de nivel înalt în codul mașinii. Fazele unui compilator sunt:

  1. Analiza lexicală
  2. Analiza sintaxei
  3. Analiza semantică
  4. Generator de cod intermediar
  5. Optimizator de cod
  6. Generator de cod
Etapele compilatorului

Toate aceste faze convertesc codul sursă împărțind în jetoane, creând arbori de analiză și optimizând codul sursă prin diferite faze.

În acest tutorial, veți învăța:

  • Care sunt fazele proiectării compilatorului?
  • Faza 1: Analiza lexicală
  • Etapa 2: Analiza sintaxei
  • Etapa 3: Analiza semantică
  • Faza 4: Generarea codului intermediar
  • Faza 5: Optimizarea codului
  • Faza 6: Generarea codului
  • Managementul tabelului de simboluri
  • Rutină de gestionare a erorilor:

Faza 1: Analiza lexicală

Analiza lexicală este prima fază când compilatorul scanează codul sursă. Acest proces poate fi de la stânga la dreapta, caracter cu caracter, și grupați aceste personaje în jetoane.

Aici, fluxul de caractere din programul sursă este grupat în secvențe semnificative prin identificarea jetoanelor. Face introducerea biletelor corespunzătoare în tabelul de simboluri și trece acel jeton la faza următoare.

Funcțiile principale ale acestei faze sunt:

  • Identificați unitățile lexicale într-un cod sursă
  • Clasificați unitățile lexicale în clase precum constante, cuvinte rezervate și introduceți-le în diferite tabele. Acesta va ignora comentariile din programul sursă
  • Identificați simbolul care nu face parte din limbă

Exemplu :

x = y + 10

Jetoane

X identificator
= Operator de misiune
Da identificator
+ Operator de adăugare
10 Număr

Etapa 2: Analiza sintaxei

Analiza sintaxei se referă la descoperirea structurii în cod. Determină dacă un text urmează sau nu formatul așteptat. Scopul principal al acestei faze este de a vă asigura că codul sursă a fost scris de programator este corect sau nu.

Analiza sintaxei se bazează pe regulile bazate pe limbajul de programare specific prin construirea arborelui de analiză cu ajutorul jetoanelor. De asemenea, determină structura limbajului sursă și gramatica sau sintaxa limbii.

Iată o listă a sarcinilor efectuate în această fază:

  • Obțineți jetoane din analizorul lexical
  • Verifică dacă expresia este corectă din punct de vedere sintactic sau nu
  • Raportați toate erorile de sintaxă
  • Construiți o structură ierarhică care este cunoscută sub numele de arbore analizat

Exemplu

Orice identificator / număr este o expresie

Dacă x este un identificator și y + 10 este o expresie, atunci x = y + 10 este o afirmație.

Luați în considerare arborele de analiză pentru următorul exemplu

(a+b)*c

În Parse Tree

  • Nod interior: înregistrare cu un operator depus și două fișiere pentru copii
  • Leaf: înregistrări cu 2 / mai multe câmpuri; una pentru simbol și alte informații despre simbol
  • Asigurați-vă că componentele programului se potrivesc în mod semnificativ
  • Adună informații despre tip și verifică compatibilitatea tipului
  • Verificarea operanzilor este permisă de limba sursă

Etapa 3: Analiza semantică

Analiza semantică verifică consistența semantică a codului. Folosește arborele de sintaxă al fazei anterioare împreună cu tabelul de simboluri pentru a verifica dacă codul sursă dat este consecvent semantic. De asemenea, verifică dacă codul transmite un sens adecvat.

Semantic Analyzer va verifica dacă există nepotriviri de tip, operanzi incompatibili, o funcție numită cu argumente necorespunzătoare, o variabilă nedeclarată etc.

Funcțiile fazei de analiză semantică sunt:

  • Vă ajută să stocați informațiile de tip colectate și să le salvați în tabelul de simboluri sau în arborele de sintaxă
  • Vă permite să efectuați verificarea tipului
  • În cazul nepotrivirii tipului, unde nu există reguli exacte de corectare a tipului care să satisfacă operația dorită, este afișată o eroare semantică
  • Colectează informații despre tip și verifică compatibilitatea tipului
  • Verifică dacă limba sursă permite sau nu operanzi

Exemplu

float x = 20.2;float y = x*30;

În codul de mai sus, analizorul semantic va tipecast întregul 30 pentru a pluti 30.0 înainte de multiplicare

Faza 4: Generarea codului intermediar

Odată ce faza de analiză semantică a trecut peste compilator, generează cod intermediar pentru mașina țintă. Reprezintă un program pentru o mașină abstractă.

Codul intermediar este între limbajul de nivel înalt și cel al mașinii. Acest cod intermediar trebuie generat în așa fel încât să faciliteze traducerea acestuia în codul mașinii țintă.

Funcții pentru generarea codului intermediar:

  • Ar trebui să fie generat din reprezentarea semantică a programului sursă
  • Păstrează valorile calculate în timpul procesului de traducere
  • Vă ajută să traduceți codul intermediar în limba țintă
  • Vă permite să mențineți ordinea de prioritate a limbii sursă
  • Deține numărul corect de operanzi ai instrucțiunii

Exemplu

De exemplu,

total = count + rate * 5

Codul intermediar cu ajutorul metodei codului de adresă este:

t1 := int_to_float(5)t2 := rate * t1t3 := count + t2total := t3

Faza 5: Optimizarea codului

Următoarea fază a este optimizarea codului sau codul intermediar. Această fază elimină linia de cod inutilă și aranjează secvența de instrucțiuni pentru a accelera execuția programului fără a irosi resurse. Scopul principal al acestei faze este îmbunătățirea codului intermediar pentru a genera un cod care rulează mai rapid și ocupă mai puțin spațiu.

Funcțiile principale ale acestei faze sunt:

  • Vă ajută să stabiliți un compromis între execuție și viteza de compilare
  • Îmbunătățește timpul de funcționare al programului țintă
  • Generează cod simplificat încă în reprezentare intermediară
  • Eliminarea codului inaccesibil și eliminarea variabilelor neutilizate
  • Eliminarea instrucțiunilor care nu sunt modificate din buclă

Exemplu:

Luați în considerare următorul cod

a = intofloat(10)b = c * ad = e + bf = d

Poate deveni

b =c * 10.0f = e+b

Faza 6: Generarea codului

Generarea de cod este ultima și ultima fază a unui compilator. Obține intrări din fazele de optimizare a codului și, ca rezultat, produce codul paginii sau codul obiectului. Obiectivul acestei faze este alocarea stocării și generarea codului mașinii relocabile.

De asemenea, alocă locații de memorie pentru variabilă. Instrucțiunile din codul intermediar sunt convertite în instrucțiuni ale mașinii. Această fază acoperă codul de optimizare sau intermediar în limba țintă.

Limba țintă este codul mașinii. Prin urmare, toate locațiile și registrele de memorie sunt, de asemenea, selectate și alocate în timpul acestei faze. Codul generat de această fază este executat pentru a prelua intrări și a genera ieșiri așteptate.

Exemplu:

a = b + 60,0

Ar fi posibil tradus în registre.

MOVF a, R1MULF #60.0, R2ADDF R1, R2

Managementul tabelului de simboluri

Un tabel de simboluri conține o înregistrare pentru fiecare identificator cu câmpuri pentru atributele identificatorului. Această componentă facilitează compilatorul să caute înregistrarea identificatorului și să o recupereze rapid. Tabelul de simboluri vă ajută și pentru gestionarea domeniului. Tabelul de simboluri și gestionatorul de erori interacționează cu toate fazele și actualizarea tabelului de simboluri în mod corespunzător.

Rutină de gestionare a erorilor:

În procesul de proiectare a compilatorului, poate apărea o eroare în toate fazele de mai jos:

  • Analizator lexical: jetoane scrise greșit
  • Analizor de sintaxă: lipsă paranteză
  • Generator de cod intermediar: operanzi nepotriviti pentru un operator
  • Optimizator de cod: când instrucțiunea nu este accesibilă
  • Generator de cod: declarații inaccesibile
  • Tabelele de simboluri: Eroare a mai multor identificatori declarați

Cele mai frecvente erori sunt secvența de caractere nevalide în scanare, secvențele de jetoane nevalide în tip, eroarea de scop și analiza în analiza semantică.

Eroarea poate fi întâlnită în oricare dintre fazele de mai sus. După găsirea erorilor, faza trebuie să facă față erorilor pentru a continua procesul de compilare. Aceste erori trebuie raportate către gestionarul de erori care gestionează eroarea pentru a efectua procesul de compilare. În general, erorile sunt raportate sub formă de mesaj.

rezumat

  • Compilatorul funcționează în diferite faze, fiecare fază transformă programul sursă de la o reprezentare la alta
  • Șase faze ale proiectării compilatorului sunt 1) Analiza lexicală 2) Analiza sintaxei 3) Analiza semantică 4) Generatorul de cod intermediar 5) Optimizatorul de cod 6) Generatorul de cod
  • Analiza lexicală este prima fază când compilatorul scanează codul sursă
  • Analiza sintaxei se referă la descoperirea structurii în text
  • Analiza semantică verifică consistența semantică a codului
  • Odată ce faza de analiză semantică a trecut peste compilator, generați cod intermediar pentru mașina țintă
  • Faza de optimizare a codului elimină linia de cod inutilă și aranjează succesiunea declarațiilor
  • Faza de generare a codului primește intrări din faza de optimizare a codului și, ca rezultat, produce codul paginii sau codul obiectului
  • Un tabel de simboluri conține o înregistrare pentru fiecare identificator cu câmpuri pentru atributele identificatorului
  • Eroarea de gestionare a rutinei gestionează erorile și rapoartele pe parcursul mai multor faze