SW wykład 7 - Slajd14

Z Studia Informatyczne
Wersja z dnia 15:58, 29 wrz 2006 autorstwa Dorota (dyskusja | edycje)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacjiPrzejdź do wyszukiwania

<<powrót do strony wykładu

Kontynuacje Kontynuacje wyrażeń i deklaracji Tiny+++ Dziedziny semantyczne Funkcje semantyczne Przykłady klauzul [[SW_wykład_7_-_Slajd7|Przykłady klauzul, c.d.] Instrukcje Bloki Skoki Semantyka skoków Semantyka skoków, c.d. Semantyka skoków, c.d. Semantyka skoków, c.d. Semantyka "standardowa"

Aby dokończyć definiowanie semantyki języka TINY rozszerzonego o skoki, musimy jeszcze podać klauzule semantyczne dla nowych postaci instrukcji oraz zmodyfikować klauzulę dla instrukcji bloku.

To pierwsze jest łatwe: zwykła semantyka instrukcji po prostu pomija etykietę wprowadzaną w instrukcji etykietowanej. Dla instrukcji bloku zaś, w danym środowisku zmiennych, procedur i etykiet, przy dowolnej kontynuacji "za" instrukcją skoku --- pomijamy tę kontynuację całkowicie, a wykorzystujemy kontynuację przypisaną w danym środowisku etykiecie, do której wykonywany jest skok. Jest to niezwykle prosty i niezwykle piękny zapis semantyki skoku: pomijamy to, co mieliśmy robić zgodnie ze "zwykłym" przepływem sterowania, a wykonujemy obliczenia zapisane pod daną etykietą. Pomijamy tu oczywiście problemy możliwego pojawienia się błędu, jeśli dana etykieta nie jest widoczna (w środowisku etykiet nie jest jej przypisana kontynuacja --- wynikiem wówczas powinna być kontynuacja budująca pusty potok wyjściowy zakończony sygnałem błędu).

Klauzula dla bloku jest teraz jednak dość skomplikowana. W danym środowisku zmiennych, danym środowisku procedur i danym środowisku etykiet i kontynuacji "za" blokiem, najpierw elaborujemy deklaracje zmiennych w danym środowisku zmiennych i kontynuacji dla deklaracji zmiennych, która otrzymując wynik tej elaboracji rozpoczyna od elaboracji deklaracji procedur w otrzymanym środowisku zmiennych i danych środowiskach procedur i etykiet, przy kontynuacji dla deklaracji procedur, która otrzymawszy wynik elaboracji deklaracji procedur w bloku, wykonuje instrukcję ciała bloku w otrzymanym wcześniej środowisku zmiennych, w otrzymanym właśnie środowisku procedur oraz w rozszerzonym środowisku etykiet, przy kontynuacji "za" blokiem. Rozszerzone środowisko etykiet dla ciała danego bloku otrzymujemy wykorzystując zdefiniowaną wyżej pomocniczą funkcję semantyczną dla instrukcji, wydobywającą z ciała bloku środowisko wprowadzanych w nim etykiet. Oczywiście, ponieważ instrukcje skoków mogą powodować powtarzanie wykonania różnych fragmentów ciała bloku, musimy dopuścić tu "rekurencyjne" wykorzystanie wprowadzanych etykiet, stosując odpowiednią definicję stałopunktową budowanego środowiska etykiet.

Uff! Wydaje się to dobrze i w pełni definiować semantykę języka TINY ze skokami. Pozostaje jednak do doszlifowania kilka drobiazgów technicznych. Po pierwsze, jak zapowiadaliśmy, należy przyjąć, że etykiety w danym bloku nie powtarzają się --- i semantyka musi zawierać (łatwe) sprawdzenie tego warunku. Po drugie, powyższa klauzula dla bloków elaboruje deklarowane w nim procedury w środowisku etykiet zewnętrznym dla danego bloku. Sensowne wydaje się dopuszczenie także możliwości skoków z ciała deklarowanych tu procedur do etykiet wprowadzonych w tym bloku i zatem odpowiednia modyfikacja powyższej klauzuli (przez dodanie środowiska etykiet zbudowanego dla ciała pętli do środowiska etykiet przyjmowanego przy elaboracji deklaracji procedur w tym bloku). I w końcu, rekurencyjne rozwikłanie stałopunktowej definicji środowiska etykiet dla instrukcji ciała bloku (przez iteracje odpowiedniego operatora, jak dla instrukcji pętli) pokazuje, że może tu nastąpić kłopot: etykiety, które były widoczne na zewnątrz (w pierwotnie danym środowisku etykiet miały przypisaną jakąś kontynuację), a teraz zostają wprowadzone ponownie w tym bloku jako etykiety w nim lokalne, mogą zostać źle zinterpretowane (przypisana im na zewnątrz kontynuacja pozostanie). To oczywiscie nie jest zgodne z naszymi oczekiwaniami i wymaga też modyfikacji klauzuli. Odpowiednim zabiegiem jest lokalne "oddefiniowania" tych zewnętrznych etykiet przed wykorzystaniem zewnętrznego środowiska dla ciała tego bloku.

Warto też zwrócić uwagę, że w podawanych tu opisach semantycznych wszelkiego rodzaju deklaracji (zmiennych, procedur, etykiet) przyjęliśmy, że wynikiem elaboracji takich deklaracji jest "duże" środowisko, obejmujące nie tylko obiekty właśnie deklarowane, ale też te widoczne na zewnątrz. Zatem wynikowe środowiska rozszerzają środowiska zbudowane dotychczas (lub przesłaniają występujące w nich obiekty, jeśli zostają one tu zadeklarowane ponownie). Możliwe i często wygodne jest nieco inne podejście, gdzie wynikiem elaboracji deklaracji jest "małe" środowisko, zawierające tylko obiekty właśnie zadeklarowane. Wówczas wykorzystujące je klauzule semantyczne muszą wyraźnie zsumować efekty właśnie przeprowadzonej elaboracji deklaracji, dane w postaci takiego "małego" środowiska, ze środowiskiem zewnętrznym. Ta operacja stanowi pewien dodatkowy "koszt" takiego podejścia, ale pozostawia też dodatkową informację, rozróżniając właśnie wprowadzone obiekty od tych, które są "dziedziczone" z zewnątrz.

Podsumowując prezentację semantyki dla skoków, dwie uwagi. Po pierwsze, kontynuacje to naprawdę wygodne i naturalne narzędzie dla opisu niestandardowych konstrukcji zmieniających zwykły przepływ sterowania w programie. Po drugie jednak, nie ma nic za darmo: opis skomplikowanych konstrukcji językowych (takich jak na przykład skoki) nie może być bardzo prosty.