Metody Kompilacji Wykład 1 Wstęp

Podobne dokumenty
Translacja wprowadzenie

Plan wykładu. Kompilatory. Literatura. Translatory. Literatura Translatory. Paweł J. Matuszyk

KONSTRUKCJA KOMPILATORÓW

Matematyczne Podstawy Informatyki

Metody Kompilacji Wykład 3

Programowanie komputerów

Analiza leksykalna 1. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Optymalizacja oprogramowania - wprowadzenie

Analiza leksykalna 1. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki

SYLABUS DOTYCZY CYKLU KSZTAŁCENIA Bieżący sylabus w semestrze zimowym roku 2016/17

Ryszard Myhan. Wykład 1: Języki programowania

Metody Kompilacji Wykład 8 Analiza Syntaktyczna cd. Włodzimierz Bielecki WI ZUT

Program We Kompilator Wy Źródłowy

Analiza leksykalna i generator LEX

INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE

Wprowadzenie do analizy składniowej. Bartosz Bogacki.

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Przyczyny dwustopniowego tłumaczenia

Generator YACC: gramatyki niejednoznaczne

Podstawy Informatyki Języki programowania c.d.

Zadanie analizy leksykalnej

Metody Kompilacji Wykład 7 Analiza Syntaktyczna

Wprowadzenie do kompilatorów

Java EE produkcja oprogramowania

Podstawy programowania

Włączenie analizy leksykalnej do analizy składniowej jest nietrudne; po co więc jest wydzielona?

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

Gramatyki atrybutywne

10. Translacja sterowana składnią i YACC

Metody Kompilacji Wykład 13

Języki i metodyka programowania

Programowanie w języku C++ Grażyna Koba

Podstawy generatora YACC. Bartosz Bogacki.

Generatory analizatorów

Sprzęt komputera - zespół układów wykonujących programy wprowadzone do pamięci komputera (ang. hardware) Oprogramowanie komputera - zespół programów

Wprowadzenie. Wojciech Complak

Analiza semantyczna. Gramatyka atrybutywna

Uproszczony schemat działania kompilatora

Wprowadzenie. Organizacja pracy i środowisko programistyczne. Mirosław Ochodek

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Uproszczony schemat działania kompilatora

Języki programowania zasady ich tworzenia

Podstawy Kompilatorów

Wprowadzenie: języki, symbole, alfabety, łańcuchy Języki formalne i automaty. Literatura

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

TRANSLACJA I TRANSLATORY

Semantyka i Weryfikacja Programów - Laboratorium 6

Programowanie niskopoziomowe. dr inż. Paweł Pełczyński

L E X. Generator analizatorów leksykalnych

Podstawy Kompilatorów

Język programowania DELPHI / Andrzej Marciniak. Poznań, Spis treści

Przegląd metod error recovery (dla parsingu top-down, przykłady)

Literatura. adów w cyfrowych. Projektowanie układ. Technika cyfrowa. Technika cyfrowa. Bramki logiczne i przerzutniki.

Wprowadzenie. Teoria automatów i języków formalnych. Literatura (1)

Analizator syntaktyczny

Podstawy i języki programowania

Tworzenie języków specyfikacji dla zagadnień numerycznych

Podstawy programowania skrót z wykładów:

Wstęp do programowania. Wykład 1

Technologie cyfrowe. Artur Kalinowski. Zakład Cząstek i Oddziaływań Fundamentalnych Pasteura 5, pokój 4.15

Podstawy Programowania. Wykład 1

Programowanie. Pascal - język programowania wysokiego poziomu. Klasa 2 Lekcja 9 PASCAL

PROLOG WSTĘP DO INFORMATYKI. Akademia Górniczo-Hutnicza. Wydział Elektrotechniki, Automatyki, Informatyki i Inżynierii Biomedycznej.

Wykład 11. Konstrukcja drzew składniowych

Podstawy programowania - 1

Wykład 10. Translacja sterowana składnią

WYKŁAD. Jednostka prowadząca: Wydział Techniczny. Kierunek studiów: Elektronika i telekomunikacja. Nazwa przedmiotu: Język programowania C++

Obiektowa implementacja parsera klasy LL(1)

Wykład V. Rzut okiem na języki programowania. Studia Podyplomowe INFORMATYKA Podstawy Informatyki

Metodyka i Technika Programowania 1

Paradygmaty i języki programowania. Analiza leksykalna Skaner, RE, DAS, NAS, ε- NAS

Translacja sterowana składnią w metodzie zstępującej

Spis treści. Wprowadzenie 15

Czym jest Java? Rozumiana jako środowisko do uruchamiania programów Platforma software owa

Podstawy programowania. Wykład 1 Wstęp. Krzysztof Banaś Podstawy programowania 1

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Programowanie w języku Python. Grażyna Koba

Zarządzanie pamięcią operacyjną

Logiczny model komputera i działanie procesora. Część 1.

Nazwa wariantu modułu (opcjonalnie): Laboratorium programowania w języku C++

I. KARTA PRZEDMIOTU CEL PRZEDMIOTU WYMAGANIA WSTĘPNE W ZAKRESIE WIEDZY, UMIEJĘTNOŚCI I INNYCH KOMPETENCJI EFEKTY KSZTAŁCENIA

Technologie informacyjne - wykład 12 -

Paradygmaty programowania

Algorytmy od problemu do wyniku

Generator LLgen. Wojciech Complak Generator LLgen - charakterystyka. Generator LLgen -składnia specyfikacji

Podstawy programowania.

3. Podaj elementy składowe jakie powinna uwzględniać definicja informatyki.

Generator YACC: gramatyki niejednoznaczne

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 25 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 38

ForPascal Interpreter języka Pascal

Wstęp do programowania

KARTA KURSU. Wstęp do programowania

Metody kompilacji Wykłady 4-5

1 Moduł Modbus ASCII/RTU

Translacja sterowana składnią w generatorze YACC

MIKROKONTROLERY I MIKROPROCESORY

Podstawy programowania (1)

1 Podstawy c++ w pigułce.

1.1 Definicja procesu

Transkrypt:

Metody Kompilacji Wykład 1 Wstęp

Literatura: Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman: Compilers: Princiles, Techniques, and Tools. Addison-Wesley 1986, ISBN 0-201-10088-6

Literatura: Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman: Compilers: Princiles, Techniques, and Tools. Addison-Wesley 2007, ISBN 0-321-48681-1

Literatura: Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman: Kompilatory : reguły, metody i narzędzia. Warszawa: WNT, 2002. ISBN 83-204-2656-1.

Literatura: Compilers: Principles, Techniques, and Tools, Aho, Sethi and Ullman http://dragonbook.stanford.edu/ Parsing Techniques, Grune and Jacobs Advanced Compiler Design and Implementation, Muchnik Włodzimierz Bielecki WI ZUT 5

Kompilator Kompilator jest to program, który odczytuje program w języku źródłowym i tłumaczy go na program równoważny w języku docelowym. Dane wejściowe Program źródłowy Kompilator Program docelowy komunikaty o błędach Wyjście Włodzimierz Bielecki WI ZUT 6

Interpretator Program źródłowy Interpretator Wyjście Wejście Interpretator, zamiast produkowania programu docelowego, bezpośrednio wykonuje czynności określone w programie źródłowym. Włodzimierz Bielecki WI ZUT 7

Kompilatory Program docelowy, produkowany przez kompilator, jest zwykle znacznie szybszy niż proces produkowania wyniku przez interpretator. Interpretator, jednak zazwyczaj daje lepszą diagnostykę błędów niż kompilator, ponieważ wykonuje instrukcję programu źródłowego instrukcja po instrukcji. Włodzimierz Bielecki WI ZUT 8

Kompilatory Ważną rolą kompilatora jest zgłaszanie wszelkich błędów w programie źródłowym, które są wykrywane podczas procesu tłumaczenia. Włodzimierz Bielecki WI ZUT 9

Kompilatory Wirtualne procesory języka Java łączą kompilację i interpretację. Program źródłowy w języku Java jest najpierw kompilowany do postaci pośredniej zwanej bajt-kodami (bytecodes). Bajt-kody następnie są interpretowane przez maszynę wirtualną. Włodzimierz Bielecki WI ZUT 10

Kompilator hybrydowy Program wejściowy Translator Błędy Bajt-kody Wejście Maszyna wirtualna Wyjście Włodzimierz Bielecki WI ZUT 11

Kompilatory Oprócz kompilatora, kilka innych programów może być wymagane, aby utworzyć wykonywalny program docelowy. Włodzimierz Bielecki WI ZUT 12

Kompilatory Program źródłowy Program źródłowy Preprocesor Program w asemblerze Kod obiektowy Kompilator Asembler Program łączący gcc -v myprog.c Biblioteki oraz inne kody obiektowe Włodzimierz Bielecki WI ZUT Kod maszynowy 13

Architektura kompilatora Postać pośrednia Źródło PRZÓD (Analiza) TYŁ (Synteza) Program docelowy Włodzimierz Bielecki WI ZUT 14

Architektura kompilatora źródło Analizator tokeny Drzewo Parser leksykalny parsowania Analiza semantyczna Postać pośrednia Tablice symboli Optymalizator (Są wykorzystywane przez wszystkie fazy kompilacji) Generator kodu Włodzimierz Bielecki WI ZUT 15 Program docelowy

Analiza leksykalna Analizator leksykalny czyta znaki z programu źródłowego i grupuje je w sekwencje, które reprezentują leksemy. Dla każdego leksemu, analizator leksykalny produkuje token o postaci: <token-name, attribute-value> Włodzimierz Bielecki WI ZUT 16

Analiza leksykalna Na przykład, załóżmy, że program źródłowy zawiera instrukcję przypisania: position := i n i t i a l + r a t e * 60 Analizator leksykalny produkuje następujący wynik: Włodzimierz Bielecki WI ZUT 17

Analiza leksykalna 1. position jest leksemem, dla którego jest tworzony token: <id, 1> gdzie id jest to symbol abstrakcyjny oznaczający identyfikator; 1 jest adresem, pod którym tablica symboli przechowuje leksem position oraz dodatkowe atrybuty, na przykład typ danych. Włodzimierz Bielecki WI ZUT 18

Analiza leksykalna 2. Symbol przypisania := jest leksemem, dla którego jest produkowany token <:= >. Ponieważ ten token nie wymaga atrybutu, drugi składnik jest pominięty. Włodzimierz Bielecki WI ZUT 19

Analiza leksykalna 3. initial jest leksemem, dla którego jest tworzony token <id, 2>; 2 jest adresem, pod którym tablica symboli przechowuje leksem initial. Włodzimierz Bielecki WI ZUT 20

Analiza leksykalna 4. + jest leksemem, dla którego jest produkowany token < + >. 5. rate jest leksemem, dla którego jest tworzony token <id, 3>, 3 jest adresem, pod którym tablica symboli przechowuje leksem rate. Włodzimierz Bielecki WI ZUT 21

Analiza leksykalna 6. * jest leksemem odwzorowywanym na token < * >. 7. 60 jest leksemem odwzorowywanym na token < 60 >. 60 jest liczbą całkowitą Włodzimierz Bielecki WI ZUT 22

Analiza leksykalna Analizator leksykalny Tokeny Wyżej jest wynik produkowany przez analizator leksykalny dla instrukcji: position:= i n i t i a l + r a t e * 60 Włodzimierz Bielecki WI ZUT 23

Analiza syntaktyczna Parser wykorzystuje pierwsze składniki tokenów, produkowane przez analizator leksykalny, aby utworzyć reprezentację pośrednią, która przedstawia strukturę gramatyczną strumienia tokenów. Włodzimierz Bielecki WI ZUT 24

Analiza syntaktyczna Typową reprezentacją składni jest drzewo syntaktyczne, w którym każdy węzeł wewnętrzny reprezentuje operację, natomiast dzieci węzła stanowią argumenty operacji. W oparciu o utworzone drzewo, parser decyduje czy składnia programu jest poprawna czy nie. Na wyjściu parsera mamy wynik pokazany na następnym slajdzie. Włodzimierz Bielecki WI ZUT 25

Analiza syntaktyczna Analizator leksykalny Tokeny Analizator syntaktyczny Drzewo parsowania Włodzimierz Bielecki WI ZUT 26

Analiza semantyczna Analizator semantyczny korzysta z drzewa parsowania, wykorzystuje informacje przechowywane w tablicy symboli i sprawdza program źródłowy pod względem spójności semantycznej, zdefiniowanej przez język programowania. Włodzimierz Bielecki WI ZUT 27

Analiza semantyczna Ponadto gromadzi informacje o typach zmiennych i zapisuje je w drzewie parsowania lub tablicy symboli do wykorzystania podczas kolejnych etapów generacji kodu pośredniego. Włodzimierz Bielecki WI ZUT 28

Analiza semantyczna Ważną częścią analizy semantycznej jest kontrola typów, kompilator sprawdza czy każdy operator ma dopasowane argumenty. Na przykład, wiele języków programowania wymagają, żeby indeksy tablicy były liczbami całkowitymi; kompilator musi zgłosić błąd, jeśli liczba zmiennoprzecinkowa jest używana do reprezentacji indeksu tablicy. Włodzimierz Bielecki WI ZUT 29

Analiza semantyczna Specyfikacja języka może pozwolić na konwersję typów, znaną jako wymuszenie (coercion). Na przykład, operator arytmetyczny może być zastosowany do pary liczb całkowitych lub pary liczb zmiennoprzecinkowych. Włodzimierz Bielecki WI ZUT 30

Analiza semantyczna Jeśli operandy nie należą do tego samego typu danych, to jeden z nich może być konwertowany do typu drugiego operandu. Na rysunku na następnym slajdzie, operator inttoreal konwertuje liczbę całkowitą na liczbę zmiennoprzecinkową. Włodzimierz Bielecki WI ZUT 31

Analiza semantyczna Analizator leksykalny Tokeny Analizator syntaktyczny Drzewo parsowania Analizator semantyczny Drzewo parsowania Włodzimierz Bielecki WI ZUT 32

Generacja kodu pośredniego W procesie tłumaczenia programu źródłowego na kod docelowy, kompilator może utworzyć jedną lub kilka reprezentacji pośrednich, które mogą mieć różne formy. Na przykład, drzewa składniowe są popularną formą reprezentacji pośredniej. Włodzimierz Bielecki WI ZUT 33

Generacja kodu pośredniego Drugą popularną formą jest kod trójadresowy: t1 = inttoreal(60) t 2 = id3 * t1 t 3 = id2 + t 2 id1 = t 3 Włodzimierz Bielecki WI ZUT 34

Generacja kodu pośredniego Analizator leksykalny Generator kodu pośredniego Kod pośredni Tokeny Drzewo parsowania Analizator syntaktyczny Drzewo parsowania Analizator semantyczny Włodzimierz Bielecki WI ZUT 35

Optymalizacja kodu Optymalizacja kodu polega na redukcji liczby instrukcji i/lub zmniejszeniu zapotrzebowania na pamięć ( zmniejszenie liczby zmiennych tymczasowych). Optymalizacja kodu może być fazą opcjonalną. Włodzimierz Bielecki WI ZUT 36

Optymalizacja kodu Analizator leksykalny Generator kodu pośredniego Kod pośredni Tokeny Drzewo parsowania Analizator syntaktyczny Optymalizator kodu Kod zoptymalizowany Analizator semantyczny Drzewo parsowania Włodzimierz Bielecki WI ZUT 37

Generacja kodu Generator kodu tłumaczy reprezentację pośrednią programu na program w języku docelowym. Jeśli programem docelowym ma być kod maszynowy, to generator kodu musi przydzielić pamięć(rejestry, pamięć operacyjną) dla każdej zmiennej zdeklarowanej w programie źródłowym. Włodzimierz Bielecki WI ZUT 38

Generacja kodu Następnie każda instrukcja postaci pośredniej jest tłumaczona na sekwencję instrukcji maszynowych. Aspektem kluczowym generowania kodu maszynowego jest optymalny przydział rejestrów do przechowywania zmiennych. Włodzimierz Bielecki WI ZUT 39

Generacja kodu Analizator leksykalny Generator kodu pośredniego Kod pośredni Tokeny Drzewo parsowania Analizator syntaktyczny Optymalizator kodu Kod zoptymalizowany Drzewo parsowania Analizator semantyczny Generator kodu docelowego Kod docelowy Włodzimierz Bielecki WI ZUT 40

Tablice symboli Tablica symboli jest strukturą danych zawierająca rekord dla każdej nazwy zmiennej wraz z polami do przechowywania atrybutów tej zmiennej. Tablica symboli powinna być zaprojektowana tak, aby kompilator mógł szybko znaleźć rekordy dla każdej nazwy oraz szybko zapisać lub pobrać dane z tego rekordu. Włodzimierz Bielecki WI ZUT 41

Grupowanie faz kompilacji Przedstawione fazy kompilatora pokazują logiczną organizację kompilatora. W implementacji kompilatora, fazy te mogą być grupowane w jedną większą fazę. Włodzimierz Bielecki WI ZUT 42

Grupowanie faz kompilacji Na przykład, analiza leksykalna, analiza syntaktyczna i analiza semantyczna mogą być połączone w jedną fazę: w tej fazie czynności wszystkich tych analiz są wykonywane jednocześnie pod kontrolą analizatora syntaktycznego (kompilacja sterowana składnią). Włodzimierz Bielecki WI ZUT 43

Dziękuję za uwagę Włodzimierz Bielecki WI ZUT 44