Nyckelskillnad - Maskinberoende mot maskinoberoende kodoptimering
Datorprogram är uppsättningar av instruktioner som ges till hårdvara för att utföra uppgifter. Dessa program är oftast 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. Huvudskillnaden mellan maskinberoende och maskinoberoende kodoptimering är att maskinberoende optimering tillämpas på objektkod medan maskinoberoende kodoptimering tillämpas på mellankoden.
INNEHÅLL
1. Översikt och nyckelskillnad
2. Vad är maskinberoende kodoptimering
3. Vad är maskinoberoende kodoptimering
4. Likheter mellan maskinberoende och maskinoberoende kodoptimering
5. Jämförelse sida vid sida - Maskinberoende vs maskinoberoende kodoptimering i tabellform
6. Sammanfattning
Vad är maskinberoende kodoptimering?
Vid omvandling av källkoden till objektkod eller målkod går kompilatorn genom flera faser. Först ges källkoden till Lexical analysator som producerar tokens. Därefter ges utgången till syntaxanalysator som undersöker om de genererade tokens är i logisk ordning. Den produktionen ges till den semantiska analysatorn. Antag att det finns en kod som p = q + r;
Här är p, q heltal, men r är en flottör. Med den semantiska analysatorn omvandlas c-heltalets variabel till en flottör. Därför gör den semantisk analys. Utgången från den semantiska analysatorn går till den mellanliggande kodgeneratorn. Den returnerar en mellanliggande kod som sedan går till kodoptimeraren. Kodoptimering är processen att eliminera icke-väsentliga programuttalanden utan att ändra betydelsen av den faktiska källkoden. Det är inte en obligatorisk optimering men det kan förbättra målkodens körtid. Utgången 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 fördela tillräckligt mycket resurser kan förbättra genomförandet av programmet i denna optimering.
Vad är maskinoberoende kodoptimering?
När optimering sker på den mellanliggande koden kallas den maskinoberoende kodoptimering. Det finns olika tekniker för att uppnå maskinoberoende kodoptimering. De beskrivs med hjälp av följande exempel.
Läs nedanstående kodrader.
för (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 har beräknats ändras det inte. Så den här linjen kan placeras utanför slingan enligt följande.
b = x + 2;
för (j = 0; j <10; j ++)
{a [j] = 5 * j;
}
Detta kallas kodrörelse.
Läs nedanstående kodrader.
j = 5;
om (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 om blocket tas bort. Denna teknik är eliminering av dödkod.
En annan metod är minskning av styrkan. Aritmetiska operationer som multiplikation kräver mer minne, tid och CPU-cykler. Dessa dyra uttryck kan ersättas med billiga uttryck som b = a * 2; eller kan ersättas med tillägg, b = a + a;
Se koden nedan.
för (j = 1; j <= 5; j ++) {
värde = j * 5;
}
I stället för multiplikationen kan koden ändras enligt följande.
int temp = 5;
för (j = 1; j <= 5; j ++) {
temp = temp + 5;
värde = temp;
}
Det är möjligt att utvärdera de uttryck som är konstanter vid körning. Det kallas konstant vikning. Det kan anges så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 öglor enligt följande.
för (j = 0; j <5; j ++) {
printf (“a / n”);
}
för (j = 0; j <5; j ++) {
printf (“b / n”);
}
Utskrift a och b, båda har samma antal iterationer. Båda kan kombineras till en för loop enligt följande.
för (j = 0; j <5; j ++) {
printf (“a / n”);
printf (“b / n”);
}
En annan viktig teknik är Common sub expression eliminering. Det är att ersätta identiska uttryck med en enda variabel för att göra beräkningen. Se nedanstående kod.
a = b * c + k;
d = b * c + m;
Denna kod kan konverteras enligt följande.
temp = b * c;
a = temp + k;
d = temp + m;
Det krävs inte att beräkna b * c 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?
Skilja artikeln mitt före bordet
Maskinberoende vs Maskinoberoende kodoptimering |
|
Maskinberoende kodoptimering tillämpas på objektkoden. | Maskinoberoende kodoptimering tillämpas på mellanliggande kod. |
Involvering med hårdvara | |
Maskinberoende optimering involverar CPU-register och absoluta minnesreferenser. | Maskinoberoende kodoptimering innefattar 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 maskinberoende optimering tillämpas på objektkod, medan maskinoberoende kodoptimering tillämpas på mellanliggande kod.
Ladda ner PDF-versionen av maskinberoende mot 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-version här Skillnaden mellan maskinberoende och maskinoberoende kodoptimering