Vad är en kompilatordesign? Typer, konstruktionsverktyg, exempel

⚡ Smart sammanfattning

Kompilatorns faser beskriver de sex steg som omvandlar källkod till maskinkod: lexikal analys, syntaxanalys, semantisk analys, mellanliggande kodgenerering, kodoptimering och kodgenerering, med stöd av symboltabellhantering och felhantering.

  • 🔤 Lexikal analys: Skannern grupperar tecken i tokens och registrerar dem i symboltabellen.
  • ???? Syntaxanalys: Parsern kontrollerar grammatik och bygger ett hierarkiskt parsningsträd från tokens.
  • ✔️ Semantisk analys: Denna fas verifierar typkompatibilitet och betydelse med hjälp av syntaxträdet.
  • ⚙️ Code Generation: Mellankod genereras, optimeras och slutligen översätts till målmaskinkod.
  • 📋 Stödrutiner: En symboltabell och en felhanteringsrutin interagerar med varje kompileringsfas.

Faser i kompilatorn med exempel: Kompileringsprocess och steg

Vilka är faserna av kompilatordesign?

A Kompilator fungerar i olika faser, och varje fas omvandlar källprogrammet från en representation till en annan. Varje fas tar indata från sitt föregående steg och matar utdata till nästa fas i kompilatorn. Det finns 6 faser i en kompilator. Var och en av dessa faser hjälper till att konvertera högnivåspråket till maskinkod. Faserna i en kompilator är:

  1. Lexikalisk analys
  2. Syntaxanalys
  3. Semantisk analys
  4. Mellankodgenerator
  5. Code Optimizer
  6. Code Generatorn

Kompilatorns faser

Kompilatorns faser

Alla dessa faser konverterar källkoden genom att dela upp den i tokens, skapa parsträd och optimera källkoden genom olika faser.

Fas 1: Lexikal analys

Lexikal analys är den första fasen, då kompilatorn skannar källkoden. Denna process kan ske från vänster till höger, tecken för tecken, och gruppera dessa tecken i tokens.

Här grupperas teckenströmmen från källprogrammet i meningsfulla sekvenser genom att identifiera tokens. Den gör inmatningen av motsvarande tokens i symboltabellen och skickar den token till nästa fas.

De primära funktionerna i denna fas är:

  • Identifiera de lexikala enheterna i en källkod.
  • Klassificera lexikala enheter i klasser som konstanter, reserverade ord och ange dem i olika tabeller. Kommentarer i källprogrammet ignoreras.
  • Identifiera en token som inte är en del av språket.

Exempel: x = y + 10

Pollett Typ
X identifierare
= Uppdragsoperatör
Y identifierare
+ Tilläggsoperatör
10 Antal

Fas 2: Syntaxanalys

Syntaxanalys handlar om att upptäcka strukturen i kod. Den avgör om en text följer det förväntade formatet. Huvudsyftet med denna fas är att säkerställa att källkoden som programmeraren har skrivit är korrekt eller inte.

Syntaxanalys baseras på reglerna för det specifika programmeringsspråket genom att konstruera parseträdet med hjälp av tokens. Den bestämmer också källspråkets struktur och språkets grammatik eller syntax.

Här är en lista över uppgifter som utförts i denna fas:

  • Hämta tokens från den lexikala analysatorn.
  • Kontrollera om uttrycket är syntaktiskt korrekt eller inte.
  • Rapportera alla syntaxfel.
  • Konstruera en hierarkisk struktur som kallas ett parseträd.

Exempelvis

Varje identifierare/tal är ett uttryck. Om x är en identifierare och y+10 är ett uttryck, då är x = y+10 en sats. Betrakta parsningsträdet för följande exempel:

(a+b)*c

Exempel på syntaxanalys

I parse-trädet:

  • Inre nod: post med ett operatorfält och två fält för underordnade.
  • Löv: poster med två eller fler fält; ett för token och annan information om token.
  • Se till att programmets komponenter passar ihop på ett meningsfullt sätt.
  • Samlar in typinformation och kontrollerar typkompatibilitet.
  • Kontrolloperander är tillåtna av källspråket.

Fas 3: Semantisk analys

Semantisk analys kontrollerar kodens semantiska konsistens. Den använder syntaxträdet för föregående fas tillsammans med symboltabellen för att verifiera att den givna källkoden är semantiskt konsekvent. Den kontrollerar också om koden förmedlar en lämplig betydelse.

Den semantiska analysatorn kontrollerar efter typavvikelser, inkompatibla operander, en funktion som anropas med felaktiga argument, en odeklarerad variabel etc.

Funktionerna i den semantiska analysfasen är:

  • Hjälper dig att lagra insamlad typinformation och spara den i symboltabellen eller syntaxträdet.
  • Låter dig utföra typkontroll.
  • Vid en typmatchning, där det inte finns några exakta typkorrigeringsregler som uppfyller den önskade operationen, visas ett semantiskt fel.
  • Samlar in typinformation och kontrollerar typkompatibilitet.
  • Kontrollerar om källspråket tillåter operanderna eller inte.

Exempelvis

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

I koden ovan kommer den semantiska analysatorn att typkonvertera heltalet 30 till flyttal 30.0 före multiplikation.

Fas 4: Mellannivå Code Generation

När den semantiska analysfasen är över genererar kompilatorn mellanliggande kod för målmaskinen. Den representerar ett program för vissa abstract-maskin.

Mellankod ligger mellan högnivå- och maskinnivåspråk. Denna mellankod måste genereras på ett sådant sätt att den är enkel att översätta till målmaskinkoden.

Funktioner hos mellanprodukten Code generation:

  • Den bör genereras från den semantiska representationen av källprogrammet.
  • Lagrar de värden som beräknats under översättningsprocessen.
  • Hjälper dig att översätta mellankoden till målspråket.
  • Gör att du kan bibehålla prioritetsordningen för källspråket.
  • Den innehåller rätt antal operander i instruktionen.

Exempelvis

Till exempel:

total = count + rate * 5

Mellankod med hjälp av adresskodmetoden är:

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

Fas 5: Code Optimering

Nästa fas är kodoptimering av mellankoden. Denna fas tar bort onödiga kodrader och arrangerar sekvensen av satser för att snabba upp programmets exekvering utan att slösa resurser. Huvudmålet med denna fas är att förbättra mellankoden för att generera en kod som körs snabbare och tar upp mindre utrymme.

De primära funktionerna i denna fas är:

  • Det hjälper dig att upprätta en avvägning mellan exekverings- och kompileringshastighet.
  • Förbättrar körtiden för målprogrammet.
  • Genererar strömlinjeformad kod som fortfarande är i mellanliggande representation.
  • Tar bort oåtkomlig kod och gör sig av med oanvända variabler.
  • Tar bort satser som inte ändras från loopen.

Exempel: Tänk på följande kod:

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

Kan bli:

b = c * 10.0
f = e + b

Fas 6: Code Generation

Code Generering är den sista och avslutande fasen i en kompilator. Den hämtar indata från kodoptimeringsfasen och producerar sidkod eller objektkod som ett resultat. Syftet med denna fas är att allokera lagringsutrymme och generera flyttbar maskinkod.

Den allokerar också minnesplatser för variablerna. Instruktionerna i mellankoden konverteras till maskininstruktioner. Denna fas konverterar den optimerade eller mellankoden till målspråket.

Målspråket är maskinkoden. Därför väljs och tilldelas även alla minnesplatser och register under denna fas. Koden som genereras i denna fas exekveras för att ta emot indata och generera förväntade utdata.

Exempelvis

a = b + 60.0 skulle möjligen översättas till register som:

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

Symboltabellhantering

En symboltabell innehåller en post för varje identifierare med fält för identifierarens attribut. Denna komponent gör det enklare för kompilatorn att söka i identifierarposten och hämta den snabbt. Symboltabellen hjälper dig också med hantering av omfång. Symboltabellen och felhanteraren interagerar med alla faser, och symboltabellen uppdateras i enlighet därmed.

Felhanteringsrutin

I kompilatordesignprocessen kan fel uppstå i alla nedanstående faser:

  • Lexikal analysator: Felstavade tokens.
  • Syntaxanalysator: Saknar parentes.
  • Mellanliggande kodgenerator: Felmatchade operander för en operator.
  • Code Optimerare: När uttalandet inte är tillgängligt.
  • Code Generator: När minnet är fullt eller korrekta register inte allokeras.
  • Symboltabeller: Fel på flera deklarerade identifierare.

De vanligaste felen är ogiltiga teckensekvenser vid skanning, ogiltiga tokensekvenser i typ, omfattningsfel och parsning vid semantisk analys.

Felet kan uppstå i någon av ovanstående faser. Efter att fel har hittats måste fasen åtgärda felen för att kunna fortsätta med kompileringsprocessen. Dessa fel måste rapporteras till felhanteraren, som hanterar felet för att utföra kompileringsprocessen. Generellt sett rapporteras felen i form av ett meddelande.

Vanliga frågor

Ja. AI-assistenter kan förklara varje fas, trace hur exempelkod omvandlas till tokens och parsar träd, och pekar ut var ett syntax- eller semantiskt fel uppstår. De är användbara studiehjälpmedel, men verifierar förklaringar mot kursmaterialet.

Maskininlärning kan förutsäga vilka optimeringspass som producerar den snabbaste koden för ett givet program och en given maskin, och justera val som en gång var handgjorda heuristik. Kompilatorn måste fortfarande garantera att det optimerade programmet beter sig exakt som originalet.

Front-end hanterar lexikal, syntaxisk och semantisk analys plus mellanliggande kod, och är beroende av källspråket. Back-end hanterar optimering och kodgenerering, och är beroende av målmaskinen. Denna uppdelning förenklar retargeting.

Nej. Lexikal analys (skanning) grupperar tecken i tokens, medan parsning (syntaxanalys) arrangerar dessa tokens i ett parsningsträd enligt grammatikregler. Lexikal analys körs först och matar sina tokens till parsern.

Sammanfatta detta inlägg med: