Optimalisatie is het proces waarbij een compiler de interne representatie van een te compileren computerprogramma manipuleert om het resulterende gecompileerde programma zo efficiënt mogelijk te maken. De fase van de compiler waarin dit gebeurt wordt optimalisatiefase genoemd.
Het doel van optimalisatie is het resulterende programma zo snel mogelijk en zo klein mogelijk te maken, zonder de werking van het programma te veranderen.
In het algemeen maken de meeste compilers gebruik van twee soorten optimalisatie: "gewone" optimalisatie (vanaf nu simpelweg optimalisatie genoemd) en peephole-optimalisatie.
Optimalisatie vindt plaats op een interne representatie van een te compileren programma. Deze interne representatie kan bijvoorbeeld de abstracte syntaxisboom van het programma zijn zoals die door de parser gegenereerd wordt. Een andere, en in de praktijk meer voorkomende, situatie is dat de abstracte syntaxisboom eerst vertaald wordt naar een meer algemene (programmeertaal-onafhankelijke) interne representatie. Deze wordt vervolgens geoptimaliseerd, en op basis van deze geoptimaliseerde interne versie van het programma wordt de uiteindelijke code gegenereerd.
Sommige compilers, zoals GCC, gebruiken meerdere optimalisatiefasen. Nadat de ene optimalisatie uitgevoerd is, wordt het resultaat vertaald naar een tweede (of derde, enz.) interne representatie, waarna deze door een volgende optimalisatiefase bewerkt wordt.
Enkele voorbeelden van veelvoorkomende optimalisaties zijn:
x = 10+y-5
x = y+5
x = 3; y = x+5;
x = 3; y = 8;
x*y + x*z
x*(y+z)
a=2*(x+y); b=x+y+z; c=10*(x+y);
temp=x+y; a=2*temp; b=temp+z; c=10*temp;
for (i=0; i<1000; i++) { for (j=0; j<4; j++) { data[i,j] = f(i,j); } }
for (i=0; i<1000; i++) { data[i,0] = f(i,0); data[i,1] = f(i,1); data[i,2] = f(i,2); data[i,3] = f(i,3); }
Peephole-optimalisatie vindt pas plaats tegen het einde van het compilatieproces en wordt uitgevoerd na de code-generatie. De gegenereerde machinecode wordt hierbij op instructieniveau geanalyseerd, waarbij gekeken wordt of kleine instructiereeksen door een efficiëntere instructiereeks vervangen kunnen worden.
De mogelijke optimalisaties bij peepholeoptimalisatie zijn sterk afhankelijk van de processor waarvoor gecompileerd wordt.
Enkele voorbeelden van peepholeoptimalisaties:
a=a*2
a=a<<1