techniki kompilacji
DESCRIPTION
Techniki kompilacji. Wykład I. Adam Piotrowski Katedra Mikroelektroniki i Technik Informatycznych tel: 042 631 27 20 e-mail: [email protected] http://lux.dmcs.pl/tk/ http://www.dmcs.pl/~komam/tkz. Literatura. Podstawowa - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/1.jpg)
Techniki kompilacji
Wykład I
1
![Page 2: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/2.jpg)
Adam Piotrowski
Katedra Mikroelektroniki i Technik Informatycznych
tel: 042 631 27 20e-mail: [email protected]
http://lux.dmcs.pl/tk/http://www.dmcs.pl/~komam/tkz
2
![Page 3: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/3.jpg)
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, "Konstrukcjakompilatorów", WNT 1989
• Uzupełniająca– 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
3
![Page 4: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/4.jpg)
Zagadnienia• Część teoretyczna
– Kompilacja programów– Translacja kodu języka wysokiego poziomu
do języka symbolicznego– Analizator leksykalny– Analizator składniowy– Gramatyka, języki używane w budowie
kompilatora• Część praktyczna
– Programy do budowy kompilatora (flex i bison)
– Zarządzane kompilacją projektu (program make)
4
![Page 5: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/5.jpg)
Wykład I - Zagadnienia
• Kompilacja programów– proces kompilacji– budowa kompilatora
• Translacja kodu języka wysokiego poziomu do języka symbolicznego – projekt kompilatora dla wirtualnego procesora
5
![Page 6: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/6.jpg)
Napisaliśmy program, jak go
uruchomić?• Kompilator– Przetwarza cały program na postać
zrozumiałądla procesora (C/C++, Fortran)
• Interpreter– Przetwarza osobno każdą pojedynczą
instrukcję (Vbasic, Python, Języki skryptowe, Bash)
• Rozwiązania pośrednie– Kod pośredni, interpretowany przez
procesor wirtualny (Java)6
![Page 7: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/7.jpg)
System przetwarzania języków
7
Szkieletowy program główny
Preprocesor
Program źródłowy
Kompilator
Wynikowy program w asemblerze
Asembler
Przemieszczalny kod maszynowy
Program ładujący/konsolidator
Bezwzględny kod maszynowy
Biblioteki, przemieszczalne pliki obiektowe
gcc test.o –o test
gcc –E test.c –o test.i
gcc –S test.c –o test.s
as test.s –o test.o
typedef unsigned char __u_char;typedef unsigned short int __u_short;typedef unsigned int __u_int;typedef unsigned long int __u_long;
extern int fclose (FILE *__stream);
extern int fflush (FILE *__stream);
int main(){ printf("Hello world\n"); return 0;}
#include <stdio.h>
int main(){ printf("Hello world\n"); return 0;}
.file "main.c" .section .rodata.LC0: .string "Hello world" .text.globl main .type main, @functionmain:.LFB2: pushq %rbp.LCFI0: movq %rsp, %rbp.LCFI1: movl $.LC0, %edi call puts movl $0, %eax leave ret
![Page 8: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/8.jpg)
Elementy kompilatora
8
Analizator leksykalny
Analizator składniowy
Analizator semantyczny
Gen. kodu pośredniego
Optymalizator kodu
Generator kodu
Program źródłowy
Program wynikowy
Tablica symboli
Obsługa błędów
![Page 9: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/9.jpg)
Elementy kompilatora
9
Analizator leksykalny
Analizator składniowy
Analizator semantyczny
Gen. kodu pośredniego
Optymalizator kodu
Generator kodu
Program źródłowy
Program wynikowy
Tablica symboli
Obsługa błędów
Przechowuje informacje na temat stałych, zmiennych, funkcji, procedur zadeklarowanych w programie. MAKRA NIE SĄ UMIESZCZANE W TABLICY SYMBOLI
Informacje w tablicy symboli są zbierane podczas analizy leksykalnej i składniowej, natomiast są wykorzystywane podczas analizy syntaktycznej, optymalizacji i generacji koduidentyfikator typ adres
pozycja real 0
poczatek real 8
tempo real 16
![Page 10: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/10.jpg)
Elementy kompilatora
10
Analizator leksykalny
Analizator składniowy
Analizator semantyczny
Gen. kodu pośredniego
Optymalizator kodu
Generator kodu
Program źródłowy
Program wynikowy
Tablica symboli
Obsługa błędów
W przypadku błędu nie przerywamy procesu kompilacji, próbujemy zastosować techniki odzyskiwania kontroliRodzaje błędów:
•leksykalne (błędnie wpisany identyfikator, słowo kluczowe lub operator)•składniowe (wyrażenie arytmetyczne z niewyważonymi nawiasami)•semantyczne (zastosowanie operatora do niekompatybilnego typu)•logiczne (wywołanie rekurencji w nieskończonej pętli, sprawdzanie warunku który nigdy nie będzie prawdziwy)
![Page 11: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/11.jpg)
Elementy kompilatora
11
Analizator leksykalny
Analizator składniowy
Analizator semantyczny
Gen. kodu pośredniego
Optymalizator kodu
Generator kodu
Program źródłowy
Program wynikowy
Tablica symboli
Obsługa błędów
Zadania:•czytanie znaków z wejścia i produkcja sekwencji symboli leksykalnych dla analizatora składniowego•eliminacja komentarzy i białych znaków•informowanie o aktualnym numerze analizowanego wiersza•rozwijanie makr preprocesora•uzupełnianie tablicy symboli
![Page 12: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/12.jpg)
Analiza leksykalna• Pojęcia podstawowe
– symbol leksykalny (atomy leksykalne)• np. id, liczba_rzeczywista, liczba_calkowita
– leksem• np. „ala”, 3.14, 3
– wzór• Powody rozdzielenia analizy leksykalnej i
składniowej– prostota projektowania– poprawienie wydajności– zwiększenie przenośności kompilatora
• opisywane za pomocą prostych gramatyk lub wyrażeń regularnych (automaty stanowe)
12
![Page 13: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/13.jpg)
Analiza leksykalna• Większość symboli leksykalnych należy do jednej z grup:
– nazwy (identyfikatory)– słowa zarezerwowane (ustalony podzbiór zbioru nazw)– liczby całkowite– liczby rzeczywiste– łańcuchy znakowe– operatory:
• addytywne (+, -),• unarne (+, -),• multiplikatywne (*, /)• relacyjne (<, >, =, <=, >=, <>)• logiczne (and, or, not)• przypisania (:=)
– ograniczniki jednoznakowe: ; , [ ] ( ) .– ograniczniki dwuznakowe: (* , *), +=, ++ itd.
13
![Page 14: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/14.jpg)
Analizator leksykalny
pozycja := poczatek + tempo * 60
14
identyfikator
identyfikator identyfikator liczba
op_mul
op_add
op_przypisania
identyfikator
typ adres
pozycja real 0
poczatek real 8
tempo real 16
Symbole leksykalne:
Leksemy:
identyfikator:zbiór zaczynający się od litery lub podkreślenia, po którym następuje dowolnie długi ciąg liter, cyfr, podkreśleń
op_add: operator dodawania lub odejmowaniaop_mul:
operatory mnożenia i dzieleniaop_przypisania: operator składający się ze znaku „:” po którym następuje znak „=„
![Page 15: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/15.jpg)
Elementy kompilatora
15
Analizator leksykalny
Analizator składniowy
Analizator semantyczny
Gen. kodu pośredniego
Optymalizator kodu
Generator kodu
Program źródłowy
Program wynikowy
Tablica symboli
Obsługa błędów
Zadania:•weryfikacja poprawności składniowej programu źródłowego•wykrycie i neutralizacja błędów składniowych•transformacja struktury programu do postaci drzewa wywodu
![Page 16: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/16.jpg)
Formalna gramatykabezkontekstowa
• Zbiór tokenów (symboli leksykalnych) zwanych symbolami terminalnymi
• Zbiór symboli nieterminalnych• Zbiór produkcji, z których każda składa się
z symbolu nieterminalnego, zwanego lewą stroną produkcji, strzałki oraz sekwencji tokenów i symboli nieterminalnych, zwanej prawą stroną produkcji
• Jednego wyróżnionego symbolu nieterminalnego, zwanego symbolem startowym
16
![Page 17: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/17.jpg)
Analiza składniowaistrukcja_przypisania -> identyfikator ':=' wyrażenie
wyrażenie -> liczba wyrażenie -> identyfikator wyrażenie -> wyrażenie '+' wyrażenie wyrażenie -> wyrażenie '*' wyrażenie
17
instrukcja przypisania
identyfikator wyrażenie
wyrażenie
wyrażeniewyrażenie
identyfikator
pozycja := początek +
identyfikator
wyrażenie
tempo +
liczba
60
![Page 18: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/18.jpg)
Elementy kompilatora
18
Analizator leksykalny
Analizator składniowy
Analizator semantyczny
Gen. kodu pośredniego
Optymalizator kodu
Generator kodu
Program źródłowy
Program wynikowy
Tablica symboli
Obsługa błędów
Zadania:•weryfikacja poprawności semantycznej programu źródłowego•sprawdzenie czy zmienne są zadeklarowane•sprawdzenie zgodności pomiędzy parametrami aktualnymi i formalnymi procedur i funkcji•sprawdzenie czy obiekty nie są deklarowane wielokrotnie
![Page 19: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/19.jpg)
Analiza semantyczna
19
instrukcja przypisania
identyfikator wyrażenie
wyrażenie
wyrażeniewyrażenie
identyfikator
pozycja := początek +
identyfikator
wyrażenie
tempo +
liczba
60
inttireal
identyfikator
typ adres
pozycja real 0
poczatek real 8
tempo real 16
![Page 20: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/20.jpg)
Elementy kompilatora
20
Analizator leksykalny
Analizator składniowy
Analizator semantyczny
Gen. kodu pośredniego
Optymalizator kodu
Generator kodu
Program źródłowy
Program wynikowy
Tablica symboli
Obsługa błędów
Zadania:•generacja kodu pośredniego, niezależnego od sprzętu oraz wejściowego języka programowania•umożliwia przenośność kompilatora pomiędzy różnymi architekturami oraz językami•umożliwia implementację optymalizacji niezależnych od docelowej architektury oraz wejściowego języka programowania
![Page 21: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/21.jpg)
Generacja kodu pośredniego• Trójadresowy kod pośredni
– każdy rozkaz oprócz przypisania może mieć co najwyżej jeden operator
– podczas translacji kodu drzewa wyprowadzeń do kodu trójadresowego kompilator może wstawić dodatkowe zmienne tymczasowe przechowujące tymczasowe wyniki operacji
– niektóre z operacji trójadresowych mogą mieć mniej niż trzy argumenty
21
temp1 := inttoreal (60)temp2 := id1 * temp1temp3 := id2 + temp2id3 := temp3
![Page 22: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/22.jpg)
Elementy kompilatora
22
Analizator leksykalny
Analizator składniowy
Analizator semantyczny
Gen. kodu pośredniego
Optymalizator kodu
Generator kodu
Program źródłowy
Program wynikowy
Tablica symboli
Obsługa błędów
Zadania:•poprawa efektywności kodu wynikowego, ograniczenie rozmiaru oraz czasu wykonania programu•może być wykonywana na wielu poziomach (kod źródłowy, kod pośredni, kod wynikowy)
![Page 23: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/23.jpg)
Przykładowe algorytmy optymalizacji
• usuwanie kodu martwego• eliminacja podwyrażeń wspólnych• propagacja kopii• zmienne indukcyjne• redukcja mocy• użycie tożsamości algebraicznych
23
![Page 24: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/24.jpg)
Optymalizacja
24
temp1 := inttoreal (60)temp2 := id1 * temp1temp3 := id2 + temp2id3 := temp3
konwersja z liczby typu int na liczbę typu real na etapie generacji kodu
temp1 := tempo * 60.0pozycja := poczatek + temp1
redukcja zmiennej tmp3
![Page 25: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/25.jpg)
Elementy kompilatora
25
Analizator leksykalny
Analizator składniowy
Analizator semantyczny
Gen. kodu pośredniego
Optymalizator kodu
Generator kodu
Program źródłowy
Program wynikowy
Tablica symboli
Obsługa błędów
Zadania:•wygenerowanie kodu wynikowego w postaci:
•kodu asemblera•przemieszczalnego kodu maszynowego•gotowego programu wykonywalnego
•wybór rozkazów•przydział rejestrów
![Page 26: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/26.jpg)
Generacja kodu
26
pozycja := poczatek + tempo * 60
MOVF 16, R2MULF #60.0, R2MOVF 8, R1ADDF R2, R1MOVF R1,0
identyfikator
typ adres
pozycja real 0
poczatek real 8
tempo real 16
![Page 27: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/27.jpg)
Translacja pojedynczej instrukcji
27
Analizator leksykalny
pozycja := poczatek + tempo * 60
id1 := id2 + id3 * 60
:=
id1 +
id2id3
*
60
Analizator składniowy
Analizator semantyczny
id1
:=+
id2id3
*
60
inttoreal
Generacja kodu pośredniego
temp1 := inttoreal (60)temp2 := id1 * temp1temp3 := id2 + temp2id3 := temp3
Optymalizator kodu
temp1 := tempo * 60.0pozycja := poczatek + temp1
Generator kodu
MOVF 16, R2MULF #60.0, R2MOVF 8, R1ADDF R2, R1MOVF R1,0
![Page 28: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/28.jpg)
Przykład: budowa kompilatora gcc
28
Brak tablicy symboli !!!
![Page 29: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/29.jpg)
Generacja kodu
• Procesor docelowy– architektura harwardzka– architektura pamięć-pamięć– kompilacja do postaci asemblera
symbolicznego• z adresami bezwzględnymi zmiennych• z adresami symbolicznymi rozkazów
• Dostępna implementacja wzorcowa kompilatora oraz maszyny wirtualnej
29
![Page 30: Techniki kompilacji](https://reader036.vdocuments.mx/reader036/viewer/2022062315/568150af550346895dbec9ef/html5/thumbnails/30.jpg)
Dziękuję za uwagę
30