Zadanie 1

Program w języku Instant składa się z ciągu instrukcji rozdzielonych średnikami.

Instrukcje są dwojakiego rodzaju:

Wyrażenia składają się z literałów całkowitych nieujemnych, zmiennych i operacji arytmetycznych. Kolejność obliczenia argumentów operatora nie jest określona (można sobie wybrać wygodniejszą).

Składnia w formacie BNFC

Prog. Program ::= [Stmt] ;
SAss. Stmt ::= Ident "=" Exp;
SExp. Stmt ::= Exp ;
separator Stmt ";" ;

ExpAdd.            Exp1   ::= Exp2 "+"  Exp1 ;
ExpSub.            Exp2   ::= Exp2 "-"  Exp3 ;
ExpMul.            Exp3   ::= Exp3 "*"  Exp4 ;
ExpDiv.            Exp3   ::= Exp3 "/"  Exp4 ;
ExpLit.            Exp4   ::= Integer ;
ExpVar.            Exp4   ::= Ident ;
coercions Exp 4;

Uwaga:

Zadanie polega na napisaniu kompilatora dla języka Instant do JVM i LLVM.

W tym zadaniu wygenerowany kod powinien wykonywać wszystkie wyspecyfikowane operacje. Nie jest zatem na przykład dozwolone zastapienie wyrazenia 2+3 przez stałą 5, pominiecie przypisań na nieużywane zmienne itp. Usprawnianiem generowanego kodu zajmiemy się w kolejnych zadaniach.

Jedynym dozwolonym, a nawet pożądanym usprawnieniem jest wybór takiej kolejności obliczania podwyrażeń aby zminimalizować potrzebny rozmiar stosu JVM. W każdym wypadku potrzebny rozmiar stosu musi być obliczony i zadeklarowany (za podejścia typu "limit stack 1000" obcinamy punkty). Podobnie należy obliczyć i zadeklarować liczbę wykorzystywanych zmiennych lokalnych.

Wymagania techniczne

  1. Projekt powinien być oddany w postaci spakowanego archiwum TAR (.tar.gz lub .tgz)
  2. W korzeniu projektu muszą się znajdować co najmniej:
  3. Program musi się kompilować na students poleceniem make (które oczywiście może wywoływać inne programy).
  4. Wszelkie używane biblioteki (poza biblioteką standardową używanego jezyka programowania) muszą być opisane w README
  5. Po zbudowaniu kompilatora, w korzeniu muszą się znajdować pliki wykonywalne o nazwie insc_jvm oraz insc_llvm

  6. Wykonanie insc_jvm foo/bar/baz.ins dla poprawnego programu wejściowego baz.ins 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ć w klasie Runtime.class w katalogu lib

    Wykonanie insc_llvm foo/bar/baz.ins dla poprawnego programu wejściowego baz.ins ma stworzyć pliki baz.ll (tekstowy kod LLVM) oraz baz.bc (bitkod LLVM wykonywalny przy uzyciu lli) w katalogu foo/bar

Punktacja:

Za to zadanie można uzyskać maksymalnie 6p. W przybliżeniu

Spóźnienia

Programy oddane po terminie będą obciążane karą 1p za każdy (rozpoczęty) tydzień opóźnienia. Ostatecznym terminem, po którym programy nie będą przyjmowane ("termin poprawkowy") jest 8 grudnia.

Zasady

Projekt zaliczeniowy ma być pisany samodzielnie. Wszelkie przejawy niesamodzielności będą karane. W szczególności:

Programy przykładowe

Paczka instant141022.tgz zawiera programy przykładowe i ich oczekiwane wyjście, oraz plik Instant.cf z gramatyką w formacie BNFC.

Zmiany


© 2014 Marcin Benke