Technika Kompilacji
Zaliczenie
Zaliczenie przedmiotu odbywa sie na podstawie laboratorium,
zgodnie z regulaminem oraz egzaminu pisemnego.
Projekt musi byc samodzielny. Dopuszczalna i wskazana jest wymiana
idei i algorytmow pomiedzy poszczegolnymi studentami, niedopuszczalna
zas jest wymiana kodu źródłowego programow - konsekwencje tego poniesie
zarowno osoba udostepniajaca swoje programy, jak i kopiujaca cudze.
Terminy egzaminów
04.02.2025 15:15 aula A1
07.02.2025 12:15 aula A1
11.02.2025 15:15 aula A1
Propozycje tematow prac dyplomowych
Studentów zainteresowanych pracami dyplomowymi z dziedziny kompilatorów związanymi z zagadnieniami optymalizacji w kompilatorze LLVM proszę o kontakt.
Rozne materialy pomocnicze
Kilka wskazowek do projektu kompilatora
- Najwazniejszym (i chyba najtrudniejszym) elementem projektu jest tworzenie
tablicy symboli i okreslenie adresow zmiennych w pamieci. Reszta juz "idzie
sama" wedlug podrecznika. Nalezy wprowadzic zmienne zwykle i referencyjne -
te ostatnie na argumenty funkcji, wartosci zwracane i elementy tablic.
- Wszystkie zmienne, stale i etykiety umiesc w tablicy symboli. Ulatwia to
ujednolicenie genereracji kodu, atrybuty wszystkich wezlow moga byc pojedynczymi
liczbami calkowitymi, zawierajacymi indeks zmiennej, w ktorej znajduje
sie wynik podwyrazenia.
- Wygodnie jest napisac funkcje
void gencode(const string& m, int v1, varmode lv1, int v2, varmode lv2, int v3,varmode lv3);
w ktorej m jest kodem operacji, parametry typu int sa indeksami w tablicy symboli, a parametry typu varmode
okreslaja, czy chodzi o wartosc, czy adres zmiennej. Typ operacji (calkowita czy rzeczywista)
mozna okreslic na podstawie typu pierwszego operandu.
- Wydziel to, co wspolne, i napisz oddzielna funkcje.
Np.: konwersje typow dla wszystkich operatorow
dwuargumentowych sa identyczne.
- Jezeli jakas funkcja zajmuje wiecej, niz jeden ekran, to przypuszczalnie jest
za dluga
- Nie wynajduj ponownie kola.
Korzystaj z STL. Vector<> Twoim przyjacielem. String rowniez.
Map<> sie raczej nie przyda. Nie korzystaj z buforow o stalej dlugosci -
zgodnie z prawami Murphy'ego beda zawsze
o jeden bajt za krotkie.
- Adres elementu tablicy oblicz jako liczbe calkowita, a potem zmien
w tablicy symboli typ zmiennej zawierajacej ten adres
na referencje do integer lub real. W ten
sposob mozesz z niej korzystac po obu stronach operatora przypisania.
- Rozmiar obszaru zmiennych lokalnych poznasz dopiero po wygenerowaniu kodu
dla calej funkcji. Generuj kod do pamieci, a potem wygeneruj prolog funkcji
i przepisz do pliku cialo funkcji.
- Lekser to 100 linii, parser 1000, tablica symboli 200. Jezeli Twoj program ma wiecej,
cos zbytnio komplikujesz.
- Nie buduj abstrakcyjnego drzewa składniowego. Taka wersja zostanie zwrocona do poprawki.
- W razie watpliwosci pytaj prowadzacego. Nie odkladaj tego na ostatnia
chwile, do dnia w ktorym uplywa termin oddawania projektu
Literatura
Podstawowa
- A.V. Aho, R. Sethi, J. D. Ullman, "Compilers - Principles, Techniques, and Tools", Addison-Wesley 1986 (polskie wydanie WNT 2002)
Uzupelniajaca
- John R. Levine, "Linkers and Loaders", Morgan Kaufmann Publishers 1999 (manuskrypt dostepny online)
- W. M. Waite, G. Goos, "Konstrukcja kompilatorow", WNT 1989
- S. S. Muchnick, "Advanced Compiler Design and Implementation", Morgan Kaufmann Publishers 1997
Aktualizacja: 10.12.2021