Belangrijk verschil - Machine-afhankelijke versus machine-onafhankelijke code-optimalisatie
Computerprogramma's zijn sets instructies die aan hardware worden gegeven om taken uit te voeren. Deze programma's zijn meestal geschreven in talen op hoog niveau en de computer begrijpt die taal niet. Daarom wordt een compiler gebruikt om die instructies om te zetten in machinecode of doelcode. Het doorloopt verschillende fasen om de doelcode te bouwen. Code-optimalisatie is er één van. Er zijn twee optimalisatietechnieken, zoals machine-afhankelijke en machine-onafhankelijke code-optimalisatie. Het belangrijkste verschil tussen machine-afhankelijke en machine-onafhankelijke code-optimalisatie is dat de machine-afhankelijke optimalisatie wordt toegepast op objectcode, terwijl machine-onafhankelijke code-optimalisatie wordt toegepast op de tussenliggende code.
Wat is machine-afhankelijke code-optimalisatie?
Bij het converteren van de broncode naar objectcode of doelcode doorloopt de compiler verschillende fasen. Eerst wordt de broncode gegeven aan Lexical analyzer die tokens produceert. Vervolgens wordt de uitvoer gegeven aan de syntaxanalysator die onderzoekt of de gegenereerde tokens in logische volgorde staan. Die uitvoer wordt aan de semantische analysator gegeven. Neem aan dat er een stukje code is als p=q + r;
Hier zijn p, q gehele getallen, maar r is een float. Met behulp van de semantische analysator wordt de variabele c integer geconverteerd naar een float. Daarom doet het de semantische analyse. De uitvoer van de semantische analysator gaat naar de tussenliggende codegenerator. Het retourneert een tussenliggende code die vervolgens naar de code-optimizer gaat. Code-optimalisatie is het proces waarbij de niet-essentiële programmaverklaringen worden geëlimineerd zonder de betekenis van de daadwerkelijke broncode te veranderen. Het is geen verplichte optimalisatie, maar het kan de looptijd van de doelcode verbeteren. De uitvoer van de code-optimizer wordt aan de codegenerator gegeven en ten slotte wordt de doelcode gebouwd.
Figuur 01: Fasen van de compiler
Bij machine-afhankelijke code-optimalisatie wordt optimalisatie toegepast op de broncode. Het toewijzen van voldoende middelen kan de uitvoering van het programma in deze optimalisatie verbeteren.
Wat is machine-onafhankelijke code-optimalisatie?
Wanneer optimalisatie wordt uitgevoerd op de tussencode, wordt dit de machine-onafhankelijke code-optimalisatie genoemd. Er zijn verschillende technieken om machine-onafhankelijke code-optimalisatie te bereiken. Ze worden beschreven aan de hand van de volgende voorbeelden.
Lees onderstaande regels code.
for (j=0; j<10; j ++) {
b=x+2;
a[j]=5 j;
}
Volgens de bovenstaande code wordt b=x+2 keer op keer berekend in elke iteratie. Als b eenmaal is berekend, verandert deze niet. Deze lijn kan dus als volgt buiten de lus worden geplaatst.
b=x+2;
for (j=0; j< 10; j++)
{a[j]=5j;
}
Dit wordt codebeweging genoemd.
Lees onderstaande regels code.
j=5;
if (j==10) {
a=b+20;
}
Volgens bovenstaande code zal 'if block' nooit worden uitgevoerd omdat de j-waarde nooit gelijk zal zijn aan 10. Het is al geïnitialiseerd op de waarde 5. Daarom kan dit if-blok worden verwijderd. Deze techniek is dode code-eliminatie.
Een andere methode is krachtvermindering. Rekenkundige bewerkingen zoals vermenigvuldiging vereisen meer geheugen, tijd en CPU-cycli. Deze dure uitdrukkingen kunnen worden vervangen door goedkope uitdrukkingen zoals b=a2; of kan worden vervangen door toevoeging, b=a + a;
Verwijs naar de onderstaande code.
for (j=1; j <=5; j ++) {
waarde=j5;
}
In plaats van de vermenigvuldiging kan de code als volgt worden gewijzigd.
int temp=5;
for (j=1; j<=5; j++) {
temp=temp + 5;
waarde=temperatuur;
}
Het is mogelijk om de expressies te evalueren die constanten zijn tijdens runtime. Het wordt constant vouwen genoemd. Er kan worden vermeld zoals b[j+1]=c [j+1];
In plaats daarvan kan het als volgt worden gewijzigd.
n=j +1;
b[n]=c[n];
Er kunnen als volgt lussen zijn.
for (j=0; j<5; j++) {
printf(“a\n”);
}
for (j=0; j <5; j++) {
printf(“b\n”);
}
Afdrukken van a en b, beide hebben hetzelfde aantal iteraties. Beide kunnen als volgt worden gecombineerd tot één for-lus.
for (j=0; j <5; j++) {
printf(“een \n”);
printf(“b\n”);
}
Een andere belangrijke techniek is de eliminatie van Common sub-expressies. Het is om de identieke uitdrukkingen te vervangen door een enkele variabele om de berekening uit te voeren. Raadpleeg de onderstaande code.
a=bc + k;
d=b c + m;
Deze code kan als volgt worden omgezet.
temp=bc;
a=temp + k;
d=temp + m;
Het is niet nodig om bc steeds opnieuw te berekenen. De vermenigvuldigde waarde kan worden opgeslagen in een variabele en opnieuw worden gebruikt.
Wat is de overeenkomst tussen machine-afhankelijke en machine-onafhankelijke code-optimalisatie?
Beide behoren tot code Optimization
Wat is het verschil tussen machine-afhankelijke en machine-onafhankelijke code-optimalisatie?
Machine-afhankelijke vs. machine-onafhankelijke code-optimalisatie |
|
Machine-afhankelijke code-optimalisatie wordt toegepast op objectcode. | Machine-onafhankelijke code-optimalisatie wordt toegepast op tussenliggende code. |
Betrokkenheid bij hardware | |
Machine-afhankelijke optimalisatie omvat CPU-registers en absolute geheugenreferenties. | Machine-onafhankelijke code-optimalisatie omvat geen CPU-registers of absolute geheugenreferenties. |
Samenvatting – Machine-afhankelijke versus machine-onafhankelijke code-optimalisatie
Code-optimalisatie bestaat uit twee optimalisatietechnieken, namelijk machine-afhankelijke en machine-onafhankelijke code-optimalisatie. Het verschil tussen machine-afhankelijke en machine-onafhankelijke code-optimalisatie is dat de machine-afhankelijke optimalisatie wordt toegepast op objectcode, terwijl de machine-onafhankelijke code-optimalisatie wordt toegepast op tussenliggende code.
Download de PDF-versie van machine-afhankelijke vs machine-onafhankelijke code-optimalisatie
U kunt de PDF-versie van dit artikel downloaden en gebruiken voor offline doeleinden volgens de citatienota. Download hier de PDF-versie. Verschil tussen machine-afhankelijke en machine-onafhankelijke code-optimalisatie