Metody realizacji języków programowania/MRJP Wykład 8: Różnice pomiędzy wersjami
Linia 1: | Linia 1: | ||
= Wprowadzenie = | = Wprowadzenie = | ||
= | = Podstawowe przekształcenia poprawiające kod = | ||
== Eliminacja wspólnych podwyrażeń == | == Eliminacja wspólnych podwyrażeń == | ||
Linia 68: | Linia 67: | ||
W wyniku propagacji stałych instrukcja definiująca stałą staje się martwym kodem, | W wyniku propagacji stałych instrukcja definiująca stałą staje się martwym kodem, | ||
który można usunąć w trakcie eliminacji martwego kodu. | który można usunąć w trakcie eliminacji martwego kodu. | ||
= Optymalizacja pętli = |
Wersja z 17:27, 14 lip 2006
Wprowadzenie
Podstawowe przekształcenia poprawiające kod
Eliminacja wspólnych podwyrażeń
Wyrażenie postaci jest nazywane wspólnym podwyrażeniem jeśli występuje ono w kilku miejscach oraz wartości zmiennych i użytych w kolejnych wystąpieniach nie zmieniły się po poprzednim obliczeniu . W takiej sytuacji można zastąpić kolejne wystąpienia przez wartość wyliczoną za pierwszym razem.
Przykład:
a=4*i b=4*i c=a+b
Drugie wyliczenie można zastąpić przez . Przekształcony blok:
a=4*i b=a c=a+b
Eliminację wspólnych podwyrażeń można stosować
- lokalnie - gdy przeszukujemy jeden blok bazowy,
- globalnie - dla całego grafu przepływu (trudniejsze z powodu pętli).
Usuwanie martwego kodu
Zmienną nazywamy żywą w danym miejscu programu, jeżeli jej wartość może zostać użyta. W pozostałych przypadkach nazywamy zmienną martwą w tym miejscu. Analogicznie definiujemy kod martwy, tzn. taki który oblicza wartości bezużyteczne. Na przykład wyliczenie wartości dla zmiennej martwej lub instrukcja postaci
if (false) ...
to kod martwy.
W oczywisty sposób kod martwy usuwamy.
Często kod martwy powstaje po propagacji kopii lub po zwijaniu stałych.
Zwijanie stałych
Jest to proces upraszczania wyrażeń stałych. Przykład:
x = 30 * 2
można zastąpić przez
x = 60
Zwijanie stałych czasem wykonuje się na wcześniejszych etapach kompilacji.
Propagacja stałych
Jest to proces zastępowania wystąpień stałych przez ich wartości. Przykład
x = 60 y = 3 * x
można zastąpić przez
x = 60 y = 3 * 60
i dalej po zwinięciu wartości w drugim przypisaniu otrzymamy
x = 60 y = 180
W wyniku propagacji stałych instrukcja definiująca stałą staje się martwym kodem, który można usunąć w trakcie eliminacji martwego kodu.