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.

  • ๐Ÿ”ค Leksiฤka analiza: Prva faza skenira izvorni kod i grupira znakove u tokene, popunjavajuฤ‡i tablicu simbola.
  • ???? Analiza sintakse: Tokeni se provjeravaju prema gramatiฤkim pravilima i slaลพu u stablo parsiranja.
  • โœ… Semantiฤka analiza: Kompajler provjerava kompatibilnost i znaฤenje tipova koristeฤ‡i sintaksno stablo i tablicu simbola.
  • ๐Ÿ” Srednji Code: Za jednostavno prevoฤ‘enje generira se prikaz neovisan o stroju, kao ลกto je kod s tri adrese.
  • โšก Optimizacija: Suviลกan i nedostupan kod se uklanja kako bi program bio brลพi i manji.
  • ๐Ÿ–ฅ๏ธ Code Generacija: Zavrลกna faza pretvara optimizirani kod u ciljni strojni kod, alocirajuฤ‡i registre i memoriju.

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:

  1. Leksiฤka analiza
  2. Analiza sintakse
  3. Semantiฤka analiza
  4. Generator srednjeg koda
  5. Code optimizaciju
  6. Code generator
Faze kompajlera
Faze kompajlera

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

Primjer analize sintakse

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.

Pitanja i odgovori

Faza analize (front-end) rastavlja izvorni kod putem leksiฤke, sintaktiฤke i semantiฤke analize. Faza sinteze (back-end) gradi ciljni program putem meฤ‘ugeneriranja koda, optimizacije i generiranja koda.

Kompajler prevodi cijeli izvorni program u strojni kod prije pokretanja. Interpreter prevodi i izvrลกava kod redak po redak, ลกto je lakลกe za otklanjanje pogreลกaka, ali obiฤno sporije za vrijeme izvoฤ‘enja.

Troadresni kod je meฤ‘ureprezentacija gdje svaka instrukcija ima najviลกe tri operanda, kao ลกto je t1 = a + b. Jednostavno ga je optimizirati i lako prevesti u ciljni strojni kod.

Umjetna inteligencija i strojno uฤenje pomaลพu modernim kompajlerima u donoลกenju pametnijih optimizacijskih odluka, kao ลกto su odabir transformacija petlji, umetanje i alokacija registara. Oni predviฤ‘aju koje optimizacije poboljลกavaju performanse za odreฤ‘eni program i cilj.

Da. Umjetna inteligencija moลพe objasniti svaku fazu primjerima, trackako se primjer naredbe prelazi iz tokena u strojni kod i odgovoriti na dodatna pitanja. To studentima olakลกava uฤenje dizajna kompajlera.

Saลพmite ovu objavu uz: