Programy komputerowe to zestawy instrukcji przekazywanych sprzętowi w celu wykonywania zadań. Programy te są pisane głównie w językach wysokiego poziomu, a komputer nie rozumie tego języka. Dlatego kompilator służy do konwertowania tych instrukcji na kod maszynowy lub kod docelowy. Przechodzi przez kilka faz, aby zbudować kod docelowy. Jednym z nich jest optymalizacja kodu. Istnieją dwie techniki optymalizacji, takie jak optymalizacja kodu zależna od maszyny i niezależna od maszyny. The kluczowa różnica optymalizacja kodu zależna od maszyny i niezależna od maszyny polega na tym, że optymalizacja zależna od maszyny jest stosowana do kodu obiektowego, natomiast optymalizacja kodu niezależnego od maszyny jest stosowana do kodu pośredniego.
1. Przegląd i kluczowa różnica
2. Co to jest optymalizacja kodu zależnego od maszyny
3. Co to jest optymalizacja kodu niezależnego od maszyny
4. Podobieństwa między optymalizacją kodu zależną od maszyny a niezależną od maszyny
5. Porównanie obok siebie - Optymalizacja kodu zależna od maszyny a niezależna od maszyny w formie tabelarycznej
6. Podsumowanie
Podczas konwertowania kodu źródłowego na kod obiektowy lub kod docelowy kompilator przechodzi przez kilka faz. Po pierwsze, kod źródłowy jest przekazywany analizatorowi leksykalnemu, który produkuje tokeny. Następnie dane wyjściowe są przekazywane do analizatora składni, który sprawdza, czy wygenerowane tokeny są w logicznej kolejności. Dane wyjściowe są przekazywane analizatorowi semantycznemu. Załóżmy, że istnieje fragment kodu jako p = q + r;
Tutaj p, q są liczbami całkowitymi, ale r jest liczbą zmiennoprzecinkową. Za pomocą analizatora semantycznego zmienną całkowitą c przekształca się w liczbę zmiennoprzecinkową. Dlatego wykonuje analizę semantyczną. Dane wyjściowe analizatora semantycznego trafiają do generatora kodu pośredniego. Zwraca kod pośredni, który następnie przechodzi do optymalizatora kodu. Optymalizacja kodu to proces eliminacji nieistotnych instrukcji programu bez zmiany znaczenia rzeczywistego kodu źródłowego. Nie jest to obowiązkowa optymalizacja, ale może poprawić czas działania kodu docelowego. Dane wyjściowe optymalizatora kodu są przekazywane do generatora kodu, a na końcu budowany jest kod docelowy.
Rysunek 01: Fazy kompilatora
W optymalizacji kodu zależnej od maszyny optymalizacja jest stosowana do kodu źródłowego. Przydzielenie wystarczającej ilości zasobów może poprawić wykonanie programu w ramach tej optymalizacji.
Po przeprowadzeniu optymalizacji kodu pośredniego nazywa się to optymalizacją kodu niezależnego od maszyny. Istnieją różne techniki optymalizacji kodu niezależnego od maszyny. Są one opisane za pomocą następujących przykładów.
Przeczytaj poniższe wiersze kodu.
dla (j = 0; j<10; j ++)
b = x + 2;
a [j] = 5 * j;
Zgodnie z powyższym kodem, b = x + 2 jest obliczane wielokrotnie w każdej iteracji. Po obliczeniu b nie zmienia się. Tak więc tę linię można umieścić poza pętlą w następujący sposób.
b = x + 2;
dla (j = 0; j< 10; j++)
a [j] = 5 * j;
Nazywa się to ruchem kodu.
Przeczytaj poniższe wiersze kodu.
j = 5;
jeśli (j == 10)
a = b + 20;
Zgodnie z powyższym kodem „if block” nigdy się nie uruchomi, ponieważ wartość j nigdy nie będzie równa 10. Jest on już inicjalizowany na wartość 5. Dlatego też, jeśli blok można usunąć. Ta technika eliminuje martwy kod.
Inną metodą jest redukcja siły. Operacje arytmetyczne, takie jak mnożenie, wymagają więcej pamięci, czasu i cykli procesora. Te drogie wyrażenia można zastąpić tanimi wyrażeniami, takimi jak b = a * 2; lub może być zastąpiony przez dodanie, b = a + a;
Zobacz poniższy kod.
dla (j = 1; j <= 5; j ++)
wartość = j * 5;
Zamiast mnożenia kod można zmienić w następujący sposób.
int temp = 5;
dla (j = 1; j<=5; j++)
temp = temp + 5;
wartość = temp;
Można ocenić wyrażenia, które są stałymi w czasie wykonywania. To się nazywa ciągłe składanie. Można podać takie jak b [j + 1] = c [j + 1];
Zamiast tego można to zmienić w następujący sposób.
n = j +1;
b [n] = c [n];
Mogą być pętle w następujący sposób.
dla (j = 0; j<5; j++)
printf („a \ n”);
dla (j = 0; j <5; j++)
printf („b \ n”);
W przypadku drukowania aib oba mają taką samą liczbę iteracji. Oba można połączyć w jeden dla pętli w następujący sposób.
dla (j = 0; j <5; j++)
printf („a \ n”);
printf („b \ n”);
Inną ważną techniką jest Wspólna eliminacja podwyrażeń. Jest to zastąpienie identycznych wyrażeń jedną zmienną w celu wykonania obliczeń. Zobacz poniższy kod.
a = b * c + k;
d = b * c + m;
Ten kod można przekonwertować w następujący sposób.
temp = b * c;
a = temp + k;
d = temp + m;
Obliczanie b * c wielokrotnie nie jest wymagane. Pomnożoną wartość można zapisać w zmiennej i wykorzystać ponownie.
Optymalizacja kodu zależna od maszyny a niezależna od maszyny | |
Optymalizacja kodu zależna od maszyny jest stosowana do kodu obiektowego. | Niezależna od maszyny optymalizacja kodu jest stosowana do kodu pośredniego. |
Zaangażowanie w sprzęt | |
Optymalizacja zależna od maszyny obejmuje rejestry procesora i absolutne odniesienia do pamięci. | Optymalizacja kodu niezależna od maszyny nie obejmuje rejestrów procesora ani absolutnych odniesień do pamięci. |
Optymalizacja kodu składa się z dwóch technik optymalizacji, a mianowicie optymalizacji kodu zależnej od maszyny i niezależnej od maszyny. Różnica między optymalizacją kodu zależnego od maszyny i niezależnego od maszyny polega na tym, że optymalizacja zależna od maszyny jest stosowana do kodu obiektowego, natomiast optymalizacja kodu niezależnego od maszyny jest stosowana do kodu pośredniego.
Możesz pobrać wersję PDF tego artykułu i używać go do celów offline zgodnie z cytatem. Pobierz wersję PDF tutaj Różnica między optymalizacją kodu zależnego od maszyny a niezależnym kodem maszyny
1. „Projekt kompilatora | Optymalizacja kodu ”. GeeksforGeeks. Dostępny tutaj
2.Punkt, samouczki. „Projekt kompilatora - optymalizacja kodu”. Www.tutorialspoint.com, Tutorials Point, 15 sierpnia 2017. Dostępny tutaj
3.Estudies4you. „Materiał do nauki JNTUH CSE.” Różnica między optymalizacją zależną od maszyny a niezależną optymalizacją kodu. Dostępny tutaj
1. „Kompilator” Autor: I, Surachit (CC BY-SA 3.0) przez Commons Wikimedia