Wprowadzenie do kompilatorów Czy ja kiedykolwiek napisz jaki kompilator? Jakie zadania ma do wykonania kompilator? Czy jzyk formalny to rodzaj jzyka programowania? Co to jest UML?, Czy ja kiedykolwiek napisz jaki kompilator? PRAWDOPODOBNIE NIE! Ale Dua cz oprogramowania wykorzystuje wiele elementów teorii kompilacji, np.: gramatyki regularne uywane s do wyszukiwania tekstu; automaty skoczone s powszechnie wykorzystywane podczas projektowania oprogramowania; jzyki formalne mog by uyte do opisu danych wprowadzanych przez uytkownika. Kompilator jest dobrym przykładem duego systemu oprogramowania. Techniki stosowane do konstrukcji kompilatorów stosowane s te podczas konstrukcji innych systemów. W prowadzenie do kompilatorów 1
Jakie zadania ma do wykonania kompilator? Kod ródłowy? Kod wynikowy Komunikaty o błdach Kompilator przetwarza kod zapisany w jzyku ródłowym na kod zapisany w jzyku wynikowym zgłaszajc odpowiednie komunikaty. Dla uytkownika kompilator stanowi czarn skrzynk działajc w sposób automatyczny. Niniejszy wykład ma za zadanie pokaza, jak ta skrzynka wyglda od rodka (jak zbudowa tak skrzynk). Z kim komunikuje si kompilator? Kompilator przyjmuje od jakiej Aplikacji komunikaty wykonania kompilacji (). Aplikacja Okienka Kompilator wysyła do Okienek polecenia pokazania komunikatu (Komunikaty). Komunikaty Komunikaty Kompilator wysyła do SystemuPlików polecenia pobrania z pliku kodu ródłowego (Wejcie). Kompilator Wejcie Wyjcie Kompilator wysyła do SystemuPlików polecenia zapisania do pliku kodu wynikowego (Wyjcie). Wejcie SystemPlików Wyjcie W prowadzenie do kompilatorów 2
Jak si zachowuje kompilator? Kompilator dostaje od Aplikacji komunikat z daniem dokonania translacji. Kompilator wykonuje translacj współpracujc z SystememPlików i Okienkami. Aplikacja 1: transluj(nazwa_pliku) 2: kom_rozpoczcia() 3: otwórz(nazwa_pliku) 5: pobierz_znaki(): char 6: zamknij() Kompilator 4: kom_postpu() 10: kom_zakoczenia() 7: otwórz(nazwa_pliku) 8: zapisz_kod(warto) 9: zamknij() Okienka System Plików Z czego si składa kompilator? słuy do wstpnego przygotowania tekstu ródłowego. słuy do analizy kodu ródłowego. Generator słuy do generacji kodu wynikowego. Czego brakuje: obsługa błdów. Komunikaty Kompilator Generator PobieranieZnaków GeneracjaKodu Wejcie Wyjcie W prowadzenie do kompilatorów 3
Jak działa kompilator? (sterowanie) zarzdza kompilacj dokonujc analizy kodu ródłowego. Tekst ródłowy pobiera z a, który go wstpnie przygotowuje. Dane do generacji kodu przekazywane s Generatorowi, który na podstawie tych danych generuje kod. 1: transluj(nazwa_pliku) 2: pobierz_znak() 5: wstaw_wzeł(wzeł) Generator 3: pobierz_znak() 5:zapisz_kod(warto) :byte System Plików Jak działa kompilator? (przepływ danych) odczytuje znaki z rónych plików i przekształca w jeden cigły strumie znaków. odczytuje znaki ze strumienia znaków i sprawdza zgodno z jzykiem. w odpowiednich momentach podczas analizy tworzy wzły dla generatora. Generator otrzymuje wzły i wstawia je w odpowiednie struktury danych. Po zbudowaniu odpowiednich struktur, generator tworzy cig wartoci i wstawia je do plików. :byte Generator W prowadzenie do kompilatorów 4
Jakie struktury danych wystpuj w kompilatorze? cig znaków cig leksemów (symboli leksykalnych) i tablica symboli drzewo wzłów Tablica symboli + wstaw_symbol() + podaj_symbol() 0..* Symbol - typ: int - id: int - nazwa: String Wzeł +lewy 1 - atrubut: 1 Leksem - typ: int - warto: +prawy 1 Kompilator:: Kompilator:: :Tablica symboli Kompilator::Generator Jak wyglda przykładowa translacja? drugi.c x:=i+1; pierwszy.c i:=1; #include<drugi.c> b:=a(x); i typ= kon_instr : = 1 ; typ=liczba warto=1,0 typ=podst x : = i typ=ident warto=23 + typ=ident warto=23 W prowadzenie do kompilatorów 5
Czy jzyk formalny to taki rodzaj jzyka programowania? OCZYWICIE, NIE! Jzyk formalny (gramatyka formalna) to sposób zapisu struktury programu (składni jzyka ródłowego) uywany m.in. podczas konstrukcji analizatorów. Gramatyki regularne Gramatyki bezkontekstowe leksykalny Składniowy Jak projektowa kompilatory? Diagramy z poprzednich slajdów pokazuj struktur kompilatora w formie współpracujcych ze sob komponentów. Kady komponent moe stanowi klas w rozumieniu obiektowym. Kompilator jest jednym z przykładów aplikacji, które mona zbudowa (zanalizowa i zaprojektowa) w sposób obiektowy. Projektowanie kompilatora powinno odbywa si w sposób graficzny. Graficznym jzykiem do analizy i projektowania systemów jest UML. UML jest w tej chwili standardem modelowania obiektowego. W prowadzenie do kompilatorów 6
Jak wyglda jzyk UML? Podstawowym elementem jest klasa. gra :Aplikacja : :SystemPlików :Komunikaty Komponenty to te klasy. transluj() transluj() kom_rozpoczcia() Komponenty i klasy mog posiada interfejsy. kom_zakoczenia() Obiekty klas wystpuj na diagramach pokazujcych dynamik. Leksem a :SystemPlików - typ: int - warto: b Kompilator:: Co dalej? Jak zaprojektowa kompilator? Diagramy klas podstawowe składniki programu kompilatora Diagramy sekwencji opis dynamiki działania kompilatora Jak działa preprocesor? Jak działa analizator? Gramatyki regularne opis struktury pojedynczych symboli leksykalny komponent łczcy znaki w symbole Gramatyki bezkontekstowe opis struktury jzyka składniowy komponent sprawdzajcy poprawno kodu y LL analiza zstpujca y LR analiza wstpujca Jak generowa kod? W prowadzenie do kompilatorów 7