Laboratorium MRJP - projekt zaliczeniowy
Zaliczenie laboratorium odbywa się na podstawie projektu obejmującego
implementację kompilatora dla prostego jezyka imperatywnego Latte.
Etapy
Projekt składa się z trzech etapów
- Front-end: analiza składniowa i semantyczna. Termin 18 listopada.
- Generator kodu dla JVM. Termin 16 grudnia.
- Generator kodu dla LLVM albo x86 oraz ewentualne rozszerzenia. Termin 20 stycznia.
Prowadzący grupę może wyznaczyć inne terminy, w szczególności wymagać osobistej prezentacji projektu. Niezależnie od dodatkowych wymagań prowadzącego, projekt musi być oddany za pośrednictwem moodle.
Punktacja
Łącznie do zdobycia jest maksymalnie 30 punktów, które liczą się do ostatecznej oceny z przedmiotu. Dla zaliczenia laboratorium (i dopuszczenia do egzaminu) należy oddać zadowalające implementacje wszystkich etapów i uzyskać łącznie co najmniej 15p.
Punkty mozna uzyskać za:
- front-end (4)
- dodatkowo do 2 punktów, jesli parser jest napisany bez użycia generatora
- back-end JVM (5)
- back-end LLVM (8) albo x86 (10)
- kod LLVM w postaci SSA - dodatkowo 1p
- alokacja rejestrów dla x86 - dodatkowo do 3p
- optymalizacje - do 3p
- Rozszerzenia (notacja x/y oznacza punkty za backend w wersji odpowiednio LLVM/x86)
- tablice (2)
- struktury (2)
- obiekty (atrybuty, metody, dziedziczenie bez zastępowania metod)
- dodatkowo (3/4)
- metody wirtualne - dodatkowo (3/4), czyli za obiekty z metodami wirtualnymi mozna uzyskać 8/10 punktów.
- odśmiecanie (2)
Szczegółowy opis rozszerzeń zawarty jest w opisie języka.
Uwaga: punktacja trzeciego etapu może ulegać jeszcze korektom do czasu jego rozpoczęcia.
Spóźnienia, termin poprawkowy
Programy oddane po terminie będą obciążane karą 2p za każdy (rozpoczęty) tydzień opóźnienia. Ostatecznym terminem, po którym programy nie będą przyjmowane ("termin poprawkowy") jest 22 lutego.
Zasady
Projekt zaliczeniowy ma być pisany samodzielnie.
Wszelkie przejawy niesamodzielności będą karane. W szczególności:
- nie wolno oglądać kodu innych studentów, pokazywać,
ani w jakikolwiek sposób udostępniać swojego kodu
- wszelkie zapożyczenia powinny być opisane z podaniem źródła.
Wymagania techniczne
- Projekt powinien być oddany w postaci spakowanego archiwum TAR (.tar.gz lub .tgz)
- W korzeniu projektu muszą się znajdować co najmniej:
- Plik tekstowy README opisujący szczegóły kompilacji i uruchamiania programu, używane narzędzia i biblioteki, zaimplementowane rozszerzenia, strukturę katalogów projektu, ewentualnie odnośniki do bardziej szczegółowej dokumentacji.
- Plik Makefile pozwalający na zbudowanie programu.
- katalog src zawierający wyłącznie pliki źródłowe projektu (plus ewentualnie dostarczony przez nas plik Latte.cf); pliki pomocnicze takie jak biblioteki itp powinny być umieszczone w inych katalogach.
- Program musi się kompilować na students poleceniem make (które oczywiście może wywoływać inne programy).
- Wszelkie używane biblioteki (poza biblioteką standardową używanego jezyka programowania) muszą być opisane w README
- Po zbudowaniu kompilatora, w korzeniu musi się znajdować plik wykonywalny o nazwie latc (może być skryptem uruchamiającym inne programy)
- Kompilator musi akceptować wszystkie programy testowe z katalogu good
i odrzucać ze stosownym komunikatem wszystkie programy z katalogu bad. Dla rozszerzeń musi akceptować wszystkie programy z odpowiednich podkatalogów extension. Uruchomienie poprawnego programu testowego ma dawać wyjście takie jak w odpowiednim pliku .output
(dla wejścia zawartego w odpowiednim pliku .input, o ile istnieje)
- Gdy kompilator akceptuje program, musi wypisać w pierwszej linii stderr napis OK ("OK\n"). Dalsze linie i stdout - dowolne. Kompilator musi się w takiej sytuacji zakończyć z kodem powrotu 0.
- Gdy kompilator odrzuca program musi wypisać w pierwszej linii stderr napis
ERROR ("ERROR\n"). Dalsze linie powinny zawierać stosowne informacje o błędach.
Kompilator musi się w takiej sytuacji zakończyć z kodem powrotu różnym od 0.
Etap II - generacja kodu JVM
Program musi spełniać wszystkie warunki opisane powyżej, a ponadto:
- Wykonanie latc foo/bar/baz.lat dla poprawnego programu wejściowego
baz.lat ma stworzyć pliki baz.j (kod Jasmin)
oraz baz.class w katalogu foo/bar (przydatna może być opcja
-d dla Jasmina).
- Wykorzystywany jasmin.jar należy umieścić w katalogu lib
- Ewentualne metody biblioteczne (printInt etc.) należy umieścić wc klasie Runtime.class w katalogu lib
Etap III - generacja kodu LLVM
- Po wykonaniu make w korzeniu projektu ma się znajdować program wykonywalny latc_llvm
- Wykonanie latc_llvm foo/bar/baz.lat dla poprawnego programu wejściowego
baz.lat ma stworzyć pliki baz.ll (kod LLVM) oraz wykonywalny a.out w katalogu foo/bar.
- Ewentualne funkcje biblioteczne (printInt etc.) należy umieścić w pliku runtime.bc w katalogu lib
Etap III - generacja kodu asemblera
- Po wykonaniu make w korzeniu projektu ma się znajdować program wykonywalny latc_ARCH gdzie ARCH to x86 lub x86_64
- Wykonanie latc_ARCH foo/bar/baz.lat dla poprawnego programu wejściowego
baz.lat ma stworzyć pliki baz.s (kod asemblera) oraz wykonywalny a.out w katalogu foo/bar.
- Ewentualne funkcje biblioteczne (printInt etc.) należy umieścić w pliku runtime.o w katalogu lib (dodatkowo proszę zamieścić jego źródło)
Archiwum z programami testowymi:
lattests121017.tgz z 17.10.2012,
MD5:49ca5702ca9795fb8f33d52b0b3c6fc3