Faze prevoditelja s primjerom: Proces i koraci kompilacije
Koje su faze dizajna prevoditelja?
kompajler djeluje u različitim fazama, svaka faza transformira izvorni program iz jedne reprezentacije u drugu. Svaka faza uzima ulaze iz svoje prethodne faze i šalje svoj izlaz sljedećoj fazi prevoditelja.
Postoji 6 faza u kompajleru. Svaka od ovih faza pomaže u pretvaranju jezika visoke razine u strojni kod. Faze prevodioca su:
- Leksička analiza
- Analiza sintakse
- Semantička analiza
- Generator srednjeg koda
- Optimizator koda
- Generator koda

Sve ove faze pretvaraju izvorni kod dijeljenjem u tokene, stvaranjem stabala analize i optimiziranjem izvornog koda u različitim fazama.
Faza 1: Leksička analiza
Leksička analiza je prva faza u kojoj prevodilac skenira izvorni kod. Ovaj proces se može odvijati slijeva nadesno, znak po znak, i grupirati te znakove u žetone.
Ovdje je tok znakova iz izvornog programa grupiran u smislene sekvence identificiranjem tokena. Upisuje odgovarajuće karte u tablicu simbola i prosljeđuje taj token u sljedeću fazu.
Primarne funkcije ove faze su:
- Identificirajte leksičke jedinice u izvornom kodu
- Klasificirajte leksičke jedinice u klase poput konstanti, rezerviranih riječi i unesite ih u različite tablice. Ignorirat će komentare u izvornom programu
- Identificirajte token koji nije dio jezika
Primjer:
x = y + 10
Žetoni
X | identifikator |
= | Operator dodjele |
Y | identifikator |
+ | Operator zbrajanja |
10 | Broj |
Faza 2: Analiza sintakse
Analiza sintakse temelji se na otkrivanju strukture koda. Određuje slijedi li tekst očekivani format ili ne. Glavni cilj ove faze je provjeriti je li izvorni kod koji je napisao programer ispravan ili ne.
Analiza sintakse temelji se na pravilima temeljenim na specifičnom programskom jeziku konstruiranjem stabla raščlanjivanja uz pomoć tokena. Također određuje strukturu izvornog jezika i gramatiku ili sintaksu jezika.
Ovdje je popis zadataka koji se izvode u ovoj fazi:
- Nabavite tokene iz leksičkog analizatora
- Provjerava je li izraz sintaktički točan ili nije
- Prijavite sve sintaktičke pogreške
- Konstruirajte hijerarhijsku strukturu koja je poznata kao stablo raščlanjivanja
Primjer
Svaki identifikator/broj je izraz
Ako je x identifikator, a y+10 izraz, tada je x= y+10 izjava.
Razmotrite raščlanjivanje stabla za sljedeći primjer
(a+b)*c
U Parse Tree
- Unutarnji čvor: zapisnik s operaterom i dvije datoteke za djecu
- List: zapisi s 2/više polja; jedan za token i druge informacije o tokenu
- Osigurajte da se komponente programa smisleno uklapaju
- Prikuplja podatke o tipu i provjerava kompatibilnost tipa
- Provjerava operande dopušta izvorni jezik
Faza 3: Semantička analiza
Semantička analiza provjerava semantičku dosljednost koda. Koristi stablo sintakse iz prethodne faze zajedno s tablicom simbola za provjeru je li dati izvorni kod semantički dosljedan. Također provjerava prenosi li kod odgovarajuće značenje.
Semantički analizator će provjeriti nepodudaranje tipa, nekompatibilne operande, funkciju pozvanu s neprikladnim argumentima, nedeklarisanu varijablu itd.
Funkcije faze semantičke analize su:
- Pomaže vam da pohranite prikupljene podatke o vrsti i spremite ih u tablicu simbola ili sintaktičko stablo
- Omogućuje provjeru tipa
- U slučaju neusklađenosti tipa, gdje ne postoje točna pravila ispravljanja tipa koja zadovoljavaju željenu operaciju, prikazuje se semantička pogreška
- Prikuplja informacije o tipu i provjerava kompatibilnost tipa
- Provjerava dopušta li izvorni jezik operande ili ne
Primjer
float x = 20.2; float y = x*30;
U gornjem kodu, semantički analizator će tipizirati cijeli broj 30 na float 30.0 prije množenja
Faza 4: Generiranje srednjeg koda
Nakon što faza semantičke analize završi, kompajler generira međukod za ciljni stroj. Predstavlja program za neki apstraktni stroj.
Međukod je između jezika visoke razine i strojne razine. Ovaj posredni kod treba biti generiran na takav način da ga je lako prevesti u ciljni strojni kod.
Funkcije za generiranje međukoda:
- Treba se generirati iz semantičke reprezentacije izvornog programa
- Sadrži vrijednosti izračunate tijekom procesa prevođenja
- Pomaže vam prevesti međukod na ciljni jezik
- Omogućuje vam održavanje redoslijeda prioriteta izvornog jezika
- Sadrži točan broj operanda instrukcije
Primjer
Na primjer,
total = count + rate * 5
Međukod uz pomoć metode adresnog koda je:
t1 := int_to_float(5) t2 := rate * t1 t3 := count + t2 total := t3
Faza 5: Optimizacija koda
Sljedeća faza je optimizacija koda ili srednji kod. Ova faza uklanja nepotrebnu liniju koda i uređuje slijed naredbi kako bi se ubrzalo izvođenje programa bez trošenja resursa. Glavni cilj ove faze je poboljšati međukod kako bi se generirao kod koji radi brže i zauzima manje prostora.
Primarne funkcije ove faze su:
- Pomaže vam da uspostavite kompromis između brzine izvođenja i kompilacije
- Poboljšava vrijeme rada ciljanog programa
- Generira pojednostavljeni kod koji je još uvijek u srednjem prikazu
- Uklanjanje nedostupnog koda i rješavanje neiskorištenih varijabli
- Uklanjanje izjava koje nisu promijenjene iz petlje
Primjer:
Razmotrite sljedeći kôd
a = intofloat(10) b = c * a d = e + b f = d
Može postati
b =c * 10.0 f = e+b
Faza 6: Generiranje koda
Generiranje koda posljednja je i završna faza kompajlera. Dobiva ulazne podatke iz faza optimizacije koda i kao rezultat proizvodi kod stranice ili objektni kod. Cilj ove faze je dodijeliti pohranu i generirati strojni kod koji se može premjestiti.
Također dodjeljuje memorijske lokacije za varijablu. Instrukcije u međukodu pretvaraju se u strojne instrukcije. Ova faza prekriva optimizirani ili međukod u ciljni jezik.
Ciljni jezik je strojni kod. Stoga su sve memorijske lokacije i registri također odabrani i dodijeljeni tijekom ove faze. Kod generiran ovom fazom izvršava se za uzimanje ulaza i generiranje očekivanih izlaza.
Primjer
a = b + 60.0
Eventualno bi se preveo u registre.
MOVF a, R1 MULF #60.0, R2 ADDF R1, R2
Upravljanje tablicom simbola
Tablica simbola sadrži zapis za svaki identifikator s poljima za atribute identifikatora. Ova komponenta olakšava kompajleru pretraživanje zapisa identifikatora i njegovo brzo dohvaćanje. Tablica simbola također vam pomaže u upravljanju opsegom. Tablica simbola i rukovatelj greškama međusobno djeluju sa svim fazama i tablica simbola se na odgovarajući način ažurira.
Rutina rukovanja pogreškama
U procesu dizajna kompilatora može doći do pogreške u svim dolje navedenim fazama:
- Leksički analizator: Pogrešno napisani tokeni
- Analizator sintakse: nedostaje zagrada
- Generator srednjeg koda: Neusklađeni operandi za operator
- Optimizator koda: Kada izjava nije dostupna
- Kodirati Generator: Kada je memorija puna ili nisu dodijeljeni odgovarajući registri
- Tablice simbola: Greška više deklariranih identifikatora
Najčešće pogreške su nevažeći niz znakova u skeniranju, nevažeći nizovi tokena u vrsti, pogreška opsega i raščlanjivanje u semantičkoj analizi.
Pogreška se može pojaviti u bilo kojoj od gore navedenih faza. Nakon pronalaženja pogrešaka, faza se treba pozabaviti pogreškama kako bi se nastavio proces kompilacije. O ovim pogreškama potrebno je izvijestiti rukovatelja pogreškama koji obrađuje pogrešku za izvođenje procesa kompilacije. Općenito, pogreške se prijavljuju u obliku poruke.
rezime
- Prevodilac radi u različitim fazama, a svaka faza transformira izvorni program iz jednog prikaza u drugi
- Šest faza dizajn prevoditelja su 1) Leksička analiza 2) Analiza sintakse 3) Semantička analiza 4) Generator srednjeg koda 5) Optimizator koda 6) Kod Generator
- Leksička analiza je prva faza u kojoj prevodilac skenira izvorni kod
- Analiza sintakse sastoji se u otkrivanju strukture teksta
- Semantička analiza provjerava semantičku dosljednost koda
- Nakon što faza semantičke analize završi kompilator, generirajte međukod za ciljni stroj
- Faza optimizacije koda uklanja nepotrebne redove koda i uređuje slijed izjava
- Faza generiranja koda dobiva ulazne podatke iz faze optimizacije koda i kao rezultat proizvodi kod stranice ili objektni kod
- Tablica simbola sadrži zapis za svaki identifikator s poljima za atribute identifikatora
- Rutina za obradu pogrešaka obrađuje pogreške i izvješćuje ih tijekom mnogih faza