Semantyka i weryfikacja programów/Ćwiczenia 6
Zawarto¶æ
Ostatnie zajêcia po¶wiêcone semantyce naturalnej. Rozszerzymy jêzyk Tiny o deklaracje zmiennych i procedur z jednym parametrem. Rozwa¿ymy statyczn± i dynamiczn± widoczno¶æ (wi±zanie) identyfikatorów oraz ró¿ne mechanizmy przekazywania parametrów. Pracujemy ze ¶rodowiskami i stanami.
Semantyka naturalna procedur
Ćwiczenie 1 (procedury)
Rozszerzmy jêzyk Tiny o deklaracje i wywo³ania procedur:
Konstrukcja deklaruje procedurê o nazwie , której parametrem formalnym jest . Zak³adamy statyczne wi±zanie identyfikatorów i przekazywanie parametrów przez zmienn± (to znaczy, ¿e w momencie wywo³ania procedury, powinna zostaæ przekazana lokacja odpowiadaj±ca parametrowi aktualnemu). Instrukcja wywo³uje procedurê z parametrem aktualnym .
Rozwiązanie
Ćwiczenie 2 (wi±zanie dynamiczne)
Zastanówmy siê, jakich modyfikacji wymaga nasza semantyka, aby wi±zanie identyfikatorów by³o dynamiczne, zamiast statycznego. Rozumiemy przez to, ¿e w przypadku odwo³ania do zmiennej wewn±trz procedury, odwo³ujemy siê do ¶rodowiska w miejscu wywo³ania tej procedury, zamiast do ¶rodowiska z miejsca deklaracji jak dotychczas. Tak samo powinno byæ w przypadku wywo³ania innej procedury wewn±trz procedury, czyli wi±zanie dynamiczne dotyczy i zmiennych i procedur.
Przykład
Spójrzmy na kilka prostych programów.
x = 1; p(y); y := y+x; x = 10; z = 0; p(z);
Warto¶æ koñcowa zmiennej .
Gdyby wi±zanie zmiennej by³o statyczne, to warto¶æ ta
wynosi³aby . Podobnie dla procedur:
q(x); x := x+1; p(y); q(y); q(y); q(x); x := x+x; z = 2; p(z);
Warto¶æ koñcowa zmiennej .
Gdyby widoczno¶æ procedury by³a statyczna, to warto¶æ ta
wynosi³aby .
A oto przyk³ad programu, który nie wykona³by siê poprawnie
przy wi±zaniu statycznych, a wykonuje siê poprawnie przy
dynamicznym:
q(x); r(x); p(y); r(x); x := x+x; q(x); z = 7; p(z);
Warto¶æ koñcowa zmiennej wynosi .
Procedura wywo³uje procedurê ,
,,przekazuj±c" jej równie¿ ¶rodowisko z miejsca wo³ania,
zawieraj±ce informacjê o procedurze . Ta ostatnia
przy widoczno¶ci statycznej by³aby lokalna, a teraz nie jest.
Rozwiązanie
Ćwiczenie 3 (ró¿ne mechanizmy przekazywana parametru)
Rozwa¿ inne mechanizmy przekazywania parametru (wi±zanie statyczne):
- przez warto¶æ
- in-out
Nale¿y wyja¶niæ ostatni mechanizm (in-out). Parametrem aktualnym jest zmienna, której warto¶æ jest przypisywana parametrowi formalnemu (tak jak przy przekazywaniu przez warto¶æ, gdy parametrem aktualnym jest zmienna). Ale po zakoñczeniu procedury, warto¶æ parametru formalnego, która mog³a zmieniæ siê w czasie dzialania procedury, jest spowrotem przypisywana na zmienn± bêd±c± parametrem aktualnym (a wiêc podobnie do przekazywania przez zmienn±). Parametr formalny jest traktowany jak zmienna lokalna procedury.
Rozwiązanie (przekazywanie parametru przez warto¶æ)
Rozwiązanie (przekazywanie parametru in-out)
Zadania domowe
Ćwiczenie 1
Zaadaptuj semantykê ,,deklaracji równoleg³ych" dla rekurencji wzajemnej wewn±trz jednej deklaracji równoleg³ej. To znaczy, ¿e procedury zadeklarowane w jednej deklaracji równoleg³ej mog± siê wzajemniej wywo³ywaæ bez ¿adnych ograniczeñ.
Ćwiczenie 2
Zamiast procedur, rozwa¿ funkcje z pojedynczym parametrem przekazywanym przez zmienn±. Wywo³anie funkcji mo¿e teraz pojawiæ siê wewn±trz wyra¿enia:
Wewnatrz funkcji jej nazwa mozna poslugiwac sie jak zmienna lokalna. Wynik zwracany przez funkcje to wartosc tej zmiennej w momencie wyjscia z funkcji.
Uwaga na efekty uboczne!
Ćwiczenie 3
Rozwa¿ nastêpuj±ce warianty:
- wi±zanie zmiennych jest statyczne a procedur dynamiczne
- wi±zanie zmiennych jest dymamiczne a procedur statyczne.
Ćwiczenie 4
Rozszerz semantykê procedur tak, aby parametrem aktualnym procedury mog³a byæ procedura.