Što je dizajn prevoditelja? Vrste, alati za gradnju, primjer
⚡ Pametni sažetak
Faze kompajlera opisuju šest faza koje transformiraju izvorni kod u strojni kod: leksička analiza, sintaktička analiza, semantička analiza, generiranje međukoda, optimizacija koda i generiranje koda, uz podršku upravljanja tablicom simbola i rukovanja pogreškama.
Koje su faze dizajna prevoditelja?
A kompajler radi u različitim fazama, a svaka faza transformira izvorni program iz jedne reprezentacije u drugu. Svaka faza uzima ulaze iz prethodne faze i šalje svoj izlaz sljedećoj fazi kompajlera. U kompajleru postoji 6 faza. Svaka od ovih faza pomaže u pretvaranju jezika visoke razine u strojni kod. Faze kompajlera su:
- Leksička analiza
- Analiza sintakse
- Semantička analiza
- Generator srednjeg koda
- Code optimizaciju
- Code generator
Faze kompajlera
Sve ove faze pretvaraju izvorni kod dijeljenjem na tokene, stvaranjem stabala parsiranja i optimiziranjem izvornog koda kroz različite faze.
Faza 1: Leksička analiza
Leksička analiza je prva faza u kojoj kompajler skenira izvorni kod. Ovaj proces može se odvijati slijeva nadesno, znak po znak, i grupira te znakove u tokene.
Ovdje se niz znakova iz izvornog programa grupira u smislene nizove identificiranjem tokena. Vrši unos odgovarajućih tokena u tablicu simbola i prosljeđuje taj token sljedećoj fazi.
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. Ignoriraće komentare u izvornom programu.
- Odredite token koji nije dio jezika.
Primjer: x = y + 10
| Žeton | Tip |
|---|---|
| X | identifikator |
| = | Operator dodjele |
| Y | identifikator |
| + | Operator zbrajanja |
| 10 | Broj |
Faza 2: Analiza sintakse
Sintaktička analiza se odnosi na otkrivanje strukture u kodu. Utvrđuje slijedi li tekst očekivani format. Glavni cilj ove faze je osigurati da je izvorni kod koji je napisao programer ispravan ili ne.
Sintaktička analiza temelji se na pravilima specifičnog programskog jezika konstruiranjem stabla parsiranja uz pomoć tokena. Također određuje strukturu izvornog jezika i gramatiku ili sintaksu jezika.
Evo popisa zadataka koji se obavljaju u ovoj fazi:
- Dobijte tokene iz leksičkog analizatora.
- Provjerite je li izraz sintaktički ispravan ili ne.
- Prijavi sve sintaktičke pogreške.
- Konstruirajte hijerarhijsku strukturu koja se naziva stablo parsiranja.
Primjer
Bilo koji identifikator/broj je izraz. Ako je x identifikator, a y+10 izraz, tada je x = y+10 naredba. Razmotrimo stablo parsiranja za sljedeći primjer:
(a+b)*c
U stablu parsiranja:
- Unutarnji čvor: zapis s poljem operatora i dva polja za djecu.
- List: zapisi s 2 ili više polja; jedno za token i ostale informacije o tokenu.
- Osigurajte da se komponente programa smisleno uklapaju.
- Prikuplja informacije o tipu i provjerava kompatibilnost tipova.
- Izvorni jezik dopušta provjere operanda.
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 neusklađenosti tipova, nekompatibilne operande, funkciju pozvanu s neispravnim argumentima, nedeklariranu varijablu itd.
Funkcije faze semantičke analize su:
- Pomaže vam pohraniti prikupljene informacije o tipu i spremiti ih u tablicu simbola ili sintaksno stablo.
- Omogućuje vam provjeru tipa.
- U slučaju neusklađenosti tipova, gdje ne postoje točna pravila za korekciju tipova koja zadovoljavaju željenu operaciju, prikazuje se semantička pogreška.
- Prikuplja informacije o tipu i provjerava kompatibilnost tipova.
- 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 pretvoriti cijeli broj 30 u float 30.0 prije množenja.
Faza 4: Srednja Code Generacija
Nakon što je faza semantičke analize završena, kompajler generira međukod za ciljni stroj. On predstavlja program za neke abstracstroj.
Međukod se nalazi između programskog jezika visoke razine i strojnog jezika. Ovaj međukod treba generirati na način koji ga čini lakim za prevođenje u ciljni strojni kod.
Funkcije međuprodukta Code generacija:
- Trebao bi se generirati iz semantičke reprezentacije izvornog programa.
- Sadrži vrijednosti izračunate tijekom procesa prevođenja.
- Pomaže vam prevesti međukod u ciljni jezik.
- Omogućuje vam održavanje redoslijeda prioriteta izvornog jezika.
- Sadrži ispravan broj operanada 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: Code Optimizacija
Sljedeća faza je optimizacija međukoda. Ova faza uklanja nepotrebne linije koda i uređuje slijed naredbi kako bi se ubrzalo izvršavanje programa bez rasipanja resursa. Glavni cilj ove faze je poboljšanje međukoda kako bi se generirao kod koji se brže izvršava i zauzima manje prostora.
Primarne funkcije ove faze su:
- Pomaže vam u uspostavljanju kompromisa između brzine izvršavanja i brzine kompajliranja.
- Poboljšava vrijeme izvođenja ciljnog programa.
- Generira pojednostavljeni kod koji je još uvijek u međureprezentaciji.
- Uklanjanje nedostupnog koda i uklanjanje nekorištenih varijabli.
- Uklanjanje naredbi iz petlje koje se ne mijenjaju.
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: Code Generacija
Code Generiranje je posljednja i završna faza kompajlera. Dobiva ulazne podatke iz faze optimizacije koda i kao rezultat proizvodi kod stranice ili objektni kod. Cilj ove faze je dodijeliti prostor za pohranu i generirati premjestivi strojni kod.
Također dodjeljuje memorijske lokacije za varijable. Instrukcije u međukodu pretvaraju se u strojne instrukcije. Ova faza pretvara optimizirani ili međukod u ciljni jezik.
Ciljni jezik je strojni kod. Stoga se tijekom ove faze odabiru i dodjeljuju sve memorijske lokacije i registri. Kod generiran u ovoj fazi izvršava se kako bi se primili ulazni podaci i generirali očekivani izlazni podaci.
Primjer
a = b + 60.0 bi se moguće prevelo u registre kao:
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, a tablica simbola se ažurira u skladu s tim.
Rutina rukovanja pogreškama
U procesu dizajna kompajlera, greške se mogu pojaviti u svim dolje navedenim fazama:
- Leksički analizator: Pogrešno napisani žetoni.
- Analizator sintakse: Nedostaje zagrada.
- Generator međukoda: Neusklađeni operandi za operator.
- Code Optimizator: Kada izjava nije dostupna.
- Code Generator: Kada je memorija puna ili nisu dodijeljeni odgovarajući registri.
- Tablice simbola: Pogreška više deklariranih identifikatora.
Najčešće pogreške su nevažeći nizovi znakova pri skeniranju, nevažeći nizovi tokena u tipu, pogreška opsega i parsiranje u semantičkoj analizi.
Greška se može pojaviti u bilo kojoj od gore navedenih faza. Nakon pronalaska grešaka, faza se mora pozabaviti greškama kako bi se nastavio proces kompajliranja. Ove greške treba prijaviti obrađivaču grešaka, koji obrađuje grešku kako bi izvršio proces kompajliranja. Općenito, greške se prijavljuju u obliku poruke.



