Kompilator

Från Wikipedia
Hoppa till: navigering, sök

En kompilator är ett datorprogram som utifrån en programtext skrivet i ett högnivåspråk som till exempel C, Modula, eller Ada, skapar ett motsvarande lågnivåprogram kapabelt att utföra de aktiviteter som programtexten beskriver, alltså ett slags översättare. Normalt genererar en kompilator maskinkod, för senare körning på en specifik datortyp, men även andra varianter förekommer. Den första kompilatorn skrevs av Grace Hopper på 50-talet.

Implementering[redigera | redigera wikitext]

Denna process sker vanligen som ett antal separata faser eller steg. Normalt delas dessa in i två huvudkomponenter: En språkspecifik del tolkar programtexten och översätter den (typiskt) till något lämpligt internt temporärformat, ofta någon form av träd eller graf. Detta används sedan av en kodgenerator för att skapa den slutliga översättningen till maskinkod.

Språkberoende analys[redigera | redigera wikitext]

Denna består ofta av tre steg: lexikalanalys, syntaxanalys samt semantisk analys som kan vara mer eller mindre separerade.

  • Den lexikala analysen tar bort kommentarer och delar upp programtexten i betydelsebärende textfragment i programspråket: if for := += 3.14 "test" etc.
  • Syntaxanalysen känner igen korrekta satser och uttryck i programspråket bestående av sådana textfragment. Detta görs ifrån en uppsättning grammatiska regler för hur de olika typerna av ord och symboler kan kombineras.
  • Den semantiska analysen kontrollerar att detta beskriver meningsfulla, möjliga, och tillåtna aktiviteter eller deklarationer, och bygger upp en intern representation av programmet. En viktig del av detta (i de flesta språk) är typkontroll, att alla uttryck är av rätt typ, till exempel att funktioner anropas med rätt sorts parametrar. När ett uttrycks typ fastställts så lagras typinformationen i den interna representationen av programmet så att senare steg vet om till exempel en addition är mellan heltal eller reella tal.

Kodgenerator[redigera | redigera wikitext]

Denna genomför olika transformationer på den interna representationen för att slutligen kunna översätta programmet till effektiv maskinkod.

  • Optimeringssteg kan förekomma på flera olika nivåer i översättningen; konstanta (del-) uttryck kan beräknas på förhand, invariant kod kan flyttas ut ur repetitioner etc.
  • Därefter genomförs ofta registerallokering; processorns interna register reserveras (dynamiskt) för aktuella variabler och mellanresultat i varje uttryck, block, och/eller rutin.
  • Det sista steget är kodgenerering där kompilatorn väljer maskininstruktioner som ska ersätta instruktionerna i det generella interna lågivåspråket (se ovan). För en sk CISC-processor kan det krävas en väsentlig insats för att uppnå den "optimala" översättningen då det kan finnas instruktioner som motsvarar ett flertal instruktioner i mellanspråket. Kodgenerering för en RISC-arkitektur är ofta enklare eftersom urvalet av instruktioner är mindre.

Fördelen med att bygga upp en kompilator så här är att det blir enklare att till exempel generera kod för en annan processor, man behöver bara skriva om den sista delen. För att lägga till ett nytt programspråk behöver bara den första delen skrivas om. I äldre eller enklare kompilatorer är dock kodgenereringen ofta invävd i de språkberoende delarna.

Ett program kompilerat till maskinkod behöver länkas till systemrutiner för att göras till ett körbart program.

Se även[redigera | redigera wikitext]