KONSTRUKCJA KOMPILATORÓW WYKŁAD WYKŁAD Robert Plebaniak Robert Plebaniak.

Slides:



Advertisements
Podobne prezentacje
Opracowała: Iwona Bieniek
Advertisements

I część 1.
Lingwistyka Matematyczna
Funkcje w PHP ABK.
Przekształcanie dokumentów XML - XSL
Techniki kompilacji Wykład I.
C++ wykład 9 ( ) Szablony.
Język C/C++ Funkcje.
Deklaracje i definicje klas w C++ Składowe, pola, metody Konstruktory
Programowanie w języku C++. Jak napisać prosty program obliczeniowy lub grę komputerową? Zbigniew Nagórny Pracownia Komputerowa Wyższa Szkoła Humanistyczno-Przyrodnicza.
Język ANSI C Funkcje Wykład: Programowanie komputerów
Wprowadzenie do C++ Zajęcia 2.
PROGRAMOWANIE STRUKTURALNE
Informatyka Stosowana
Czy procesor musi się grzać? Np. dodawanie 2 liczb 1-bitowych. Możliwych stanów początkowych: cztery Możliwych stanów końcowych: dwa to można opisać jako.
formatowanie kodu źródłowego
Generator analizatorów składniowych
KONKURS WIEDZY O SZTUCE
Systemy operacyjne Copyright, 2000 © Jerzy R. Nawrocki Wprowadzenie do informatyki.
Programowanie imperatywne i język C Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie.
Języki formalne i gramatyki
Programowanie imperatywne i język C Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie.
WIELOMIANY HARALD KAJZER ZST NR 2 HARALD KAJZER ZST NR 2.
Podstawy informatyki Rekurencja i rekurencja Grupa: 1A
Tablice.
1 Dygresja: cztery płyty główne…. 2 Dygresja: osobliwości C /* cos o nieistniejacym typie Boolean */ /* oraz o operatorze przecinkowym */ #include int.
PODSTAWY JĘZYKA PHP 1. czym jest 2. składnia 3. wersje 4. bazy danych
Wykład 2 struktura programu elementy języka typy zmienne
Wstęp do geofizycznej dynamiki płynów. Semestr VI. Wykład
Wprowadzenie do programowania w języku Turbo Pascal
Dyskretny szereg Fouriera
Przykład wykorzystania komercyjnych i niekomercyjnych źródeł informacji w pracy Biblioteki Chemicznej ZUT Agnieszka Bajda
Wprowadzenie do JSP Copyright © Politecnico di Milano September 2003 Translation: Kamil Żyła, Politechnika Lubelska.
Podstawy programowania
Pakiety w Javie Łukasz Smyczyński (132834). Czym są pakiety? Klasy w Javie są grupowane w pewne zbiory zwane pakietami. Pakiety są więc pewnym podzbiorem.
Turbo Pascal Turbo Pascal - jedna z popularniejszych implementacji kompilatorów języka PASCAL, zintegrowane srodowisko programistyczne, produkt firmy Borland.
Podstawy programowania. Język C i C++– podstawy Temat: 1
Wyrażenia algebraiczne
Kompilator SDCC i Pakiet STRC52 Mgr inż. Aleksander Pruszkowski
TABLICE C++.
Generator analizatorów leksykalnych
Generatory dokumentacji kodu źródłowego
Informatyka I - Wykład ANSI C
Generator analizatorów składniowych
Podstawy Programowania
ŻYWE JĘZYKI PROGRAMOWANIA LIVING IT UP WITH A LIVE PROGRAMMING LANGUAGE Sean McDirmid Ecole Polytechnique Fédérale de Lausanne (EPFL)
Programowanie obiektowe – zastosowanie języka Java SE
5 Etapów Pracy Kompilatora
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład IX.
Wykonał: Michał Nikołajuk
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
XML – eXtensible Markup Language
Maszyna wirtualna ang. virtual machine, VM.
Kalendarz 2011r. styczeń pn wt śr czw pt sb nd
Gramatyki i translatory
Wprowadzenie do HTML Informatyka Cele lekcji: Wiadomości:
(C) Jarosław Jabłonka, ATH, 5 kwietnia kwietnia 2017
Projektowanie stron WWW
Podstawy języka Instrukcje - wprowadzenie
Podstawy programowania
K URS JĘZYKA C++ – WYKŁAD 10 ( ) Szablony.
Kalendarz 2020.
Technologie internetowe Wykład 5 Wprowadzenie do skrytpów serwerowych.
Języki formalne i gramatyki Copyright, 2005 © Jerzy R. Nawrocki Teoretyczne podstawy.
Języki formalne Copyright, 2006 © Jerzy R. Nawrocki Wprowadzenie do informatyki Wykład.
Y A C C Generator analizatorów składniowych. GENERATOR YACC Zadaniem generatora YACC jest wygenerowanie kodu źródłowego analizatora składniowego (domyślnie)
Podstawy programowania
Programowanie strukturalne i obiektowe Klasa I. Podstawowe pojęcia dotyczące programowania 1. Problem 2. Algorytm 3. Komputer 4. Program komputerowy 5.
Programowanie obiektowe – zastosowanie języka Java SE
Zapis prezentacji:

KONSTRUKCJA KOMPILATORÓW WYKŁAD WYKŁAD Robert Plebaniak Robert Plebaniak

PLATFORMA PROGRAMOWA LINUX (może nie zawierać LLgen, wówczas instalacja ze strony WINDOWS (używa się wtedy programu Cygwin, można znaleźć 2

Narzędzia potrzebne do ćwiczeń: Kompilator C Generator LLgen Generator LEX Generator YACC Edytor tekstowy 3

KOMPILATOR C W przypadku gdy korzystamy z systemu Linux lub Cygwin najlepiej korzystać z domyślnego w tych systemach kompilatora C – gcc lub C++ (g++). Gdy używamy systemu Windows można skorzystać z wierszowych wersji komercyjnych kompilatorów firm Borland i Microsoft (które są darmowe) lub środowiska Open Watcom ( 4

GENERATOR LLGen Niektóre dystrybucje systemu LINUX Wersja źródłowa, w ramach pakietu ACK Oddzielny produkt, np. do pobrania pod adresem System operacyjny Minix 5

GENERATORY LEX i YACC PCYACC - wersja komercyjna MKS LEX & YACC – wersja komercyjna Bumble-Bee Parser Generator – wersja komercyjna 6

LITERATURA Kompilatory reguły, metody i narzędzia A. V. Aho, R. Sethi, J.D. Ullman, WNT 2002; Konstrukcja kompilatorów, W. M. Waite, G. Goos, WNT 1989; Automaty i języki formalne T. Krasiński UŁWM, 2005; - generator LEX i YACC; generator LLGen; 7

O czym będzie na wykładzie? Pojęcie i modele kompilatora, interpretera; Poszczególne fazy działania kompilatora i etapy kompilacji; Elementy analizy leksykalnej i składniowej; Modele generatorów: LLgen, Lex, Yacc 8

Kompilatory Definicja 1. Kompilator jest programem, którego zadaniem jest przetworzenie kodu napisanego w jakimś języku programowania (C, Ada, Java) zwanym językiem źródłowym, na równoważny kod w innym języku, zwanym językiem wynikowym. 9

INTERPRETER Interpreter – jest programem, który działa podobnie jak kompilator, z tą różnicą, iż nie generuje kodu wynikowego, tylko od razu wykonuje instrukcje zawarte w kodzie źródłowym programu. 10

FAZY DZIAŁANIA KOMPILATORA Program źródłowy; Program źródłowy; Analiza; Analiza; Reprezentacja pośrednia; Reprezentacja pośrednia; Synteza; Synteza; Program wynikowy; Program wynikowy; 11

ETAPY KOMPILACJI Analiza – na tym etapie, kompilator rozkłada program źródłowy na części składowe, a następnie generuje tzw. reprezentację pośrednią. Również na tym etapie następuje także wykrywanie błędów i ewentualne informowanie o nich programistę. Również na tym etapie następuje także wykrywanie błędów i ewentualne informowanie o nich programistę. 12

ANALIZA Analiza leksykalna; Analiza składniowa; Analiza semantyczna; 13

ANALIZA LEKSYKALNA Analiza leksykalna zwana jest także skanowaniem lub analizą liniową. Głównym zadaniem analizy leksykalnej jest grupowanie znaków strumienia wejściowego w symbole leksykalne inaczej zwane token-ami. 14

ANALIZA LEKSYKALNA Tokeny to inaczej elementarne składniki języka źródłowego np.: liczby, słowa kluczowe, operatory i identyfikatory, nawiasy okragłe, itd.. 15

ANALIZA LEKSYKALNA Analiza leksykalna zwana jest także skanowaniem lub analizą liniową. Głównym zadaniem analizy leksykalnej jest grupowanie znaków strumienia wejściowego w symbole leksykalne inaczej zwane token-ami. 16

Przykład Dana jest funkcja w języku C++: int funkcja (int s) { return s+s; } 17

Przykład Tokeny to inaczej elementarne składniki języka źródłowego np.: liczby, słowa kluczowe, operatory i identyfikatory, nawiasy okragłe, itd.. 18

PRZYKŁAD Leksemy – są to ciągi znaków, które tworzą symbole leksykalne; Wzorzec – to przepis na konstrukcję tokena: może to być ciąg znaków podkreśleń, małych, dużych liter, a także cyfr; Atrybuty – czyli wartości leksykalne, które czasem pojawiają się przy tokenach. 19

PRZYKŁAD ))) s[ _a-zA-Z][ _a- zA-z0-9]* sIDENT int KWD_INT ((( funkcja[ _a-zA-Z][ _a- zA-z0-9]* funkcjaIDENT int KWD_INT ATRYB.WZORZECLEKSEM TOKEN 20

PRZYKŁAD s[_a-zA-Z][_a- zA-z0-9]* sIDENT s[ _a-zA-Z][ _a- zA-z0-9]* sIDENT ++OP_PLUS return KWD_RET {{{ ATRYB.WZORZECLEKSEM TOKEN 21

PRZYKŁAD }}} ;;; ATRYB.WZORZECLEKSEM TOKEN 22

ANALIZA Analiza leksykalna; Analiza składniowa; Analiza semantyczna; 23

ANALIZA SKŁADNIOWA Analiza składniowa jest zwana także analizą hierarchiczną lub synktatyczną. Zadaniem analizy składniowej jest zbadanie, czy jednostki leksyklane tworzą poprawne konstrukcje danego języka programowania (np.: czy zachowana jest odpowiednia kolejność leksemów). 24

Przykład Dana jest funkcja w języku C++: int (int s) funkcja { } + s ; s return 25

ANALIZA Analiza leksykalna; Analiza składniowa; Analiza semantyczna; 26

ANALIZA SEMANTYCZNA Analiza semantyczna ma następujące zadania: Sprawdzanie programu (programu źródłowego) pod względem semantycznej zgodności z definicją języka źródłowego, w jakim program jest napisany; Zbieranie informacji do generacji kodu pośredniego; 27

Analiza semantyczna Kontrola zgodności typów; Kontrola przepływu sterowania; Unikalność deklaracji - kontrola statyczna; Powtórzenia nazw - kontrola statyczna; 28

SYNTEZA Generacja kodu pośredniego; Optymalizacja kodu; Generacja kodu wynikowego; 29

KOD POŚREDNI Ostatnim etapem analizy jest generacja kodu pośredniego (tzw. języka pośredniego, czasem też reprezentacji pośredniej); Redukcja kosztów głównym celem generacji reprezentacji pośredniej; 30

Przykład Rozważmy program napisany w języku C++, mający za zadanie wypisać na ekran pierwszych n wyrazów ciągu arytmetycznego o różnicy 10;(10,20,30,…) Instrukcja wygląda następująco: for(i=1;i<=n;i++){ S:=10*i; cout<<s<<endl; } 31

Przykład Przyjrzyjmy się teraz kodowi pośredniemu naszej pętli: if i>n s:=10*i cout<<s 32

SYNTEZA Generacja kodu pośredniego; Optymalizacja kodu; Generacja kodu wynikowego; 33

OPTYMALIZACJA KODU Podstawowym celem optymalizacji jest poprawa efektywności kodu wynikowego. Może ona być wykonywana na wszystkich poziomach kodu, tzn. na poziomie kodu źródłowego, pośredniego a także i wynikowego. 34

Przykład A oto jak wygląda kod pośredni naszego przykładu po optymalizacji: i:=1 if i>n cout<<s i:=i+1 if i>n s:=10*i cout<<s 35

SYNTEZA Generacja kodu pośredniego; Optymalizacja kodu; Generacja kodu wynikowego; 36

KOD WYNIKOWY Generacja kodu wynikowego jest ostatnią fazą kompilacji; Podstawowymi problemami rozważanymi na tym etapie kompilacji są: wybór rozkazów realizujących kod; wybór rozkazów realizujących kod; Przydział rejestrów; Przydział rejestrów; 37

KOD WYNIKOWY Blok podstawowy – fragment kodu wykonywany zawsze od pierwszej do ostatniej instrukcji; Graf przepływu – jest grafem dwudzielnym składającym się z węzłów i krawędzi. Jego węzłami są bloki podstawowe, zaś krawędzie pokazują w jaki sposób przemieszcza się sterowanie; 38

Przykład Stwórzmy graf przepływu dla matematycznej funkcji signum. 39

Przykład Implementacja w C++ takiego krótkiego programu może wyglądać następująco: float signum (int a) float signum (int a) { if a<0 return -1; if a<0 return -1; else if (a==0) return 0; else if (a==0) return 0; else return 1; else return 1; } 40

Przykład-graf przepływu funkcji signum x:=a If x<0 goto B If x>0 goto A B: y:=-1 goto C y=0 goto C A: y:=1 goto C C: STOP

Środowisko czasu wykonania W środowisko czasu wykonania jest zaopatrzony każdy program wykonywalny. Środowisko to zapewnia: - obsługę wyjątków; - obsługę wyjątków; - dynamiczny przydział pamięci; - dynamiczny przydział pamięci; - przekazywanie parametrów do podprogramów; - przekazywanie parametrów do podprogramów; - zapewnienie dostępu do nazw nielokalnych; - zapewnienie dostępu do nazw nielokalnych; 42

Środowisko czasu wykonania- reguły widzialności Reguły widzialności określają sposób w jaki kompilator interpretuje odwołania w programie do nazw nielokalnych. Mamy dwie możliwości: reguły widzialności statycznej – analiza tekstu programu (C, Ada); reguły widzialności dynamicznej – w trakcie wykonywania programu (Snobol, Lisp, APN) 43

Przykład Przyjrzyjmy się fragmentowi kodu napisanemu w C++: int k=1; main() main() {cout<<zmienna k wynosi <<k<<endl; {cout<<zmienna k wynosi <<k<<endl;{ int k=30; cout<<w bloku zmiennak k wynosi teraz <<k<<endl; } cout<<znów poza blokiem k wynosi<<k; } 44

Przykład A oto co pojawi się na ekranie w wyniku działania programu: zmienna k wynosi 1 w bloku zmienna k wynosi teraz 30 w bloku zmienna k wynosi teraz 30 znów poza blokiem k wynosi 1 znów poza blokiem k wynosi 1 45

Przykład A oto w jaki sposób można się odwołać do zasłoniętej nazwy globalnej w C++ int k=1; main(){ cout<<zmiennka k wynosi <<k<<endl; {int k=30; cout<<w bloku zmiennak k wynosi teraz <<k<< a zmienna globalna k wynosi nadal <<::k<<endl; }

KONIEC KONIEC WYKŁADU PIERWSZEGO