Optymalizacja oprogramowania - wprowadzenie Poznaskie Centrum Superkomputerowo Sieciowe
Projekt jest współfinansowany ze rodków Europejskiego Funduszu Rozwoju Regionalnego w ramach Programu Operacyjnego Innowacyjna Gospodarka. Instytucj Zarzdzajc Programu Operacyjnego Innowacyjna Gospodarka jest Ministerstwo Rozwoju Regionalnego. Instytucj Poredniczc w realizacji priorytetu 2. Infrastruktura sfery B+R jest Ministerstwo Nauki i Szkolnictwa Wyszego.
literatura podstawowa [Aho2002] Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman, Kompilatory. Reguły, metody i narzdzia, WNT 2002 (tłum. pierwszego wydania amerykaskiego, 1986). [Aho2001] A.V. Aho, R. Sethi, J.D. Ullman, Compilers: Principles, Techniques, and Tools, Pearson Education 2001. 3
literatura uzupełniajca [Bentley2000] Jon Bentley, Perełki oprogramowania, wyd. trzecie, WNT, 2008 (tłum. drugiego wydania amerykaskiego, Pearson Education 2000). [Bentley2007] Jon Bentley, Wicej perełek oprogramowania. Wyznania programisty, WNT 2007 (tłum. pierwszego wydania amerykaskiego, Pearson Education 1988) 4
literatura uzupełniajca [Kernigham2002] Brian W. Kernigham, Rob Pike, Lekcja programowania, WNT 2002, (tłum. pierwszego wydania amerykaskiego, Pearson Education 1999). [Oram2008] Andy Oram, Greg Wilson (red.), Pikny kod. Tajemnice mistrzów programowania, Helion 2008, (tłum. wydania amerykaskiego, O Reilly Media Inc. 2007). 5
literatura uzupełniajca [Barr2005] Adam Barr, Znajd błd. Sztuka analizowania kodu, Helion 2005 (tłum. wydania amerykaskiego, Pearson Education 2005). 6
Plan wprowadzenie (typowa kompilacja) podstawowe ródła optymalizacji optymalizacja bloków bazowych ptle w grafach przepływu globalna analiza przepływu danych iteracyjne rozwizywanie równa przepływu danych 7
Plan przekształcenia poprawiajce kod obsługa synonimów analiza przepływu danych w strukturalnych grafach przepływu efektywne algorytmy przepływu danych narzdzia do analizy przepływu danych wykrywanie typów 8
Plan symboliczny program uruchomieniowy dla zoptymalizowanego kodu uwagi bibliograficzne 9
kompilator czyta kod w jzyku ródłowym i tłumaczy na kod w jzyku wynikowym [Aho2002] 10
typowa kompilacja [Aho2002] 11
typowa kompilacja program ródłowy w oddzielnych plikach jest składany w cało przez preprocesor, kompilator tworzy kod wynikowy w j. asemblera, tłumaczony nastpnie przez asembler na kod maszynowy i łczony z funkcjami bibliotecznymi 12
typowa kompilacja [Aho2002] 13
fazy kompilatora [Aho2002] 14
fazy kompilatora analiza programu ródłowego generacja kodu poredniego optymalizacja kodu generacja kodu 15
analiza programu ródłowego obejmuje trzy fazy: analiz leksykaln (liniow, skanowanie): strumie znaków grupowany w symbole leksykalne (cigi znaków majce znaczenie) analiz składniow (hierarchiczna, syntaktyczna): symbole leksykalne grupowane w wyraenia gramatyczne (drzewa wyprowadzenia) analiz semantyczn: testy dopasowania składników programu co do znaczenia 16
analiza programu ródłowego analiza programu ródłowego ma na celu wykrycie błdów w programie ródłowym słu do tego pierwsze trzy fazy kompilatora, wymienione przed chwil po analizie programu ródłowego, nastpuje zazwyczaj faza generacji kodu poredniego 17
translacja instrukcji (1) [Aho2002] 18
generacja kodu poredniego kod poredni jest to reprezentacja porednia kodu ródłowego, widziana jako program dla pewnej maszyny abstrakcyjnej reprezentacj t daje si łatwo utworzy i przetłumaczy na program wynikowy 19
generacja kodu poredniego najprostszy algorytm generuje kod poredni, stosujc jeden rozkaz na kady operator w drzewie składniowym [Aho2002] 20
generacja kodu poredniego kod poredni moe mie posta kodu trójadresowego kod trójadresowy to sekwencja rozkazów, z których kady ma co najwyej trzy argumenty 21
generacja kodu poredniego własnoci kodu trójadresowego: kady rozkaz oprócz przypisania moe mie co najwyej jeden operator, dlatego kompilator musi ustali kolejno operacji kompilator musi wygenerowa tymczasowe identyfikatory do zapisu wartoci porednich rozkaz moe mie mniej ni trzy argumenty 22
generacja kodu poredniego przykład kodu trójadresowego [Aho2002]: 23
optymalizacja kodu w fazie tej poprawiamy kod poredni aby stworzy działajcy szybciej kod maszynowy stosuje si tu dwie zasady: konwersja z wartoci całkowitej liczby (np. 60) do rzeczywistej jest wykonana jednorazowo w czasie kompilacji zmienna uywana jednokrotnie w przypisaniu (np. temp3) moe by usunita 24
optymalizacja kodu [Aho2002] z postaci: na posta: 25
optymalizacja kodu w metodach optymalizacji kodu s due rónice w kompilatorach optymalizujcych, znaczna cz czasu kompilacji powicona jest optymalizacji kodu istniej jednak proste metody optymalizacji, niewiele wydłuajce czas optymalizacji 26
generacja kodu ostatni faz kompilacji jest generacja kodu jest to przemieszczalny kod maszynowy albo kod asemblera 27
generacja kodu [Aho2002] z postaci: na posta: 28
generacja kodu w rozkazach tych wystpuj dwa rejestry R1 i R2 pierwszy argument tych rozkazów to ródło, a drugi to przeznaczenie F w nazwie rozkazu oznacza operacje na wartociach zmiennopozycyjnych znak # oznacza, e 60.0 to stała 29
translacja instrukcji (2) [Aho2002] 30
optymalizacja kodu byłoby idealnie, gdyby kompilator wytwarzał kod wynikowy tak dobry, jakby był pisany rcznie ale tak nie jest, kompilator moe jedynie optymalizowa kod w trzech kierunkach: aby działał on szybciej, albo aby zajmował mniej miejsca, albo jedno i drugie 31
optymalizacja kodu kompilatory optymalizujce = poprawiajce kod optymalizacje niezalene od maszyny (nie uwzgldniajce właciwoci maszyny docelowej), na tym si koncentrujemy 32
optymalizacja kodu optymalizacje zalene od maszyny (uwzgldniajce właciwoci maszyny docelowej), to np. alokacja rejestrów i stosowanie specjalnych sekwencji instrukcji maszyny tym zajmiemy si póniej 33
optymalizacja kodu maksymalny efekt uzyskuje si, gdy poprawia si efektywno czsto wykonywanych fragmentów programu czsto zachodzi sytuacja, e mały fragment programu jest odpowiedzialny za istotn cz czasu wykonania programu takie fragmenty naley zidentyfikowa 34
optymalizacja kodu nie jest to trywialne zadanie, kompilator musi to odgadn (nie majc dostpu do przykładowych danych i programu profilujcego) dobrym fragmentem do poprawienia jest wewntrzna ptla w programie, mona j rozpozna po składni programu albo w wyniku analizy przepływu sterowania 35
optymalizacja kodu aby stworzy wydajny program wynikowy, musi istnie współpraca programisty i autora kompilatora opiszemy teraz przekształcenia kodu, poprawiajce wydajno programu obowizuje zasada: najwiksze zyski najmniejszym kosztem 36
kryteria stosowania przekształce poprawiajcych kod cechy przekształce obsługiwanych przez kompilator optymalizujcy: przekształcenie powinno zachowa znaczenie programu przekształcenie powinno przyspiesza program przekształcenie musi si opłaca 37
zachowanie znaczenia programu przekształcenie nie moe zmienia wyjcia programu dla danego wejcia przekształcenie nie moe wprowadza błdu, tam gdzie go nie było - np. dzielenia przez zero zawsze preferowany jest wybór bezpiecznego podejcia 38
przyspieszenie programu dla redniego przypadku nastpuje wymierne przyspieszenie zmniejszenie objtoci generowanego kodu nie dla kadych danych jest przyspieszenie, moe te wystpi spowolnienie 39
opłacalno nie ma sensu poprawianie kodu, jeeli wysiłek ten nie jest doceniony podczas wykonywania programu wynikowego nie ma sensu poprawianie kodu, jeeli dany program zostanie uruchomiony jedynie kilka razy 40