Zadanie na 15.12.2007 (dla chetnych)
|
Interpreter i maszyna abstrakcyjna dla jezyka Mini-Scheme
Zaimplementuj interpreter, a nastepnie przetransformuj go do
semantycznie rownowaznej mu maszyny abstrakcyjnej dla jezyka, ktory
nazwiemy Mini-Scheme.
Mini-Scheme jest beztypowym jezykiem funkcyjnym z aplikatywna (CBV)
strategia ewaluacji, rozszerzonym o kontynuacje pierwszej klasy oraz
modyfikowalny stan. Minimalny zestaw konstrukcji, ktore jezyk powinien
zawierac jest nastepujacy:
- stale numeryczne (calkowite) i podstawowe operacje arytmetyczne
- stale logiczne i operacje logiczne
- listy (pary?) i operacje do ich konstrukcji i destrukcji
- wyrazenie warunkowe if
- zmienne, funkcje anonimowe i aplikacje jednego wyrazenia do drugiego
- wyrazenie let -- definicje lokalne
- wyrazenie letrec -- rekursywne definicje lokalne, najlepiej
umozliwiajace rekursje wzajemna
- definicje funkcji, w tym rekursywnych, najlepiej wspierajace
rekursje wzajemna
- operator call/cc
- operator error (abort)
- wyrazenie modyfikujace wartosc zmiennej (:= w MLu lub set! w Schemie)
Interpreter powinien korzystac ze srodowiska i sterty (heap) do
implementacji zwiazania zmiennych z wartosciami przy zachowaniu
mozliwosci imperatywnej zmiany ich wartosci oraz z kontynuacji do
zaimplementowania operatorow kontroli.
|
Mozliwe rozszerzenia:
- Wzbogacenie jezyka o operatory shift i reset dla kontynuacji
ograniczonych. Tu trzeba sie zastanowic nad semantyka operatorow
call/cc i abort, jesli chce sie je utrzymac w jezyku.
- Wzbogacenie maszyny abstrakcyjnej o prosty Garbage Collector.
- Wzbogacenie jezyka o wyjatki, przy czym powinno byc to latwiejsze
na poziomie maszyny abstrakcyjnej. Tu trzeba sie zastanowic nad
wspolpraca mechanizmu obslugi wyjatkow z operatorami kontroli.
- Parser dla jezyka Mini-Scheme. Skladnia konkretna nie musi
przypominac tej z Lispa :).
- Prosty system typow, czyli przejscie w kierunku MiniML-a. Po
zaimplementowaniu rekonstrukcji typow monomorficznych, mozna
sprobowac wprowadzic let-polimorfizm do jezyka.
|
Ksiazka Felleisena i Flatta powinna byc pomocna w rozwiazaniu
powyzszego zadania i w zaimplementowaniu wiekszosci z proponowanych
rozszerzen na poziomie maszyny abstrakcyjnej. Prosze
jednak nie nasladowac jej bez namyslu, bo nie wszystkie
proponowane tam rozwiazania sa tak eleganckie jak moglyby byc, a poza
tym interesujacym pytaniem jest czy odpowiadajace im rozwiazania mozna
wprowadzic na poziomie interpretera, tak by funkcyjna odpowiedniosc
miedzy nim a maszyna abstrakcyjnej byla zachowana.
|
|