Hva er et kompilatordesign? Typer, konstruksjonsverktøy, eksempel

⚡ Smart oppsummering

Faser i en kompilator beskriver de seks stadiene som transformerer kildekode til maskinkode: leksikalsk analyse, syntaksanalyse, semantisk analyse, generering av mellomkode, kodeoptimalisering og kodegenerering, støttet av symboltabellhåndtering og feilhåndtering.

  • 🔤 Leksikalsk analyse: Skanneren grupperer tegn i tokens og registrerer dem i symboltabellen.
  • ???? Syntaksanalyse: Parseren sjekker grammatikk og bygger et hierarkisk parse-tre fra tokener.
  • ✔️ Semantisk analyse: Denne fasen verifiserer typekompatibilitet og betydning ved hjelp av syntakstreet.
  • ⚙️ Code Generasjon: Mellomkode genereres, optimaliseres og til slutt oversettes til målmaskinkode.
  • ???? Støtterutiner: En symboltabell og en feilhåndteringsrutine samhandler med hver kompileringsfase.

Faser av kompilator med eksempel: Kompileringsprosess og trinn

Hva er fasene av kompilatordesign?

A kompilatoren opererer i ulike faser, og hver fase transformerer kildeprogrammet fra én representasjon til en annen. Hver fase tar inndata fra sitt forrige trinn og mater utdataene til neste fase av kompilatoren. Det er 6 faser i en kompilator. Hver av disse fasene bidrar til å konvertere høynivåspråket til maskinkode. Fasene i en kompilator er:

  1. Leksikalsk analyse
  2. Syntaksanalyse
  3. Semantisk analyse
  4. Mellomkodegenerator
  5. Code optimizer
  6. Code generator

Faser av kompilator

Faser av kompilator

Alle disse fasene konverterer kildekoden ved å dele den inn i tokens, lage parsetrær og optimalisere kildekoden gjennom ulike faser.

Fase 1: Leksikalsk analyse

Leksikalsk analyse er den første fasen, når kompilatoren skanner kildekoden. Denne prosessen kan utføres fra venstre til høyre, tegn for tegn, og grupperer disse tegnene i tokens.

Her grupperes tegnstrømmen fra kildeprogrammet i meningsfulle sekvenser ved å identifisere tokenene. Den foretar innføringen av de tilsvarende tokenene i symboltabellen og sender den tokenen til neste fase.

Hovedfunksjonene til denne fasen er:

  • Identifiser de leksikalske enhetene i kildekoden.
  • Klassifiser leksikalske enheter i klasser som konstanter og reserverte ord, og legg dem inn i forskjellige tabeller. Kommentarer i kildeprogrammet vil ignoreres.
  • Identifiser et token som ikke er en del av språket.

Eksempel: x = y + 10

Pollett typen
X identifikator
= Oppdragsoperatør
Y identifikator
+ Tilleggsoperatør
10 Nr

Fase 2: Syntaksanalyse

Syntaksanalyse handler om å oppdage struktur i kode. Den avgjør om en tekst følger det forventede formatet. Hovedmålet med denne fasen er å sørge for at kildekoden som er skrevet av programmereren er korrekt eller ikke.

Syntaksanalyse er basert på reglene i det spesifikke programmeringsspråket ved å konstruere parsetreet ved hjelp av tokens. Den bestemmer også strukturen til kildespråket og grammatikken eller syntaksen til språket.

Her er en liste over oppgaver som utføres i denne fasen:

  • Hent tokener fra den leksikalske analysatoren.
  • Sjekk om uttrykket er syntaktisk korrekt eller ikke.
  • Rapporter alle syntaksfeil.
  • Konstruer en hierarkisk struktur som er kjent som et parse-tre.

Eksempel

Enhver identifikator/et tall er et uttrykk. Hvis x er en identifikator og y+10 er et uttrykk, så er x = y+10 en setning. Tenk på parsetreet for følgende eksempel:

(a+b)*c

Eksempel på syntaksanalyse

I parse-treet:

  • Intern node: post med et operatorfelt og to felt for underordnede.
  • Blad: poster med to eller flere felt; ett for tokenet og annen informasjon om tokenet.
  • Sørg for at programmets komponenter passer meningsfullt sammen.
  • Samler inn typeinformasjon og kontrollerer typekompatibilitet.
  • Kontrolloperander er tillatt av kildespråket.

Fase 3: Semantisk analyse

Semantisk analyse sjekker den semantiske konsistensen til koden. Den bruker syntakstreet fra forrige fase sammen med symboltabellen for å bekrefte at den gitte kildekoden er semantisk konsistent. Den sjekker også om koden formidler en passende mening.

Den semantiske analysatoren vil sjekke for typeavvik, inkompatible operander, en funksjon kalt med uriktige argumenter, en udeklarert variabel, osv.

Funksjonene i den semantiske analysefasen er:

  • Hjelper deg med å lagre innsamlet typeinformasjon og lagre den i symboltabellen eller syntakstreet.
  • Lar deg utføre typekontroll.
  • Ved typeavvik, der det ikke finnes eksakte typekorreksjonsregler som tilfredsstiller den ønskede operasjonen, vises en semantisk feil.
  • Samler inn typeinformasjon og kontrollerer typekompatibilitet.
  • Sjekker om kildespråket tillater operandene eller ikke.

Eksempel

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

I koden ovenfor vil den semantiske analysatoren typecaste heltallet 30 til å flytte 30.0 før multiplikasjon.

Fase 4: Mellomnivå Code Generasjon

Når den semantiske analysefasen er over, genererer kompilatoren mellomliggende kode for målmaskinen. Den representerer et program for noen abstract-maskin.

Mellomkode er et område mellom høynivå- og maskinnivåspråk. Denne mellomkoden må genereres på en slik måte at den er enkel å oversette til målmaskinkoden.

Funksjoner av mellomprodukt Code generasjon:

  • Den bør genereres fra den semantiske representasjonen av kildeprogrammet.
  • Lagrer verdiene som ble beregnet under oversettelsesprosessen.
  • Hjelper deg med å oversette mellomkoden til målspråket.
  • Lar deg opprettholde prioritetsrekkefølgen til kildespråket.
  • Den inneholder riktig antall operander i instruksjonen.

Eksempel

For eksempel:

total = count + rate * 5

Mellomkode ved hjelp av adressekodemetoden er:

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

Fase 5: Code Optimalisering

Den neste fasen er kodeoptimalisering av mellomkoden. Denne fasen fjerner unødvendige kodelinjer og arrangerer rekkefølgen av setninger for å øke hastigheten på programmets kjøring uten å sløse med ressurser. Hovedmålet med denne fasen er å forbedre mellomkoden for å generere en kode som kjører raskere og tar opp mindre plass.

Hovedfunksjonene til denne fasen er:

  • Det hjelper deg med å etablere en avveining mellom utførelses- og kompileringshastighet.
  • Forbedrer kjøretiden til målprogrammet.
  • Genererer strømlinjeformet kode som fortsatt er i mellomrepresentasjon.
  • Fjerne utilgjengelig kode og kvitte seg med ubrukte variabler.
  • Fjerner setninger som ikke endres fra løkken.

Eksempel: Vurder følgende kode:

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

Kan bli:

b = c * 10.0
f = e + b

Fase 6: Code Generasjon

Code Generering er den siste og avsluttende fasen i en kompilator. Den mottar input fra kodeoptimaliseringsfasen og produserer sidekoden eller objektkoden som et resultat. Målet med denne fasen er å allokere lagringsplass og generere flyttbar maskinkode.

Den tildeler også minneplasseringer for variablene. Instruksjonene i mellomkoden konverteres til maskininstruksjoner. Denne fasen konverterer den optimaliserte eller mellomkoden til målspråket.

Målspråket er maskinkoden. Derfor blir alle minneplasseringer og registre også valgt og tildelt i denne fasen. Koden som genereres i denne fasen kjøres for å ta imot input og generere forventede output.

Eksempel

a = b + 60.0 ville muligens bli oversatt til registre som:

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

Symboltabellbehandling

En symboltabell inneholder en post for hver identifikator med felt for identifikatorens attributter. Denne komponenten gjør det enklere for kompilatoren å søke i identifikatorposten og hente den raskt. Symboltabellen hjelper deg også med omfangshåndtering. Symboltabellen og feilbehandleren samhandler med alle fasene, og symboltabellen oppdateres tilsvarende.

Feilhåndteringsrutine

I kompilatordesignprosessen kan det oppstå feil i alle de nedenfor angitte fasene:

  • Leksikalsk analysator: Feilstavede tokens.
  • Syntaksanalysator: Mangler parentes.
  • Mellomliggende kodegenerator: Feilaktige operander for en operator.
  • Code Optimizer: Når uttalelsen ikke er tilgjengelig.
  • Code Generator: Når minnet er fullt eller riktige registre ikke er tildelt.
  • Symboltabeller: Feil ved flere deklarerte identifikatorer.

De vanligste feilene er ugyldige tegnsekvenser i skanning, ugyldige tokensekvenser i type, omfangsfeil og parsing i semantisk analyse.

Feilen kan oppstå i hvilken som helst av fasene ovenfor. Etter at feilene er funnet, må fasen håndtere feilene for å fortsette kompileringsprosessen. Disse feilene må rapporteres til feilbehandleren, som håndterer feilen for å utføre kompileringsprosessen. Vanligvis rapporteres feilene i form av en melding.

Spørsmål og svar

Ja. AI-assistenter kan forklare hver fase, trace hvordan eksempelkode blir til tokener og analyserer trær, og peker ut hvor en syntaks- eller semantisk feil oppstår. De er nyttige studiehjelpemidler, men verifiserer forklaringer mot kursmateriell.

Maskinlæring kan forutsi hvilke optimaliseringsprosesser som produserer den raskeste koden for et gitt program og en gitt maskin, og dermed justere valg som en gang var håndlagde heuristikker. Kompilatoren må fortsatt garantere at det optimaliserte programmet oppfører seg nøyaktig som originalen.

Front-end håndterer leksikalsk, syntaktisk og semantisk analyse pluss mellomliggende kode, og er avhengig av kildespråket. Back-end håndterer optimalisering og kodegenerering, og er avhengig av målmaskinen. Denne oppdelingen forenkler retargeting.

Nei. Leksikalsk analyse (skanning) grupperer tegn i tokener, mens parsing (syntaksanalyse) arrangerer disse tokenene i et parsetre i henhold til grammatikkregler. Leksikalsk analyse kjører først og mater tokenene sine til parseren.

Oppsummer dette innlegget med: