SW wykład 7 - Slajd14: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Arturas (dyskusja | edycje)
Nie podano opisu zmian
Tarlecki (dyskusja | edycje)
Nie podano opisu zmian
Linia 1: Linia 1:
{{Semantyka i weryfikacja programów/Wykład 7}}
{{Semantyka i weryfikacja programów/Wykład 7}}
[[Grafika:sw0713.png|center|frame]]
[[Grafika:sw0713.png|center|frame]]
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
(prze 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.

Wersja z 13:11, 28 wrz 2006

<<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 (prze 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.