Mis on kompilaatori disain? Tüübid, Ehitustööriistad, Näide

⚡ Nutikas kokkuvõte

Kompilaatori faasid kirjeldavad kuut etappi, mis teisendavad lähtekoodi masinkoodiks: leksikaalne analüüs, süntaksianalüüs, semantiline analüüs, vahekoodi genereerimine, koodi optimeerimine ja koodi genereerimine, mida toetavad sümbolitabelite haldus ja veakäsitlus.

  • 🔤 Leksikaalne analüüs: Skänner grupeerib märgid tokenitena ja salvestab need sümbolitabelisse.
  • 🌳 Süntaksi analüüs: Parser kontrollib grammatikat ja loob tokenite põhjal hierarhilise parsimispuu.
  • ✔iteks Semantiline analüüs: See etapp kontrollib tüüpide ühilduvust ja tähendust süntaksipuu abil.
  • ⚙️ Code Põlvkond: Vahekood genereeritakse, optimeeritakse ja lõpuks tõlgitakse sihtmasina koodiks.
  • ???? Tugirutiinid: Sümbolitabel ja veakäsitlusrutiin suhtlevad iga kompileerimisetapiga.

Kompilaatori etapid näitega: kompileerimisprotsess ja sammud

Millised on kompilaatori kujundamise etapid?

A Kompilaator toimib erinevates faasides ja iga faas teisendab lähtekoodiprogrammi ühelt esituselt teisele. Iga faas võtab sisendid oma eelmiselt etapilt ja edastab oma väljundi kompilaatori järgmisele faasile. Kompilaatoris on 6 faasi. Igaüks neist faasidest aitab teisendada kõrgetasemelist keelt masinkoodiks. Kompilaatori faasid on:

  1. Leksikaalne analüüs
  2. Süntaksi analüüs
  3. Semantiline analüüs
  4. Vahepealne koodigeneraator
  5. Code optimeerija
  6. Code generaator

Kompilaatori faasid

Kompilaatori faasid

Kõik need etapid teisendavad lähtekoodi, jagades selle tokeniteks, luues parsimispuid ja optimeerides lähtekoodi erinevate etappide kaudu.

1. faas: leksikaalne analüüs

Leksikaalne analüüs on esimene etapp, mille käigus kompilaator skaneerib lähtekoodi. See protsess võib toimuda vasakult paremale, märk tähemärgi haaval, ja grupeerib need märgid tokeniteks.

Siin rühmitatakse lähtekoodiprogrammi märgivoog tähendusrikastesse järjestustesse, tuvastades märgid. See teeb vastavate märgide sisestamise sümbolitabelisse ja edastab selle märgi järgmisse faasi.

Selle etapi peamised funktsioonid on:

  • Tuvastage lähtekoodi leksikaalsed üksused.
  • Liigita leksikaalsed üksused klassidesse nagu konstandid ja reserveeritud sõnad ning sisesta need erinevatesse tabelitesse. See ignoreerib lähtekoodiprogrammi kommentaare.
  • Tuvastage märk, mis ei ole keele osa.

Näide: x = y + 10

Sümboolne KASUTUSALA
X tunnus
= Ülesandeoperaator
Y tunnus
+ Lisaoperaator
10 Number

2. faas: süntaksi analüüs

Süntaksianalüüs seisneb koodi struktuuri leidmises. See määrab, kas tekst järgib oodatud vormingut. Selle etapi peamine eesmärk on veenduda, et programmeerija kirjutatud lähtekood on õige või mitte.

Süntaksianalüüs põhineb konkreetse programmeerimiskeele reeglitel, luues parsimispuu tokenite abil. See määrab ka lähtekeele struktuuri ja keele grammatika või süntaksi.

Siin on selles etapis tehtavate ülesannete loend:

  • Hankige leksikaalanalüsaatorilt tokenid.
  • Kontrolli, kas avaldis on süntaktiliselt korrektne või mitte.
  • Teata kõikidest süntaksivigadest.
  • Loo hierarhiline struktuur, mida tuntakse parsimispuu nime all.

Näide

Iga identifikaator/number on avaldis. Kui x on identifikaator ja y+10 on avaldis, siis x = y+10 on lause. Vaatleme järgmise näite jaoks parsimispuud:

(a+b)*c

Süntaksianalüüsi näide

Parsimise puus:

  • Sisesõlm: kirje operaatorivälja ja kahe lasteväljaga.
  • Leht: kirjed, millel on vähemalt kaks välja; üks tokeni ja muu tokeni kohta käiva teabe jaoks.
  • Veenduge, et programmi komponendid sobivad omavahel mõtestatult.
  • Kogub tüübiteavet ja kontrollib tüüpide ühilduvust.
  • Kontrollib, kas lähtekeel lubab operande.

3. faas: semantiline analüüs

Semantiline analüüs kontrollib koodi semantilist järjepidevust. See kasutab eelmise faasi süntaksipuud koos sümbolitabeliga, et kontrollida, kas antud lähtekood on semantiliselt järjepidev. Samuti kontrollib see, kas kood annab sobiva tähenduse.

Semantiline analüsaator kontrollib tüübi mittevastavusi, ühildumatuid operande, sobimatute argumentidega kutsutud funktsioone, deklareerimata muutujaid jne.

Semantilise analüüsi etapi funktsioonid on järgmised:

  • Aitab teil kogutud tüübiteavet talletada ja sümbolitabelisse või süntaksipuusse salvestada.
  • Võimaldab teil tüübikontrolli teostada.
  • Tüübi mittevastavuse korral, kus puuduvad täpsed tüübiparandusreeglid, mis soovitud toimingut rahuldaksid, kuvatakse semantiline viga.
  • Kogub tüübiteavet ja kontrollib tüüpide ühilduvust.
  • Kontrollib, kas lähtekeel lubab operande või mitte.

Näide

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

Ülaltoodud koodis teisendab semantiline analüsaator täisarvu 30 enne korrutamist ujukomaarvuks 30.0.

4. etapp: kesktase Code Põlvkond

Kui semantilise analüüsi etapp on lõppenud, genereerib kompilaator sihtmasina jaoks vahekoodi. See esindab programmi mingisuguse absoluutse väärtuse jaoks.tract-masin.

Vahekood asub kõrgetasemelise ja masinkoodi vahel. See vahekood tuleb genereerida nii, et seda oleks lihtne sihtmasinakoodi tõlkida.

Vahepealse funktsioonid Code põlvkond:

  • See tuleks genereerida lähtekoodiprogrammi semantilisest esitusest.
  • Hoiab teisendamise käigus arvutatud väärtusi.
  • Aitab teil tõlkida vahekoodi sihtkeelde.
  • Võimaldab säilitada lähtekeele eelistusjärjestuse.
  • See sisaldab käsu õiget arvu operande.

Näide

Näiteks:

total = count + rate * 5

Aadressikoodi meetodi abil loodud vahekood on:

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

5 etapp: Code Optimeerimine

Järgmine etapp on vahekoodi optimeerimine. See etapp eemaldab ebavajalikud koodiread ja korraldab lausete järjestust, et kiirendada programmi täitmist ressursse raiskamata. Selle etapi peamine eesmärk on vahekoodi täiustamine, et genereerida kood, mis töötab kiiremini ja võtab vähem ruumi.

Selle etapi peamised funktsioonid on:

  • See aitab teil leida kompromissi täitmise ja kompileerimise kiiruse vahel.
  • Parandab sihtprogrammi tööaega.
  • Genereerib sujuvama koodi, mis on endiselt vahepealses esituses.
  • Kättesaamatu koodi eemaldamine ja kasutamata muutujatest vabanemine.
  • Muutmata lausete eemaldamine tsüklist.

Näide: Mõelge järgmisele koodile:

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

Võib muutuda:

b = c * 10.0
f = e + b

6 etapp: Code Põlvkond

Code Genereerimine on kompilaatori viimane ja lõplik etapp. See saab sisendid koodi optimeerimise etapist ja loob selle tulemusena lehekülje koodi või objektikoodi. Selle etapi eesmärk on eraldada salvestusruumi ja genereerida ümberpaigutavat masinkoodi.

Samuti eraldab see muutujatele mälukohad. Vahekoodis olevad juhised teisendatakse masinjuhisteks. See etapp teisendab optimeeritud ehk vahekoodi sihtkeelde.

Sihtkeel on masinkood. Seetõttu valitakse ja eraldatakse selles etapis ka kõik mälupesad ja registrid. Selle etapi genereeritud kood käivitatakse sisendite vastuvõtmiseks ja oodatavate väljundite genereerimiseks.

Näide

a = b + 60.0 teisendataks registritesse järgmiselt:

MOVF a, R1
MULF #60.0, R2
ADDF R1, R2

Sümbolitabelite haldamine

Sümbolitabel sisaldab iga identifikaatori kohta kirjet koos identifikaatori atribuutide väljadega. See komponent lihtsustab kompilaatoril identifikaatori kirje otsimist ja kiiret kättesaamist. Sümbolitabel aitab ka ulatuse haldamisel. Sümbolitabel ja veakäitleja suhtlevad kõigi faasidega ning sümbolitabelit uuendatakse vastavalt.

Vigade käsitlemise rutiin

Kompilaatori disainiprotsessis võivad vead esineda kõigis allpool toodud etappides:

  • Leksikaalne analüsaator: Valesti kirjutatud märgid.
  • Süntaksi analüsaator: Sulgudes puuduvad.
  • Vahepealne koodigeneraator: Operaatori operandid ei sobi kokku.
  • Code Optimeerija: Kui avaldus pole kättesaadav.
  • Code Generator: Kui mälu on täis või pole õigeid registreid eraldatud.
  • Sümbolite tabelid: Mitme deklareeritud identifikaatori viga.

Kõige levinumad vead on sobimatud märgijadad skannimisel, sobimatud märgijadad tüübis, ulatuse viga ja semantilise analüüsi parsimine.

Viga võib ilmneda ükskõik millises ülaltoodud faasis. Pärast vigade leidmist peab faas kompileerimisprotsessi jätkamiseks vigadega tegelema. Need vead tuleb teatada veahaldurile, kes tegeleb veaga kompileerimisprotsessi läbiviimiseks. Üldiselt teatatakse vigadest teate kujul.

KKK

Jah. Tehisintellekti assistendid oskavad iga faasi selgitada, trackuidas näidiskood muutub token'iteks ja parsib puid ning osutab süntaksi- või semantilise vea tekkimise kohale. Need on kasulikud õppevahendid, kuid kontrollivad seletusi õppematerjali suhtes.

Masinõpe suudab ennustada, millised optimeerimisläbid toodavad antud programmi ja masina jaoks kiireima koodi, häälestades valikuid, mis varem olid käsitsi loodud heuristikad. Kompilaator peab ikkagi tagama, et optimeeritud programm käitub täpselt nagu originaal.

Esiosa tegeleb leksikaalse, süntaksi ja semantilise analüüsi ning vahekoodiga ning sõltub lähtekeelest. Tagaosa tegeleb optimeerimise ja koodi genereerimisega ning sõltub sihtmasinast. See jaotus lihtsustab sihtimise kordumist.

Ei. Leksikaalne analüüs (skaneerimine) grupeerib märgid sümboliteks, samas kui parsimine (süntaksianalüüs) järjestab need sümbolid grammatikareeglite järgi parsimispuuks. Leksikaalne analüüs käivitatakse kõigepealt ja edastab oma sümbolid parsijale.

Võta see postitus kokku järgmiselt: