Faser af compiler med eksempel, proces og trin

⚡ Smart opsummering

Compilerfaser beskriver, hvordan en compiler transformerer kildekode til maskinkode gennem seks faser: leksikalsk analyse, syntaksanalyse, semantisk analyse, generering af mellemliggende kode, kodeoptimering og kodegenerering, understøttet af symboltabelstyring og fejlhåndtering hele vejen igennem.

  • 🔤 Leksisk analyse: Den første fase scanner kildekoden og grupperer tegn i tokens, der udfylder symboltabellen.
  • ???? Syntaksanalyse: Tokens kontrolleres i forhold til grammatikregler og arrangeres i et parsetræ.
  • ✅ Semantisk analyse: Compileren verificerer typekompatibilitet og betydning ved hjælp af syntakstræet og symboltabellen.
  • 🔁 Mellem Code: En maskinuafhængig repræsentation, såsom en tre-adressekode, genereres for nem oversættelse.
  • ⚡ Optimering: Overflødig og utilgængelig kode fjernes for at gøre programmet hurtigere og mindre.
  • 🖥️ Code Generation: Den sidste fase konverterer optimeret kode til målmaskinkode og allokerer registre og hukommelse.

Hvad er faserne af compilerdesign?

compiler fungerer i forskellige faser, hver fase transformerer kildeprogrammet fra en repræsentation til en anden. Hver fase tager input fra sin forrige fase og sender dens output til den næste fase af compileren.
Der er 6 faser i en compiler. Hver af denne fase hjælper med at konvertere højniveausproget til maskinkoden. Faserne i en compiler er:

  1. Leksikalsk analyse
  2. Syntaksanalyse
  3. Semantisk analyse
  4. Mellemkodegenerator
  5. Code optimering
  6. Code generator
Faser af compiler
Faser af compiler

Alle disse faser konverterer kildekoden ved at opdele i tokens, skabe parsetræer og optimere kildekoden efter forskellige faser.

Fase 1: Leksikalsk analyse

Leksikalsk analyse er den første fase, når compileren scanner kildekoden. Denne proces kan venstre mod højre, tegn for tegn, og gruppere disse tegn i tokens.
Her er karakterstrømmen fra kildeprogrammet grupperet i meningsfulde sekvenser ved at identificere tokens. Det gør indtastningen af ​​de tilsvarende billetter i symboltabellen og sender denne token til næste fase.
De primære funktioner i denne fase er:

  • Identificer de leksikalske enheder i en kildekode
  • Klassificer leksikalske enheder i klasser som konstanter, reserverede ord, og indtast dem i forskellige tabeller. Det vil ignorere kommentarer i kildeprogrammet
  • Identificer token, som ikke er en del af sproget

Eksempel:
x = y + 10

Tokens

X identifikator
= Tildelingsoperatør
Y identifikator
+ Tilføjelsesoperatør
10 nummer

Fase 2: Syntaksanalyse

Syntaksanalyse handler om at opdage struktur i kode. Det afgør, om en tekst følger det forventede format eller ej. Hovedformålet med denne fase er at sikre, at kildekoden, der blev skrevet af programmøren, er korrekt eller ej.
Syntaksanalyse er baseret på reglerne baseret på det specifikke programmeringssprog ved at konstruere parsetræet ved hjælp af tokens. Det bestemmer også strukturen af ​​kildesproget og sprogets grammatik eller syntaks.
Her er en liste over opgaver udført i denne fase:

  • Få tokens fra den leksikalske analysator
  • Kontrollerer, om udtrykket er syntaktisk korrekt eller ej
  • Rapporter alle syntaksfejl
  • Konstruer en hierarkisk struktur, der er kendt som et parsetræ

Eksempel

Ethvert identifikator/nummer er et udtryk
Hvis x er en identifikator, og y+10 er et udtryk, så er x= y+10 en sætning.
Overvej at analysere træ for følgende eksempel

(a+b)*c

Eksempel på syntaksanalyse

I Parse Tree

  • Indvendig node: optag med en operatørfil og to filer til børn
  • Blad: poster med 2/flere felter; en for token og andre oplysninger om tokenet
  • Sørg for, at komponenterne i programmet passer meningsfuldt sammen
  • Indsamler typeoplysninger og kontrollerer for typekompatibilitet
  • Kontroloperander er tilladt af kildesproget

Fase 3: Semantisk analyse

Semantisk analyse kontrollerer kodens semantiske konsistens. Den bruger syntakstræet fra den foregående fase sammen med symboltabellen for at verificere, at den givne kildekode er semantisk konsistent. Den kontrollerer også, om koden formidler en passende betydning.
Semantic Analyzer vil tjekke for Type-uoverensstemmelser, inkompatible operander, en funktion kaldet med ukorrekte argumenter, en ikke-erklæret variabel osv.
Funktioner af semantisk analysefase er:

  • Hjælper dig med at gemme indsamlet typeinformation og gemme den i symboltabel eller syntakstræ
  • Giver dig mulighed for at udføre typekontrol
  • I tilfælde af typemismatch, hvor der ikke er nogen nøjagtige typekorrektionsregler, der opfylder den ønskede operation, vises en semantisk fejl
  • Indsamler typeoplysninger og kontrollerer for typekompatibilitet
  • Kontrollerer, om kildesproget tillader operanderne eller ej

Eksempel

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

I ovenstående kode vil den semantiske analysator typecaste heltallet 30 til at flyde 30.0 før multiplikation

Fase 4: Mellemtrin Code Generation

Når den semantiske analysefase er overstået, genererer compileren mellemliggende kode til målmaskinen. Den repræsenterer et program for nogle abstract-maskine.
Mellemkode er mellem sprog på højt niveau og maskinniveau. Denne mellemkode skal genereres på en sådan måde, at den gør det nemt at oversætte den til målmaskinkoden.
Funktioner på mellemniveau Code generation:

  • Det bør genereres ud fra den semantiske repræsentation af kildeprogrammet
  • Indeholder de værdier, der er beregnet under oversættelsesprocessen
  • Hjælper dig med at oversætte mellemkoden til målsproget
  • Giver dig mulighed for at bevare prioritetsrækkefølgen af ​​kildesproget
  • Den indeholder det korrekte antal operander af instruktionen

Eksempel

For eksempel:

total = count + rate * 5

Mellemkode ved hjælp af adressekodemetoden er:

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

Fase 5: Code Optimering

Den næste fase af er kodeoptimering eller mellemkode. Denne fase fjerner unødvendig kodelinje og arrangerer sekvensen af ​​sætninger for at fremskynde udførelsen af ​​programmet uden at spilde ressourcer. Hovedmålet med denne fase er at forbedre den mellemliggende kode for at generere en kode, der kører hurtigere og optager mindre plads.
De primære funktioner i denne fase er:

  • Det hjælper dig med at etablere en afvejning mellem eksekverings- og kompileringshastighed
  • Forbedrer køretiden for målprogrammet
  • Generer strømlinet kode stadig i mellemrepræsentation
  • Fjernelse af uopnåelig kode og fjernelse af ubrugte variabler
  • Fjernelse af udsagn, der ikke er ændret, fra løkken

Eksempel:
Overvej følgende kode

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

kan blive

b =c * 10.0
f = e+b

Fase 6: Code Generation

Code Generering er den sidste og afsluttende fase i en compiler. Den modtager input fra kodeoptimeringsfaser og producerer sidekoden eller objektkoden som et resultat. Formålet med denne fase er at allokere lagerplads og generere flytbar maskinkode.
Den tildeler også hukommelsesplaceringer for variablen. Instruktionerne i mellemkoden konverteres til maskininstruktioner. Denne fase skjuler optimerings- eller mellemkoden til målsproget.
Målsproget er maskinkoden. Derfor bliver alle hukommelsesplaceringer og registre også udvalgt og tildelt i denne fase. Koden genereret af denne fase udføres for at tage input og generere forventede output.

Eksempel

a = b + 60.0
Vil muligvis blive oversat til registre.

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

Symbol Tabel Management

En symboltabel indeholder en post for hver identifikator med felter for identifikatorens attributter. Denne komponent gør det lettere for compileren at søge i identifikatorposten og hente den hurtigt. Symboltabellen hjælper dig også med scope-styringen. Symboltabellen og fejlbehandleren interagerer med alle faser og symboltabellen opdateres tilsvarende.

Fejlhåndteringsrutine

I compilerdesignprocessen kan der forekomme fejl i alle nedenstående givne faser:

  • Leksikalsk analysator: Forkert stavet tokens
  • Syntaksanalysator: Manglende parentes
  • Mellemkodegenerator: Mismatchede operander for en operator
  • Code Optimer: Når sætningen ikke er tilgængelig
  • Code Generator: Når hukommelsen er fuld eller korrekte registre ikke allokeres
  • Symboltabeller: Fejl ved flere erklærede identifikatorer

De mest almindelige fejl er ugyldig tegnsekvens i scanning, ugyldige tokensekvenser i type, omfangsfejl og parsing i semantisk analyse.
Fejlen kan opstå i enhver af ovenstående faser. Efter at have fundet fejl, skal fasen håndtere fejlene for at fortsætte med kompileringsprocessen. Disse fejl skal rapporteres til fejlbehandleren, som håndterer fejlen, for at udføre kompileringsprocessen. Generelt rapporteres fejlene i form af meddelelser.

Ofte Stillede Spørgsmål

Analysefasen (frontend) opdeler kildekoden gennem leksikalsk, syntaktisk og semantisk analyse. Syntesefasen (backend) opbygger målprogrammet gennem mellemliggende kodegenerering, optimering og kodegenerering.

En compiler oversætter hele kildeprogrammet til maskinkode, før det køres. En fortolker oversætter og udfører kode linje for linje, hvilket er lettere at debugge, men normalt langsommere under kørsel.

Tre-adressekode er en mellemrepræsentation, hvor hver instruktion har højst tre operander, såsom t1 = a + b. Den er enkel at optimere og nem at oversætte til målmaskinkode.

AI og maskinlæring hjælper moderne compilere med smartere optimeringsbeslutninger, såsom valg af looptransformationer, inlining og registerallokering. De forudsiger, hvilke optimeringer der forbedrer ydeevnen for et givet program og mål.

Ja. AI kan forklare hver fase med eksempler, trace hvordan en eksempelsætning bevæger sig fra tokens til maskinkode, og besvar opfølgende spørgsmål. Dette gør compilerdesign lettere for studerende at lære.

Opsummer dette indlæg med: