Metody realizacji języków programowania/MRJP Wykład 8: Różnice pomiędzy wersjami
Linia 47: | Linia 47: | ||
Zwijanie stałych czasem wykonuje się na wcześniejszych etapach kompilacji. | 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. |
Wersja z 17:25, 14 lip 2006
Wprowadzenie
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.