Diferență cheie – Optimizarea codului dependentă de mașină versus independentă de mașină
Programele de calculator sunt seturi de instrucțiuni date hardware-ului pentru a efectua sarcini. Aceste programe sunt scrise în mare parte în limbi de nivel în alt, iar computerul nu înțelege limbajul respectiv. Prin urmare, un compilator este folosit pentru a converti acele instrucțiuni în cod mașină sau cod țintă. Trece prin mai multe faze pentru a construi codul țintă. Optimizarea codului este una dintre ele. Există două tehnici de optimizare, cum ar fi optimizarea codului dependentă de mașină și cea independentă de mașină. Diferența cheie între optimizarea codului dependent de mașină și cea independentă de mașină este că optimizarea dependentă de mașină este aplicată codului obiect, în timp ce optimizarea codului independent de mașină este aplicată codului intermediar.
Ce este optimizarea codului dependent de mașină?
La conversia codului sursă în cod obiect sau cod țintă, compilatorul trece prin mai multe faze. În primul rând, codul sursă este dat analizorului lexical care produce jetoane. Apoi, rezultatul este dat analizorului de sintaxă care investighează dacă tokenurile generate sunt în ordine logică. Acea ieșire este dată analizorului semantic. Să presupunem că există o bucată de cod ca p=q + r;
Aici, p, q sunt numere întregi, dar r este un flotant. Folosind analizorul semantic, variabila c întreg este convertită într-un float. Prin urmare, face analiza semantică. Ieșirea analizorului semantic ajunge la generatorul de cod intermediar. Returnează un cod intermediar care merge apoi la optimizatorul de cod. Optimizarea codului este procesul de eliminare a instrucțiunilor de program neesențiale fără a schimba sensul codului sursă real. Nu este o optimizare obligatorie, dar poate îmbunătăți timpul de rulare a codului țintă. Ieșirea optimizatorului de cod este dată generatorului de cod și, în final, codul țintă este construit.
Figura 01: fazele compilatorului
În optimizarea codului dependent de mașină, optimizarea se aplică codului sursă. Alocarea unei cantități suficiente de resurse poate îmbunătăți execuția programului în această optimizare.
Ce este optimizarea codului independent de mașină?
Când optimizarea se face pe codul intermediar, se numește optimizarea codului independent de mașină. Există diferite tehnici pentru a realiza optimizarea codului independent de mașină. Acestea sunt descrise folosind următoarele exemple.
Citiți rândurile de cod de mai jos.
pentru (j=0; j<10; j ++) {
b=x+2;
a[j]=5 j;
}
Conform codului de mai sus, b=x+2 este calculat din nou și din nou în fiecare iterație. Odată ce b este calculat, acesta nu se modifică. Deci, această linie poate fi plasată în afara buclei, după cum urmează.
b=x+2;
pentru (j=0; j< 10; j++)
{a[j]=5j;
}
Aceasta se numește mișcare de cod.
Citiți rândurile de cod de mai jos.
j=5;
dacă (j==10) {
a=b+20;
}
Conform codului de mai sus, „if block” nu se va executa niciodată deoarece valoarea j nu va fi niciodată egală cu 10. Este deja inițializată la valoarea 5. Prin urmare, acest bloc if poate fi eliminat. Această tehnică este eliminarea codului mort.
O altă metodă este reducerea forței. Operațiile aritmetice precum înmulțirea necesită mai multă memorie, timp și cicluri CPU. Aceste expresii scumpe pot fi înlocuite cu expresii ieftine precum b=a2; sau poate fi înlocuit cu adăugare, b=a + a;
Consultați codul de mai jos.
pentru (j=1; j <=5; j ++) {
valoare=j5;
}
În locul înmulțirii, codul poate fi schimbat după cum urmează.
int temp=5;
pentru (j=1; j<=5; j++) {
temp=temperatură + 5;
valoare=temp;
}
Este posibil să se evalueze expresiile care sunt constante în timpul rulării. Se numește pliere constantă. Se pot afirma ca b[j+1]=c [j+1];
În schimb, poate fi schimbat după cum urmează.
n=j +1;
b[n]=c[n];
Pot exista bucle după cum urmează.
pentru (j=0; j<5; j++) {
printf(„a\n”);
}
pentru (j=0; j <5; j++) {
printf(„b\n”);
}
Tipărirea a și b, ambele au același număr de iterații. Ambele pot fi combinate într-o buclă for, după cum urmează.
pentru (j=0; j <5; j++) {
printf(„a \n”);
printf(„b\n”);
}
O altă tehnică importantă este eliminarea subexpresiei comune. Este să înlocuiți expresiile identice cu o singură variabilă pentru a face calculul. Consultați codul de mai jos.
a=bc + k;
d=b c + m;
Acest cod poate fi convertit după cum urmează.
temp=bc;
a=temp + k;
d=temp + m;
Nu este necesar să calculați bc din nou și din nou. Valoarea înmulțită poate fi stocată într-o variabilă și reutilizată.
Care este asemănarea dintre optimizarea codului dependentă de mașină și cea independentă de mașină?
Ambele aparțin Optimizării codului
Care este diferența dintre optimizarea codului dependentă de mașină și cea independentă de mașină?
Optimizarea codului dependentă de mașină vs. independentă de mașină |
|
Optimizarea codului dependent de mașină este aplicată codului obiect. | Optimizarea codului independent de mașină este aplicată codului intermediar. |
Implicarea cu hardware-ul | |
Optimizarea dependentă de mașină implică registre CPU și referințe absolute de memorie. | Optimizarea codului independent de mașină nu implică registre CPU sau referințe absolute de memorie. |
Rezumat – Optimizarea codului dependentă de mașină versus cea independentă de mașină
Optimizarea codului constă în două tehnici de optimizare și anume, optimizarea codului dependentă de mașină și independentă de mașină. Diferența dintre optimizarea codului dependentă de mașină și cea independentă de mașină este că optimizarea dependentă de mașină se aplică codului obiect, în timp ce optimizarea codului independent de mașină este aplicată codului intermediar.
Descărcați versiunea PDF a Optimizării codului dependent de mașină și independentă de mașină
Puteți descărca versiunea PDF a acestui articol și o puteți utiliza în scopuri offline, conform nota de citare. Vă rugăm să descărcați versiunea PDF aici Diferența dintre optimizarea codului dependentă de mașină și cea independentă de mașină