Enkompilator är inomdatavetenskap ettdatorprogram som utifrån enprogramtext skrivet i ettprogramspråk som till exempelC,Modula, ellerAda, skapar ett motsvarandelågnivåprogram som kan omvandlas till exekverbar kod (maskinkod) som kanutföra de aktiviteter som programtexten beskriver, alltså ett slags översättare. Normalt genererar en kompilatorassembler, för senare omvandling till maskinkod för en specifik datortyp, men även andra varianter förekommer.
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 enkodgenerator för att skapa den slutliga översättningen till maskinkod.
Denna består ofta av tre steg:lexikalanalys,syntaxanalys samtsemantisk analys, vilka kan vara mer eller mindre separerade.
- Den lexikala analysen tar bort kommentarer och delar upp programtexten i betydelsebärande 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ättninggrammatiska 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ätttyp, 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 mellanheltal ellerreella tal.
Denna genomför olika transformationer på den interna representationen för att slutligen kunna översätta programmet till effektiv maskinkod/assembler.
- 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 oftaregisterallokering; 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ågnivåspråket (se ovan). För en så kalladCISC-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 enRISC-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överlänkas till systemrutiner för att göras till ett körbart program.