You are on page 1of 45

Technika kompilacji

Wstp Prezentacja jest wspfinansowana przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego w projekcie pt.
Innowacyjna dydaktyka bez ogranicze - zintegrowany rozwj Politechniki dzkiej zarzdzanie Uczelni, nowoczesna oferta edukacyjna i wzmacniania zdolnoci do zatrudniania osb niepenosprawnych
Prezentacja dystrybuowana jest bezpatnie

Politechnika dzka, ul. eromskiego 116, 90-924 d, tel. (042) 631 28 83 Projekt wspfinansowany przez Uni Europejsk www.kapitalludzki.p.lodz.pl w ramach Europejskiego Funduszu Spoecznego

dr in. Adam Piotrowski


Katedra Mikroelektroniki i Technik Informatycznych tel: 042 631 27 20 e-mail: komam@dmcs.pl http://lux.dmcs.pl/tk/ http://lux.dmcs.pl/cc/ http://www.dmcs.pl/~komam/podyplomowe/tk

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

3
Plan wyadw

Wstp Analiza leksykalna Analiza skadniowa

Analiza syntaktyczna
Translacja sterowana skadni Generacja kodu poredniego

rodowisko czasu wykonania


Generacja kodu kocowego Optymalizacja

Linker, skrypty linkera, sekcje


Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

4
Literatura

Podstawowa
A.V. Aho, R. Sethi, J. D. Ullman, "Compilers - Principles, Techniques, and Tools", Addison-Wesley 2007 (polskie wydanie WNT 2002) W. M. Waite, G. Goos, "Konstrukcja kompilatorw", WNT 1989 J. E. Hopcroft, R. Motwani, J. D. Ullman Wprowadzenie do teorii automatw, jzykw i oblicze, Wydanie: drugie zmienione, Wydawnictwo Naukowe PWN 2005

Uzupeniajca
John R. Levine, "Linkers and Loaders", Morgan Kaufmann Publishers 1999 (manuskrypt dostepny online) S. S. Muchnick, "Advanced Compiler Design and Implementation", Morgan Kaufmann Publishers 1997

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

5
Napisalimy program, jak go uruchomi?

Kompilator
Przetwarza cay program na posta zrozumia dla procesora (C/C++, Fortran)

Interpreter
Przetwarza osobno kad pojedyncz instrukcj (VBasic, Python, Jzyki skryptowe, Bash)

Rozwizania porednie
Kod poredni, interpretowany przez procesor wirtualny (Java)

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

6
Pierwszy kompilator?

1958
Lisp jako notacja do pisania funkcji, rczne tumaczenie na kod maszynowy i uruchamianie, propozycja funkcji eval ktra przyjmowaa jako argument wyraenie Lispa i je interpretowaa, rczne zakodowanie funkcji eval w kodzie maszynowym

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

7
System przetwarzania jzykw
Szkieletowy program gwny
Preprocesor Program rdowy gcc E test.c o test.i

Kompilator
Wynikowy program w asemblerze Asembler Przemieszczalny kod maszynowy Program adujcy/konsolidator Bezwzgldny kod maszynowy

gcc S test.c o test.s

as test.s o test.o Biblioteki, przemieszczalne pliki obiektowe gcc test.o o test

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

8
System przetwarzania jzykw
Szkieletowy program gwny
Preprocesor Program rdowy gcc E test.c o test.i
#include <stdio.h> int main() { printf("Hello world\n"); gcc return 0; S test.c o test.s }

Kompilator
Wynikowy program w asemblerze Asembler Przemieszczalny kod maszynowy Program adujcy/konsolidator Bezwzgldny kod maszynowy

as test.s o test.o Biblioteki, przemieszczalne pliki obiektowe gcc test.o o test

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

9
System przetwarzania jzykw
Szkieletowy program gwny
Preprocesor Program rdowy gcc E test.c o test.i

Kompilator
Wynikowy program w asemblerze Asembler Przemieszczalny kod maszynowy Program adujcy/konsolidator Bezwzgldny kod maszynowy

typedef unsigned char __u_char; typedef unsigned short int __u_short; typedef unsigned int __u_int; gcc Sunsigned long int __u_long; typedef test.c o test.s

extern int fclose (FILE *__stream);


extern int fflush (FILE *__stream); int main() as test.s o test.o { printf("Hello world\n"); Biblioteki, return 0; } przemieszczalne pliki

obiektowe

gcc test.o o test

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

10
System przetwarzania jzykw
.file Szkieletowy program gwny "main.c" .section .rodata .LC0: .string "Hello world" Preprocesor .text .globl main .type main, @function Program rdowy main: .LFB2: pushq %rbp Kompilator .LCFI0: movq %rsp, %rbp .LCFI1: Wynikowy $.LC0, %edi w asemblerze program movl call puts movl $0, %eax Asembler leave ret

gcc E test.c o test.i

gcc S test.c o test.s

as test.s o test.o

Przemieszczalny kod maszynowy Program adujcy/konsolidator Bezwzgldny kod maszynowy

Biblioteki, przemieszczalne pliki obiektowe


gcc test.o o test

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

11
System przetwarzania jzykw
Szkieletowy program gwny
Preprocesor Program rdowy gcc E test.c o test.i

Kompilator
Wynikowy program w asemblerze Asembler Przemieszczalny kod maszynowy Program adujcy/konsolidator Bezwzgldny kod maszynowy

gcc S test.c o test.s

as test.s o test.o Biblioteki, przemieszczalne pliki obiektowe gcc test.o o test

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

12
Elementy kompilatora
Program rdowy Analizator leksykalny Analizator skadniowy

Tablica symboli

Analizator semantyczny Gen. kodu poredniego


Optymalizator kodu Generator kodu Program wynikowy

Obsuga bdw

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

13
Elementy kompilatora
Program rdowy Analizator leksykalny
Analizator skadniowy Analizator semantyczny Gen. kodu poredniego Optymalizator kodu Generator kodu Program wynikowy
Przechowuje informacje na temat staych, zmiennych, funkcji, procedur zadeklarowanych w programie. MAKRA NIE S UMIESZCZANE W TABLICY SYMBOLI Informacje w tablicy symboli s zbierane podczas analizy leksykalnej i skadniowej, natomiast s wykorzystywane podczas analizy syntaktycznej, optymalizacji i generacji kodu
typ real real real adres 0 8 16

Tablica symboli

Obsuga bdw

identyfikator pozycja poczatek tempo

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

14
Elementy kompilatora
Program rdowy Analizator leksykalny Analizator skadniowy
W przypadku bdu nie przerywamy procesu kompilacji, prbujemy zastosowa techniki odzyskiwania kontroli. Rodzaje bdw: leksykalne (bdnie wpisany identyfikator, sowo kluczowe lub operator) skadniowe (wyraenie arytmetyczne z niewywaonymi nawiasami) semantyczne (zastosowanie operatora do niekompatybilnego typu) logiczne (wywoanie rekurencji w nieskoczonej ptli, sprawdzanie warunku ktry nigdy nie bdzie prawdziwy)

Tablica symboli

Analizator semantyczny Gen. kodu poredniego


Optymalizator kodu Generator kodu Program wynikowy

Obsuga bdw

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

15
Elementy kompilatora
Program rdowy Analizator leksykalny Analizator skadniowy
Zadania: czytanie znakw z wejcia i produkcja sekwencji symboli leksykalnych dla analizatora skadniowego eliminacja komentarzy i biaych znakw informowanie o aktualnym numerze analizowanego wiersza rozwijanie makr preprocesora uzupenianie tablicy symboli
Obsuga bdw

Tablica symboli

Analizator semantyczny Gen. kodu poredniego


Optymalizator kodu Generator kodu Program wynikowy

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

16
Analiza leksykalna

Pojcia podstawowe
symbol leksykalny (atomy leksykalne, token)
np. id, liczba_rzeczywista, liczba_calkowita

leksem
np. ala, 3.14, 3

wzr

Powody rozdzielenia analizy leksykalnej i skadniowej


prostota projektowania poprawienie wydajnoci zwikszenie przenonoci kompilatora

Opisywane za pomoc prostych gramatyk lub wyrae regularnych (automaty stanowe)


Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

17
Analiza leksykalna
Wikszo symboli leksykalnych naley do jednej z grup:
nazwy (identyfikatory) sowa zarezerwowane (ustalony podzbir zbioru nazw) liczby cakowite liczby rzeczywiste acuchy znakowe

operatory:
addytywne (+, -), unarne (+, -), multiplikatywne (*, /) relacyjne (<, >, =, <=, >=, <>) logiczne (and, or, not) przypisania (:=)

ograniczniki jednoznakowe: ; , [ ] ( ) . ograniczniki dwuznakowe: (* , *), +=, ++ itd.

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

18
Analizator leksykalny
Leksemy:

pozycja := poczatek + tempo * 60


Symbole leksykalne: identyfikator op_przypisania identyfikator op_add op_mul

identyfikator

liczba

identyfikator: zbir zaczynajcy si od litery lub podkrelenia, po ktrym nastpuje dowolnie dugi cig liter, cyfr, podkrele op_add: operator dodawania lub odejmowania op_mul: operatory mnoenia i dzielenia op_przypisania: operator skadajcy si ze znaku : po ktrym nastpuje znak =

identyfikator pozycja poczatek tempo

typ

adres

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

19
Elementy kompilatora
Program rdowy Analizator leksykalny Analizator skadniowy
Zadania: weryfikacja poprawnoci skadniowej programu rdowego wykrycie i neutralizacja bdw skadniowych transformacja struktury programu do postaci drzewa wywodu
Obsuga bdw

Tablica symboli

Analizator semantyczny Gen. kodu poredniego


Optymalizator kodu Generator kodu Program wynikowy

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

20
Formalna gramatyka bezkontekstowa

Gramatyka bezkontekstowa:
Zbir tokenw (symboli leksykalnych) zwanych symbolami terminalnymi

Zbir symboli nieterminalnych


Zbir produkcji, z ktrych kada skada si z symbolu nieterminalnego, zwanego lew stron produkcji, strzaki oraz sekwencji tokenw i symboli nieterminalnych, zwanej praw stron produkcji Jednego wyrnionego symbolu nieterminalnego, zwanego symbolem startowym

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

21
Analiza skadniowa
instrukcja_przypisania -> identyfikator ':=' wyraenie wyraenie -> liczba wyraenie -> identyfikator wyraenie -> wyraenie '+' wyraenie wyraenie -> wyraenie '*' wyraenie
instrukcja przypisania identyfikator wyraenie

wyraenie identyfikator wyraenie

wyraenie wyraenie liczba + 60

identyfikator pozycja

:=

pocztek

tempo

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

22
Elementy kompilatora
Program rdowy Analizator leksykalny Analizator skadniowy
Zadania: weryfikacja poprawnoci semantycznej programu rdowego Kontrola typw Kontrola przepywu sterowania Kontrola unikalnoci Kontrola zwizana z nazw
Obsuga bdw

Tablica symboli

Analizator semantyczny Gen. kodu poredniego


Optymalizator kodu Generator kodu Program wynikowy

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

23
Analiza semantyczna
identyfikator pozycja poczatek
instrukcja przypisania identyfikator wyraenie

typ real real real

adres

tempo

wyraenie identyfikator wyraenie

wyraenie inttireal wyraenie liczba

identyfikator

pozycja

:=

pocztek

tempo

60

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

24
Elementy kompilatora
Program rdowy Analizator leksykalny Analizator skadniowy

Tablica symboli

Analizator semantyczny
Gen. kodu poredniego Optymalizator kodu Generator kodu Program wynikowy

Obsuga bdw

Zadania: generacja kodu poredniego, niezalenego od sprztu oraz wejciowego jzyka programowania umoliwia przenono kompilatora pomidzy rnymi architekturami oraz jzykami umoliwia implementacj optymalizacji niezalenych od docelowej architektury oraz wejciowego jzyka programowania

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

25
Generacja kodu poredniego Trjadresowy kod poredni
kady rozkaz oprcz przypisania moe mie co najwyej jeden operator podczas translacji kodu drzewa wyprowadze do kodu trjadresowego kompilator moe wstawi dodatkowe zmienne tymczasowe przechowujce tymczasowe wyniki operacji niektre z operacji trjadresowych mog mie mniej ni trzy argumenty

temp1 temp2 temp3 id3 :=

:= inttoreal (60) := id1 * temp1 := id2 + temp2 temp3

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

26 Elementy kompilatora
Program rdowy Analizator leksykalny Analizator skadniowy Analizator semantyczny Gen. kodu poredniego Optymalizator kodu Generator kodu Program wynikowy
Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

Tablica symboli

Obsuga bdw

Zadania: poprawa efektywnoci kodu wynikowego, ograniczenie rozmiaru oraz czasu wykonania programu moe by wykonywana na wielu poziomach (kod rdowy, kod poredni, kod wynikowy)

27
Przykadowe algorytmy optymalizacji

usuwanie kodu martwego eliminacja podwyrae wsplnych propagacja kopii zmienne indukcyjne redukcja mocy uycie tosamoci algebraicznych

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

28
Optymalizacja

temp1 temp2 temp3 id3 :=

:= inttoreal (60) := id1 * temp1 := id2 + temp2 temp3

konwersja z liczby typu int na liczb typu real na etapie generacji kodu

redukcja zmiennej tmp3

temp1 := tempo * 60.0 id3 := poczatek + temp1


Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

29
Optymalizacja kodu w kompilatorze gcc

Oglne flagi sterowania optymalizacj


O0 brak optymalizacji. Redukcja czasu kompilacji oraz generowanie kodu gotowego do procesu debugowania. Akcja domylna O1 (O) optymalizuj Redukcja czasu wykonania programu oraz rozmiaru generowanego kodu O2 optymalizuj troch bardziej Kompilator wykonuje wszystkie optymalizacje ktre nie powoduj zachwiania rwnowagi midzy rozmiarem generowanego kodu oraz czasem wykonania aplikacji O3 optymalizuje jeszcze bardziej Os optymalizacji z uwzgldnieniem tylko wielkoci kodu. Wykonywane s optymalizacje ktre nie powoduj generacji dodatkowego kodu
Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

30
Optymalizacja kodu w kompilatorze gcc

Szczegowe flagi optymalizacji


fomit-frame-pointer fno-inline funsafe-loop-optimizations ftree-copy-prop ftree-loop-optimize funsafe-math-optimizations

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

31
Elementy kompilatora
Program rdowy Analizator leksykalny Analizator skadniowy Analizator semantyczny Gen. kodu poredniego Optymalizator kodu Generator kodu Program wynikowy
Zadania: wygenerowanie kodu wynikowego w postaci: kodu asemblera przemieszczalnego kodu maszynowego gotowego programu wykonywalnego wybr rozkazw przydzia rejestrw

Tablica symboli

Obsuga bdw

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

32
Generacja kodu
pozycja := poczatek + tempo * 60

MOVF 16, R2 MULF #60.0, R2 MOVF 8, R1 ADDF R2, R1 MOVF R1,0

identyfikator pozycja poczatek

typ real real

adres 0 8

tempo

real

16

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

33 Translacja pojedynczej instrukcji


pozycja := poczatek + tempo * 60 Analizator leksykalny id1 := id2 + id3 * 60 Analizator skadniowy
:= id1 id2 +
temp1 temp2 temp3 id3 := := inttoreal (60) := id1 * temp1 := id2 + temp2 temp3

Generacja kodu poredniego

Optymalizator kodu
* 60
temp1 := tempo * 60.0 pozycja := poczatek + temp1

id3

Analizator semantyczny
:=
id1 id2

Generator kodu
MOVF 16, R2 MULF #60.0, R2 MOVF 8, R1 ADDF R2, R1 MOVF R1,0

+
id3

inttoreal 60
Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

34
GCC

GCC to nie kompilator !!!


GCC to GNU Compiler Collection

gcc to nie kompilator !!!


gcc (GNU C Compiler) to menader kompilacji

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

35
GCC
Projekt rozwijany od 23 lat (!!!). 2 miliony linii kodu. Wsparcie dla 7 jzykw programowania
C (gcc) C++ (g++) Objective C Fortran Java (GCJ) Ada (GNAT) Go arm avr m32, m64 microblaze sparc x86 ia64
Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

Wsparcie dla wicej ni 30 architektur


36
gcc

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

37
GCC

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

38 38 Przykad: budowa kompilatora gcc

Brak tablicy symboli !!!

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

Pytania ?
Prezentacja jest wspfinansowana przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego w projekcie pt.
Innowacyjna dydaktyka bez ogranicze - zintegrowany rozwj Politechniki dzkiej zarzdzanie Uczelni, nowoczesna oferta edukacyjna i wzmacniania zdolnoci do zatrudniania osb niepenosprawnych
Prezentacja dystrybuowana jest bezpatnie

Politechnika dzka, ul. eromskiego 116, 90-924 d, tel. (042) 631 28 83 Projekt wspfinansowany przez Uni Europejsk www.kapitalludzki.p.lodz.pl w ramach Europejskiego Funduszu Spoecznego

40

Projekt programistyczny

ANALIZATOR PLIKW KONFIGURACYJNYCH


Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

41
Analizator plikw konfiguracyjnych

Wymagania:
wsparcie dla czterech typw danych:
typ cakowity typ rzeczywisty typ logiczny typ acuchowy

wsparcie dla czterech podstawowych operacji arytmetycznych:


mnoenie dzielenie dodawanie odejmowanie

komentarze (/* komentarz */)


Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

42
Analizator plikw konfiguracyjnych

CONFIG_PI=3.1415; CONFIG_READ_TIMEOUT = 500; CONFIG_READ_ACK = 1000; CONFIG_WRITE_TIMEOUT = 1500; CONFIG_WRITE_ACK = 1000; CONFIG_READ_TIMEOUT = CONFIG_READ_TIMEOUT + CONFIG_READ_ACK; CONFIG_WRITE_TIMEOUT = CONFIG_WRITE_TIMEOUT + CONFIG_WRITE_ACK; CONFIG_LOG_DIRECTORY = /var/log; /*To jest komentarz*/ CONFIG_ENABLE_DEBUG_MODE = TRUE;

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

43
Analizator plikw konfiguracyjnych class ConfigFileParser { public: ConfigFileParser(ConfigDefaultSettings *defArray); ~ConfigFileParser(); void int double std::string bool };
Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

parse(const std::string& fileName); getInt(const std::string& name); getReal(const std::string& name); getString(const std::string& name); getBool(const std::string& name);

44
Analizator plikw konfiguracyjnych
ConfigDefaultSettings defArray[] = {{"CONFIG_PI", TYPE_REAL, "", 0, 3.14, false}, {"CONFIG_READ_TIMEOUT", TYPE_INT, "", 1, 0, false}, {"CONFIG_READ_ACK", TYPE_INT, "", 1, 0, false}, {"CONFIG_WRITE_TIMEOUT ", TYPE_INT, "", 1, 0, false}, {"CONFIG_WRITE_ACK", TYPE_INT, "", 1, 0, false}, {"CONFIG_ENABLE_DEBUG_MODE", TYPE_BOOL, "", 0, 0, false}, {"CONFIG_LOG_DIRECTORY", TYPE_STRING, "/tmp/", 0, 0, false}, {"", TYPE_ERROR, "", 0, 0, false}};

int main() { ConfigFileParser config(defArray); try{ config.parse("./test.cfg"); std::cout << config.getBool("CONFIG_ENABLE_DEBUG_MODE") << std::endl; std::cout << config.getInt("CONFIG_READ_TIMEOUT") << std::endl; std::cout << config.getReal("CONFIG_PI") << std::endl; } catch (ConfigFileParserEx &ex){ std::cout << ex.getInfo() << std::endl; } return 0; }

Projekt wspfinansowany przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego

Dzikuj za uwag
Prezentacja jest wspfinansowana przez Uni Europejsk w ramach Europejskiego Funduszu Spoecznego w projekcie pt.
Innowacyjna dydaktyka bez ogranicze - zintegrowany rozwj Politechniki dzkiej zarzdzanie Uczelni, nowoczesna oferta edukacyjna i wzmacniania zdolnoci do zatrudniania osb niepenosprawnych
Prezentacja dystrybuowana jest bezpatnie

Politechnika dzka, ul. eromskiego 116, 90-924 d, tel. (042) 631 28 83 Projekt wspfinansowany przez Uni Europejsk www.kapitalludzki.p.lodz.pl w ramach Europejskiego Funduszu Spoecznego

You might also like