Techniki kompilacji Wykład I.

Slides:



Advertisements
Podobne prezentacje
Tablice 1. Deklaracja tablicy
Advertisements

Lingwistyka Matematyczna
Język C/C++ Funkcje.
Mgr inż.Marcin Borkowski Podstawy Java Krótkie wprowadzenie dla studentów Wyższej Szkoły Ekologii i Zarządzania
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 języka skryptowego PHP – cz. 2
Wprowadzenie do C++ Zajęcia 2.
Języki programowania C++
PROGRAMOWANIE STRUKTURALNE
PROGRAMOWANIE STRUKTURALNE
Generator analizatorów składniowych
Podstawowe składniki funkcjonalne procesora i ich rola.
Programowanie imperatywne i język C Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie.
Programowanie imperatywne i język C
Języki formalne i gramatyki
Programowanie imperatywne i język C Copyright, 2005 © Jerzy R. Nawrocki Wstęp.
Programowanie imperatywne i język C Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie.
Podstawy informatyki Rekurencja i rekurencja Grupa: 1A
Kurs Pascala – spis treści
Tablice.
Język ANSI C Operacje we/wy
Wykład 2 struktura programu elementy języka typy zmienne
Wyrażenia Wyrażenie w Fortranie jest poprawną syntaktycznie kombinacją zmiennych, stałych, operatorów i funkcji. Wyrażenia są jednozdaniowymi przepisami.
Wprowadzenie do programowania w języku Turbo Pascal
Programowanie w języku Fortran 95
Podstawy programowania
Technika Mikroprocesorowa 1
Podstawy programowania II Wykład 2: Biblioteka stdio.h Zachodniopomorska Szkoła Biznesu.
Podstawy programowania w języku C i C++
Podstawy programowania
KONSTRUKCJA KOMPILATORÓW WYKŁAD WYKŁAD Robert Plebaniak Robert Plebaniak.
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
TABLICE C++.
Generator analizatorów leksykalnych
Informatyka I - Wykład ANSI C
Generator analizatorów składniowych
Podstawy programowania w języku C i C++
5 Etapów Pracy Kompilatora
Andrzej Repak Nr albumu
Jerzy Kotowski Politechnika Wrocławska
Programowanie strukturalne i obiektowe
Maszyna wirtualna ang. virtual machine, VM.
POŚREDNIK Jak reprezentowana jest informacja w komputerze? liczby – komputer został wymyślony jako zaawansowane urządzenie służące do wykonywania.
Podstawy informatyki 2013/2014
Gramatyki i translatory
Projektowanie stron WWW
Podstawy języka Instrukcje - wprowadzenie
Podstawy programowania
Metody numeryczne metody rozwiązywania problemów matematycznych za pomocą operacji na liczbach. Otrzymywane tą drogą wyniki są na ogół przybliżone, jednak.
C++.
Generowanie kodu pośredniego
Zmienne i typy danych w C#
Generowanie kodu pośredniego Java ML Pascal C C++ Alpha Pentium Sparc Java ML Pascal C C++ Alpha Pentium Sparc MIPS IR IR – intermediate representation.
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)
Wprowadzenie do programowania w Pascalu mgr inż. Agata Pacek.
Programowanie imperatywne i język C Copyright, 2007 © Jerzy R. Nawrocki Wstęp do.
Podstawy programowania
Podsumowanie wiedzy MPDI2 sem.3 INFORMATYKA. tworzenie nowego pliku i katalogu, nawigacja po katalogach, listowanie zawartości katalogu, zmiana nazw,
Seminarium Dyplomowe: Metodyka i Techniki Programowania Autor: Bartłomiej Fornal.
Wstęp do programowania Wykład 9
Wstęp do programowania Wykład 2 Dane, instrukcje, program.
P ASCAL Definicje, deklaracje, podstawowe instrukcje 1.
Programowanie strukturalne i obiektowe Klasa I. Podstawowe pojęcia dotyczące programowania 1. Problem 2. Algorytm 3. Komputer 4. Program komputerowy 5.
Grzegorz Cygan Wstęp do programowania mikrosterowników w języku C
Przykładowy algorytm geometryczny (geometria płaska)
Założenia projektowe Javy
Zapis prezentacji:

Techniki kompilacji Wykład I

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

Literatura Podstawowa Uzupełniająca 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

Zagadnienia Część teoretyczna Część praktyczna 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)

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

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)

System przetwarzania języków .file "main.c" .section .rodata .LC0: .string "Hello world" .text .globl main .type main, @function main: .LFB2: pushq %rbp .LCFI0: movq %rsp, %rbp .LCFI1: movl $.LC0, %edi call puts movl $0, %eax leave ret Szkieletowy program główny gcc –E test.c –o test.i Preprocesor #include <stdio.h> int main() { printf("Hello world\n"); return 0; } Program źródłowy gcc –S test.c –o test.s Kompilator 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; } Wynikowy program w asemblerze as test.s –o test.o Asembler Przemieszczalny kod maszynowy Biblioteki, przemieszczalne pliki obiektowe gcc test.o –o test Program ładujący/konsolidator Bezwzględny kod maszynowy

Analizator leksykalny Analizator składniowy Analizator semantyczny Elementy kompilatora Program źródłowy Analizator leksykalny Analizator składniowy Analizator semantyczny Tablica symboli Obsługa błędów Gen. kodu pośredniego Optymalizator kodu Generator kodu Program wynikowy

Analizator leksykalny Analizator składniowy Analizator semantyczny Elementy kompilatora Program źródłowy Analizator leksykalny 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 kodu Analizator składniowy Analizator semantyczny Tablica symboli Obsługa błędów Gen. kodu pośredniego identyfikator typ adres pozycja real poczatek 8 tempo 16 Optymalizator kodu Generator kodu Program wynikowy

Analizator leksykalny Analizator składniowy Analizator semantyczny Elementy kompilatora Program źródłowy Analizator leksykalny W przypadku błędu nie przerywamy procesu kompilacji, próbujemy zastosować techniki odzyskiwania kontroli Rodzaje 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) Analizator składniowy Analizator semantyczny Tablica symboli Obsługa błędów Gen. kodu pośredniego Optymalizator kodu Generator kodu Program wynikowy

Analizator leksykalny Analizator składniowy Analizator semantyczny Elementy kompilatora 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 Program źródłowy Analizator leksykalny Analizator składniowy Analizator semantyczny Tablica symboli Obsługa błędów Gen. kodu pośredniego Optymalizator kodu Generator kodu Program wynikowy

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)

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.

Analizator leksykalny Leksemy: pozycja := poczatek + tempo * 60 Symbole leksykalne: identyfikator op_przypisania op_add op_mul identyfikator identyfikator liczba 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 odejmowania op_mul: operatory mnożenia i dzielenia op_przypisania: operator składający się ze znaku „:” po którym następuje znak „=„ identyfikator typ adres pozycja real poczatek 8 tempo 16

Analizator leksykalny Analizator składniowy Analizator semantyczny Elementy kompilatora Program źródłowy 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 Analizator leksykalny Analizator składniowy Analizator semantyczny Tablica symboli Obsługa błędów Gen. kodu pośredniego Optymalizator kodu Generator kodu Program wynikowy

Formalna gramatyka bezkontekstowa 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

instrukcja przypisania Analiza składniowa istrukcja_przypisania -> identyfikator ':=' wyrażenie wyrażenie -> liczba wyrażenie -> identyfikator wyrażenie -> wyrażenie '+' wyrażenie wyrażenie -> wyrażenie '*' wyrażenie instrukcja przypisania identyfikator wyrażenie wyrażenie wyrażenie identyfikator wyrażenie wyrażenie identyfikator liczba pozycja := początek + tempo + 60

Analizator leksykalny Analizator składniowy Analizator semantyczny Elementy kompilatora Program źródłowy 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 Analizator leksykalny Analizator składniowy Analizator semantyczny Tablica symboli Obsługa błędów Gen. kodu pośredniego Optymalizator kodu Generator kodu Program wynikowy

instrukcja przypisania Analiza semantyczna instrukcja przypisania identyfikator wyrażenie wyrażenie wyrażenie identyfikator inttireal wyrażenie wyrażenie identyfikator liczba pozycja := początek + tempo + 60 identyfikator typ adres pozycja real poczatek 8 tempo 16

Analizator leksykalny Analizator składniowy Analizator semantyczny Elementy kompilatora Program źródłowy Analizator leksykalny Analizator składniowy Analizator semantyczny Tablica symboli Obsługa błędów Gen. kodu pośredniego 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 Optymalizator kodu Generator kodu Program wynikowy

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 temp1 := inttoreal (60) temp2 := id1 * temp1 temp3 := id2 + temp2 id3 := temp3

Analizator leksykalny Analizator składniowy Analizator semantyczny Elementy kompilatora Program źródłowy Analizator leksykalny Analizator składniowy Analizator semantyczny Tablica symboli Obsługa błędów Gen. kodu pośredniego 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) Optymalizator kodu Generator kodu Program wynikowy

Przykładowe algorytmy optymalizacji usuwanie kodu martwego eliminacja podwyrażeń wspólnych propagacja kopii zmienne indukcyjne redukcja mocy użycie tożsamości algebraicznych

Optymalizacja temp1 := inttoreal (60) temp2 := id1 * temp1 konwersja z liczby typu int na liczbę typu real na etapie generacji kodu redukcja zmiennej tmp3 temp1 := tempo * 60.0 pozycja := poczatek + temp1

Analizator leksykalny Analizator składniowy Analizator semantyczny Elementy kompilatora Program źródłowy Analizator leksykalny Analizator składniowy Analizator semantyczny Tablica symboli Obsługa błędów Gen. kodu pośredniego Optymalizator kodu Zadania: wygenerowanie kodu wynikowego w postaci: kodu asemblera przemieszczalnego kodu maszynowego gotowego programu wykonywalnego wybór rozkazów przydział rejestrów Generator kodu Program wynikowy

pozycja := poczatek + tempo * 60 Generacja kodu pozycja := poczatek + tempo * 60 MOVF 16, R2 MULF #60.0, R2 MOVF 8, R1 ADDF R2, R1 MOVF R1,0 identyfikator typ adres pozycja real poczatek 8 tempo 16

Translacja pojedynczej instrukcji pozycja := poczatek + tempo * 60 Generacja kodu pośredniego Analizator leksykalny temp1 := inttoreal (60) temp2 := id1 * temp1 temp3 := id2 + temp2 id3 := temp3 id1 := id2 + id3 * 60 Analizator składniowy Optymalizator kodu := id1 + id2 id3 * 60 temp1 := tempo * 60.0 pozycja := poczatek + temp1 Generator kodu Analizator semantyczny MOVF 16, R2 MULF #60.0, R2 MOVF 8, R1 ADDF R2, R1 MOVF R1,0 id1 := + id2 id3 * 60 inttoreal

Przykład: budowa kompilatora gcc Brak tablicy symboli !!!

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

Dziękuję za uwagę