nyckelskillnad – maskinberoende vs maskinoberoende kodoptimering
Datorprogram är uppsättningar instruktioner som ges till hårdvara för att utföra uppgifter. Dessa program är mestadels skrivna på högnivåspråk, och datorn förstår inte det språket. Därför används en kompilator för att konvertera dessa instruktioner till maskinkod eller målkod. Det går igenom flera faser för att bygga målkoden. Kodoptimering är en av dem. Det finns två optimeringstekniker som maskinberoende och maskinoberoende kodoptimering. Den viktigaste skillnaden mellan maskinberoende och maskinoberoende kodoptimering är att den maskinberoende optimeringen tillämpas på objektkod medan maskinoberoende kodoptimering tillämpas på den mellanliggande koden.
Vad är maskinberoende kodoptimering?
När källkoden konverteras till objektkod eller målkod går kompilatorn igenom flera faser. Först ges källkoden till Lexical analysator som producerar tokens. Sedan ges utdata till en syntaxanalysator som undersöker om de genererade tokens är i logisk ordning. Den utmatningen ges till den semantiska analysatorn. Antag att det finns en kodbit som p=q + r;
Här är p, q heltal, men r är ett flyt. Med den semantiska analysatorn konverteras c heltalsvariabeln till en float. Därför gör den den semantiska analysen. Utdata från den semantiska analysatorn går till mellankodgeneratorn. Den returnerar en mellankod som sedan går till kodoptimeraren. Kodoptimering är processen att eliminera de icke väsentliga programsatserna utan att ändra innebörden av den faktiska källkoden. Det är inte en obligatorisk optimering, men det kan förbättra körtiden för målkoden. Utdata från kodoptimeraren ges till kodgeneratorn och slutligen byggs målkoden.
Figur 01: Kompilatorns faser
I maskinberoende kodoptimering tillämpas optimering på källkoden. Att allokera tillräcklig mängd resurser kan förbättra programmets genomförande i denna optimering.
Vad är maskinoberoende kodoptimering?
När optimering görs på mellankoden kallas det för maskinoberoende kodoptimering. Det finns olika tekniker för att uppnå maskinoberoende kodoptimering. De beskrivs med följande exempel.
Läs nedanstående kodrader.
for (j=0; j<10; j ++) {
b=x+2;
a[j]=5 j;
}
Enligt ovanstående kod beräknas b=x+2 om och om igen i varje iteration. När b väl har beräknats ändras det inte. Så den här linjen kan placeras utanför slingan enligt följande.
b=x+2;
for (j=0; j< 10; j++)
{a[j]=5j;
}
Detta kallas kodrörelse.
Läs nedanstående kodrader.
j=5;
if (j==10) {
a=b+20;
}
Enligt ovanstående kod kommer 'if block' aldrig att köras eftersom j-värdet aldrig kommer att vara lika med 10. Det är redan initialiserat till värdet 5. Därför kan detta if-block tas bort. Denna teknik är eliminering av död kod.
En annan metod är hållfasthetsminskning. Aritmetiska operationer som multiplikation kräver mer minne, tid och CPU-cykler. Dessa dyra uttryck kan ersättas med billiga uttryck som b=a2; eller kan ersättas med addition, b=a + a;
Se koden nedan.
för (j=1; j <=5; j ++) {
value=j5;
}
Istället för multiplikationen kan koden ändras enligt följande.
int temp=5;
for (j=1; j<=5; j++) {
temp=temp + 5;
value=temp;
}
Det är möjligt att utvärdera uttrycken som är konstanter vid körning. Det kallas konstant vikning. Det kan anges som b[j+1]=c [j+1];
Istället kan det ändras enligt följande.
n=j +1;
b[n]=c[n];
Det kan finnas loopar enligt följande.
for (j=0; j<5; j++) {
printf(“a\n”);
}
for (j=0; j <5; j++) {
printf(“b\n”);
}
Att skriva ut a och b har båda samma antal iterationer. Båda kan kombineras till en för loop enligt följande.
for (j=0; j <5; j++) {
printf(“a \n”);
printf(“b\n”);
}
En annan viktig teknik är eliminering av det gemensamma underuttrycket. Det är att ersätta de identiska uttrycken med en enda variabel för att göra beräkningen. Se nedanstående kod.
a=bc + k;
d=b c + m;
Denna kod kan konverteras enligt följande.
temp=bc;
a=temp + k;
d=temp + m;
Det är inte nödvändigt att beräkna bc om och om igen. Det multiplicerade värdet kan lagras i en variabel och återanvändas.
Vad är likheten mellan maskinberoende och maskinoberoende kodoptimering?
Båda dessa tillhör kodoptimering
Vad är skillnaden mellan maskinberoende och maskinoberoende kodoptimering?
Maskinberoende vs maskinoberoende kodoptimering |
|
Maskinberoende kodoptimering tillämpas på objektkod. | Maskinoberoende kodoptimering tillämpas på mellankod. |
Engagemang med hårdvara | |
Maskinberoende optimering involverar CPU-register och absoluta minnesreferenser. | Maskinoberoende kodoptimering involverar inte CPU-register eller absoluta minnesreferenser. |
Sammanfattning – Maskinberoende vs maskinoberoende kodoptimering
Kodoptimering består av två optimeringstekniker, nämligen maskinberoende och maskinoberoende kodoptimering. Skillnaden mellan maskinberoende och maskinoberoende kodoptimering är att den maskinberoende optimeringen tillämpas på objektkod medan den maskinoberoende kodoptimeringen tillämpas på mellankod.
Ladda ner PDF-versionen av maskinberoende vs maskinoberoende kodoptimering
Du kan ladda ner PDF-versionen av den här artikeln och använda den för offlineändamål enligt citat. Ladda ner PDF-versionen här Skillnaden mellan maskinberoende och maskinoberoende kodoptimering