Datorprogram är uppsättningar instruktioner som ges till maskinvara 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. De nyckelskillnad mellan maskinberoende och maskinoberoende kodoptimering är att Maskinberoende optimering tillämpas på objektkod medan maskinoberoende kodoptimering tillämpas på mellankoden.
1. Översikt och nyckelskillnad
2. Vad är optimering av maskinberoende kod
3. Vad är optimering av oberoende koden för maskinen
4. Likheter mellan maskinberoende och maskin oberoende kodoptimering
5. Jämförelse vid sida vid sida - Maskinberoende jämfört med Machine Independent Code Optimization i tabellform
6. Sammanfattning
När du konverterar källkoden till objektkod eller målkod går kompilatorn igenom flera faser. För det första ges källkoden till Lexical analysator som producerar tokens. Sedan ges utmatningen till syntaxanalysator som undersöker huruvida de genererade tokens är i logisk ordning. Den utsignalen ges till semantisk analysator. Antag att det finns en bit kod som p = q + r;
Här är p, q heltal, men r är en flottör. Med hjälp av den semantiska analysatorn omvandlas c-heltalvariabeln till en flottör. Därför gör den semantiska analysen. Semantikanalysatorns utgång går till mellankodgeneratorn. Den returnerar en mellankod som sedan går till kodoptimeraren. Kodoptimering är processen att eliminera de icke-väsentliga programansökningarna utan att ändra betydelsen av aktuell källkod. Det är inte en obligatorisk optimering men det kan förbättra tiden för målkoden. Kodoptimerarens utdata ges till kodgeneratorn, och slutligen byggs målkoden.
Figur 01: Kompilerarens faser
I maskinberoende kodoptimering tillämpas optimering på källkoden. Att fördela tillräcklig mängd resurser kan förbättra genomförandet av programmet i denna optimering.
När optimering görs på mellankoden 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 bägge linjer med kod.
för (j = 0; j<10; j ++)
b = x + 2;
a [j] = 5 * j;
Enligt ovanstående kod beräknas b = x + 2 igen och igen i varje iteration. När b har beräknats ändras det inte. Så kan denna linje 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 bägge linjer med kod.
j = 5;
om (j == 10)
a = b + 20;
Enligt ovanstående kod kommer "om block" aldrig att utfö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 död kod eliminering.
En annan metod är styrka reduktion. 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 addition, b = a + a;
Se nedan koden.
för (j = 1; j <= 5; j ++)
värde = j * 5;
Istä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 uttrycken som är konstanter vid körning. Det kallas konstant vikning. Det kan anges som b [j + 1] = c [j + 1];
I stället kan det ändras enligt följande.
n = j +1;
b [n] = c [n];
Det kan vara slingor enligt följande.
för (j = 0; j<5; j++)
printf ( ”\ n”);
för (j = 0; j <5; j++)
printf ( ”b \ n”);
Skriva ut a och b, båda har samma antal iterationer. Båda kan kombineras till en för slinga enligt följande.
för (j = 0; j <5; j++)
printf ("a \ n");
printf ( ”b \ n”);
En annan viktig teknik är Vanlig subuttryck eliminering. Det är att ersätta de identiska uttrycken med en enda variabel för att göra beräkningen. Se bellow-koden.
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 är inte nödvändigt att beräkna b * c om och om igen. Det multiplicerade värdet kan lagras i en variabel och återanvändas.
Maskinberoende mot Maskinoberoende Kodoptimering | |
Maskinberoende kodoptimering tillämpas på objektkod. | Maskinoberoende kodoptimering tillämpas på mellankod. |
Inblandning med maskinvara | |
Maskinberoende optimering innefattar CPU-register och absoluta minnesreferenser. | Maskinoberoende kodoptimering involverar inte CPU-register eller absoluta minnesreferenser. |
Kodoptimering består av två optimeringstekniker, nämligen maskinberoende och maskinoberoende kodoptimering. Skillnaden mellan maskinberoende och maskinoberoende kodoptimering är att den maskinberoende optimeringen appliceras på objektkoden medan maskinoberoende kodoptimering tillämpas på mellankod.
Du kan hämta PDF-versionen av den här artikeln och använda den för offlineändamål enligt citationsnotat. Var god ladda ner PDF-versionen här Skillnaden mellan maskinberoende och maskinfri kodoptimering
1. "Compiler Design | Kodoptimering. "GeeksforGeeks. Tillgänglig här
2.Point, handledning. "Kompilatordesign - Kodoptimering." Www.tutorialspoint.com, Tutorials Point, 15 aug 2017. Tillgänglig här
3.Estudies4you. "JNTUH CSE-studiematerial". Skillnaden mellan maskinberoende och oberoende kodoptimering. Tillgänglig här
1.'Compiler 'Genom jag Surachit, (CC BY-SA 3.0) via Commons Wikimedia