KONSTRUKCJA KOMPILATORÓW

Podobne dokumenty
Metody Kompilacji Wykład 1 Wstęp

Wprowadzenie. Wojciech Complak

Analiza leksykalna i generator LEX

Translacja wprowadzenie

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

L E X. Generator analizatorów leksykalnych

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

Matematyczne Podstawy Informatyki

Podstawy Kompilatorów

Podstawy Kompilatorów

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

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

Program We Kompilator Wy Źródłowy

Podstawy programowania - 1

Zadanie analizy leksykalnej

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Wstęp do programowania. Wykład 1

Podstawy programowania (1)

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Podstawy generatora YACC. Bartosz Bogacki.

Podstawy Kompilatorów

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

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

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

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

INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE

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!

Pytania sprawdzające wiedzę z programowania C++

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

1 Podstawy c++ w pigułce.

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Algorytmy od problemu do wyniku

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

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

Podstawy programowania.

Wstęp do programowania

MATERIAŁY DO ZAJĘĆ I. Podstawowe pojęcia. Algorytm. Spis treści Przepis

3. Instrukcje warunkowe

Języki i metodyka programowania

TEST KOŃCOWY DLA KLASY III GIMNAZJUM- POGRAMOWANIE. Szkoła Podstawowa Nr 5. im. Księcia Mazowieckiego Siemowita IV w Gostyninie.

Podstawy Informatyki Języki programowania c.d.

Zmienne, stałe i operatory

10. Translacja sterowana składnią i YACC

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

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

Informatyka 1. Plan dzisiejszych zajęć. zajęcia nr 1. Elektrotechnika, semestr II rok akademicki 2008/2009

Język ludzki kod maszynowy

Podstawy Programowania. Wykład 1

Programowanie komputerów

Programowanie w języku Python. Grażyna Koba

Microsoft IT Academy kurs programowania

Java EE produkcja oprogramowania

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Wstęp do programowania

Podstawy Programowania

Wyjątki (exceptions)

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Informatyka I. dr inż. Andrzej Czerepicki.

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

Wstęp do Programowania, laboratorium 02

Języki programowania zasady ich tworzenia

Algorytmika i Programowanie VBA 1 - podstawy

Ćwiczenia nr 11. Translatory. Wprowadzenie teoretyczne

Informatyka- wykład. Podstawy programowania w Pythonie. dr Marcin Ziółkowski

Podstawy i języki programowania

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Laboratorium 1. Wprowadzenie, środowisko programistyczne, pierwsze programy

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

Podstawy programowania

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Wykład 8: klasy cz. 4

Podstawy Programowania Obiektowego

Wykład II Tablice (wstęp) Przykłady algorytmów Wstęp do języka C/C++

Semantyka i Weryfikacja Programów - Laboratorium 6

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

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Programowanie Komputerów

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 1. Programowanie komputerowe

Język programowania PASCAL

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

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

1 Podstawy c++ w pigułce.

Wykład 5: Klasy cz. 3

Ćwiczenie 1. Przygotowanie środowiska JAVA

Programowanie w Internecie. Java

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Make jest programem komputerowym automatyzującym proces kompilacji programów, na które składa się wiele zależnych od siebie plików.

Podstawy programowania. Wykład 3 Konstrukcje sterujące. Krzysztof Banaś Podstawy programowania 1

Struktura pliku projektu Console Application

Podstawy Kompilatorów

Programowanie I. Kornel Warwas. ATH Katedra Matematyki i Informatyki

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

PRYWATNA WYŻSZA SZKOŁA BUSINESSU, ADMINISTRACJI I TECHNIK KOMPUTEROWYCH S Y L A B U S

Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy. Laboratorium 1. Karol Tarnowski A-1 p.

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

zmienne stanowią abstrakcję komórek pamięci: programista może przechowywać dane w pamięci, nie martwiąc się o techniczne szczegóły (np.

Programowanie obiektowe zastosowanie języka Java SE

Paostwowa Wyższa Szkoła Zawodowa w Płocku Dariusz Wardowski

Transkrypt:

KONSTRUKCJA KOMPILATORÓW WYKŁAD Robert Plebaniak

PLATFORMA PROGRAMOWA LINUX (może nie zawierać LLgen, wówczas instalacja ze strony http://tack.sourceforge.net); WINDOWS (używa się wtedy programu Cygwin, można znaleźć http://www.cygwin.com); 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 (http://www.openwatcom.org) 4

GENERATOR LLGen Niektóre dystrybucje systemu LINUX Wersja źródłowa, w ramach pakietu ACK Oddzielny produkt, np. do pobrania pod adresem http://tack.sourceforge.net/ System operacyjny Minix http://www.minix3.org 5

GENERATORY LEX i YACC PCYACC - wersja komercyjna http://www.abxsoft.com MKS LEX & YACC wersja komercyjna http://www.mkssoftware.com Bumble-Bee Parser Generator wersja komercyjna http://www.bumblebeesoftware.com 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; http://www.gnu.org/software/bison/manual -generator LEX i YACC; http://tack.sourceforgen.net/doc/llgen.html - generator LLGen; www.wazniak.mimuw.edu.pl 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; Analiza; Reprezentacja pośrednia; Synteza; 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ę. 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 TOKEN LEKSEM WZORZEC ATRYB. KWD_INT int int IDENT funkcja [ _a-za-z][ _aza-z0-9]* funkcja ( ( ( KWD_INT int int IDENT s [ _a-za-z][ _aza-z0-9]* s ) ) )

PRZYKŁAD TOKEN LEKSEM WZORZEC ATRYB. { { { KWD_RET return return IDENT s [ _a-za-z][ _aza-z0-9]* s OP_PLUS + + IDENT s [_a-za-z][_aza-z0-9]* s

PRZYKŁAD TOKEN LEKSEM WZORZEC ATRYB. ; ; ; } } } 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: i:=1 @loop: if i>n goto @end s:=10*i cout<<s i:=i+1 goto @loop @end: 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 s:=10*i @loop: if i>n goto @end cout<<s i:=i+1 s:=s+10 goto @loop @end: i:=1 @loop: if i>n goto @end s:=10*i cout<<s i:=i+1 goto @loop @end: 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; 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) { if a<0 return -1; else if (a==0) return 0; 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; - dynamiczny przydział pamięci; - przekazywanie parametrów do podprogramów; - 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() {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 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