Faze kompajlera s primjerom, postupkom i koracima
โก Pametni saลพetak
Faze kompajlera opisuju kako kompajler transformira izvorni kod u strojni kod kroz ลกest faza: 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?
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
- Code optimizaciju
- Code generator

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: Srednja Code Generacija
Nakon ลกto je faza semantiฤke analize zavrลกena, kompajler generira meฤukod za ciljno raฤunalo. On predstavlja program za neke abs...tracstroj.
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 na srednjem nivou Code generacija:
- 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: Code Optimizacija
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: Code Generacija
Code Generiranje je posljednja 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 prostor za pohranu i generirati premjestivi strojni kod.
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
- Code Optimizator: Kada naredba nije dostupna
- Code 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.

