Kompilator
Wikipedia
En kompilator är ett datorprogram som översätter ett datorprogram från ett programspråk till ett annat, till exempel från C till maskinkod. Denna process sker vanligen som ett antal separata faser eller steg. Normalt delas dessa in i två huvudkomponenter, en front-end och en back-end. Frontenden har som uppgift att tolka det programspråk som kompileras, och översätta den till en abstrakt syntax. Denna abstraka syntax används sedan som indata till backenden för att generera den slutliga översättningen.
[redigera] Front end
Frontenden består normalt av tre steg: lexikalanalys, syntaxanalys samt semantisk analys.
- Lexikalanalysen tar bort kommentarer och delar upp programmet i tokens, det vill säga betydelsebärende enheter, till exempel IF, WHEN, tilldelning, addition och så vidare. De kan ses som ord och skiljetecken i programspråket.
- Syntaxanalysen sätter samman orden från lexikalanalysen till korrekta meningar, satser och uttryck i programspråket. Detta görs ifrån en uppsätning grammatiska regler för hur orden får kombineras.
- Den semantiska analysen syftar till att kontrollera att de instruktioner som satserna bildar får utföras. Det viktigaste steget är typkontroll och uppmärkning av syntaxträdet. Då kontrolleras att alla uttryck är av rätt typ. Till exempel förhindras att två strängar kan divideras med varandra, eller att funktioner anropas med fel antal parametrar. När typen av ett uttryck är fastställd märks syntaxträdet upp med korrekt typinformation, så att kompilatorn senare ska veta om till exempel en addition är mellan heltal eller reella tal. Ju mer avancerad den semantiska analysen görs desto mindre blir risken att fel som får program att krascha kan kompileras.
[redigera] Back end
Backenden får ett uppmärkt syntaxträd från frontenden, och genomför transformationer på detta för att komma till målspråket.
- Optimeringssteg kan förekomma flera gånger på olika nivåer i översättningen. Bland annat kan konstanta uttryck räknas ut, och kod som aldrig kommer nås tas bort från programmet.
- Översättningen görs ofta först till ett internt mellanspråk som är ett förenklat generellt lågnivåspråk för en godtycklig processorarkitektur.
- Därefter genomförs registerallokering. Då fördelas processorns interna lagringsutrymme till variabler så att operationer går att genomföra.
- Det sista steget är kodgenerering där kompilatorn väljer instruktioner i målspråket som kan ersätta instruktionerna i källspråket, eller det interna mellanspråket. Om målspråket är för CISC-processor krävs här en stor insats av kompilatorn för att välja så bra instruktioner som möjligt, då det finns instruktioner som kan ersätta ett flertal instruktioner i käll- eller mellanspråket. Kodgenerering till RISC-arkitektur är enklare då urvalet av instruktioner är mindre.
Fördelen med att bygga upp en kompilator så här att det blir väldigt enkelt att till exempel byta målspråk. Allt man behöver göra är att byta ut den sista delen. För att lägga till ett nytt källspråk behövs bara en till front-end.
Ett program kompilerat till maskinkod behöver länkas till systemrutiner för att göras till ett körbart program.
[redigera] Se även
- Interpretator
- Assemblator
- Emulator
- Länkare