Odpowiedzi na pytania do zadania 2. z Semantyki i weryfikacji programow:


Q1. Semantyka moze byc zapisywana w stylu "wprost" lub w stylu kontynuacyjnym.
W jakim stylu ma byc zapisane rozwiazanie zadania?

A1. Rozwiazanie moze byc zapisane w dowolnym z tych dwoch stylow, byle
rozwiazany zostal problem postawiony w zadaniu.


Q2. Rozpatrzmy program:

begin
int y := 0;
proc p(x) begin
  x := 0;
  cio;
  x := x + 2;
  cbv;
  x := x + 2
end;
call p(y)
end

Czy wartosc x tuz przed zakonczeniem procedury p to 4?
(Tzn czy cbv przepisze wartosc "nowego" x na "stare" x, tak jak cio
przepisuje wartosc "starego" x na "nowe" x?)

A2. Tak, wartosc x tuz przed zakonczeniem procedury p wynosi 4.
Wynika to z obecnego w tresci zadania stwierdzenia: "Zmiana trybu
nie powoduje zmiany odczytywanej wartoscci zmiennej..." Byc moze
powoduje to koniecznosc "przepisania" wartosci zmiennej
z reprezentacji uzywanej w trybie cio na reprezentacje uzywana
w trybie cbv.

Q3. Czy mozna zalozyc, ze nowa lokacja, na ktora przy przejsciu do
trybu cio przepisujemy wartosc, jest ta sama lokacja dla wszystkich
przejsc do trybu cio w obrebie jednej procedury?

A3. To pytanie jest pytaniem o rozwiazanie, a nie o tresc zadania,
wiec nie moge udzielic odpowiedzi wprost. Moge natomiast zasugerowac,
aby w kontekscie zadania jeszcze raz uwaznie przeczytac zdania:
* "Przekazywanie in-out ma tu dzialac tak, jakby w momencie wywolania
   procedury rezerwowane bylo miejsce na nowa zmienna, na ktĂła w momencie
   zmiany trybu na in-out przepisywana bylaby aktualna wartosc zmiennej.
   Nastepnie wszystkie opracje na parametrze formalnym, gdy procedura jest
   w trybie in-out, wykonywane bylyby na tej swieĹźo zarezerwowanej ziennej"
* "Tryb odwolywania sie obowiazuje tylko w trakcie aktualnego wywolania
   procedury, wywolania innych procedur i wywolania rekurencyjne tej samej
   procedury maja wlasne tryby."

Q4. Czy ponowne wykonanie instrukcji cio, gdy juz jestmy w trybie in-out,
nie ma zadneo wplywu na wykonanie progrmu (analogicznie cbv gdy
jestemy w trybie przekazywania przez wartosc)?

A4. Nie jestem pewien, czy rozumiem pytanie (bo co to znaczy, ze nie
ma zadnego wplywu na wykonanie programu?). Natomiast moge odpowiedziec,
ze takie ponowne wykonanie instrukcji cio (i w analogicznej sytuacji cbv)
nie jest zmiana trybu w takim sensie, w jakim mowi sie o zmianie trybu
w tresci zadania.

Q5. Chcialem sie upewnic, czy dobrze rozumiem kwestie widzialnosci
zmiennych w zadaniu. Wydaje mi sie, ze po wykonaniu ponizszego
programu wartosc zmiennej res powinna wynosic 0. 

begin
 int w := 0;
 int res := -1;
 proc f(x) begin
   proc g(y) begin
      res := x
   end;
   cio;
   x := x + 2;
   call g(x);
   cbv
 end;
 call f(w)
end

A5. Zmienna res jest zmieniana w ciele procedury g. Wywolanie to nastepuje
w momencie, gdy zmienna x, bedaca parametrem formalnym procedury f,
przyjela wartosc 2 w ciele procedury f. Tresc zadania przyznaje pewna
dowolnosc okreslenia trybu dostepu do zmiennej x w procedurze
wewnetrznej g ("Tryb odwolywania sie obowiazuje tylko w trakcie aktualnego
wywolania procedury, wywolania innych procedur i wywolania rekurencyjne tej
samej procedury maja wlasne tryby.") Jednak jesli nawet nastapila zmiana
trybu dostepu do tej zmiennej, to powinien zostac zachowany warunek:
"Zmiana trybu nie powoduje zmiany odczytywanej wartosci zmiennej". Zatem
odczytywana w ciele procedury g wartosc zmiennej x powinna wynosic 2,
a co za tym idzie taka powinna byc ostateczna wartosc zmiennej res.

Q6. Wywolanie procedury zawsze rozpoczyna sie w trybie przekazywania przez
wartosc. Na podstawie zdania "W momencie wyjscia z procedury lub zmiany trybu
na cbv wartosc tej zmiennej powinna byc przepisywana na zmienna, bedaca
parametrem aktualnym." oraz przykladu wywnioskowalem, ze jesli wywolanie
procedury zakonczy sie w trybie in-out, wartosc zmiennej zapamietywana jest
pod lokacja oryginalu, przekazanego do procedury przez procedure nadrzedna.
Czy ma sie tak dziac takze wtedy, gdy w trakcie jej wykonywania tryb zostanie
zmieniony na cbv, tzn. czy wtedy takze przez "parametr aktualny" mam rozumiec
ten z procedury nadrzednej, czy ten, ktory stworzylem przy rozpoczeciu
wywolania? Czy w zwiazku z tym, jesli wywolanie procedury zakonczy sie w
trybie cbv, to wartosc zapisana w zmiennej po prostu przepada?

A6. Intencja byla taka, ze jak tryb jest cio w momencie wychodzenia z
procedury, to wartosc zmiennej ma byc przepisywana na parametr aktualny.
Jesli natomiast tryb w momencie wychodzenia z procedury jest cbv, to
wartosc zmiennej ma nie byc przepisywana. Nie ma tutaj znaczenia, czy
wczesniej nastepowaly jakies zmiany, czy nie. W szczegolnosci jesli
procedura byla w trybie cio, a potem przeszla do cbv i w tymze trybie
cbv znajduje sie przy wychodzeniu, to wszelkie zmiany na tej zmiennej od momentu 
ostatniego wejsca w tryb cbv zostana utracone.

Q7. Czy powinnismy sie przejmowac sytuacja, gdy programista napisze w kodzie
programu cio/cbv poza cialem procedury? Czy mozemy zalozyc, ze taka instrukcja
nie ma sensu poza procedura i uznac za blad wychwytywany przez
parser\kompilator?

A7. Tresc zadania nie precyzuje, co ma sie stac, gdy cbv/cio zostanie wykonane
poza cialem procedury. Oznacza to, ze mozna te sytuacje obsluzyc w dowolny,
wygodny dla piszacego rozwiazanie sposob.

Q8. Czy dobrze rozumiem, ze tryb wywolania procedury jest zalezny od jej
deklaracji? To znaczy, czy jezeli w momencie deklaracji aktywny byl tryb cio
to po kazdym wywolaniu tej procedury zacznie ona dzialac w trybie cio,
niezaleznie od trybu w ktorym nastapilo wywolanie?  Czy tez moze kazda
procedura zaczyna dzialanie w trybie przekazywania przez wartosc, tak jak caly
program?

A8. W zasadzie nie mamy tutaj do czynienia z trybem wywolania procedury (jak
w zeszlym roku), ale z trybem odwolywania sie do parametru procedury. Tryb
ten jest zalezny od deklaracji procedury w tym sensie, ze elementem deklaracji
jest cialo procedury, a w ciele sa instrukcje zmieniajace tryb odwolywania
sie do parametru. Natomiast domyslny tryb, czyli taki, ktory bedzie
obowiazywal, jesli nie zostanie wykonana zadna instrukcja cbv, cio w ciele
procedury, to tryb odwolywania sie przez wartosc (wynika to z obecnego
w tresci zadania stwierdzenia: "Po wykonaniu wywolnia program znajduje sie
w trybie przekazywania przez wartosc"). Na tryb odwolywania sie do parametrow
procedury nie ma natomiast wplywu tryb, w jakim znajduje sie program w momencie
wejscia do bloku, w ktorym ta procedura jest zadeklarowana.

Q9. Czy wolno za pomoca instrukcji cio i cbv modyfikowac srodowisko, w
ktorym sa one wywolywane?

A9. To jest pytanie dotyczace sposobu rozwiazania, a nie niejasnosci w
tresci zadania.

Q10. Czy wolno mi zdefiniowac dodatkowo wlasna instrukcje? 

A10. To jest pytanie dotyczace sposobu rozwiazania, a nie niejasnosci w
tresci zadania. Moge tylko dodac, ze rzeczy wczesniej dozwolone tutaj
nie beda zabronione, o ile nie zepsuja dobrych wlasnosci semantyki
denotacyjnej.

Q11. Rozpatrzmy program:

begin
int y := 0;
proc p(x) begin
  x := 0;
  cio;
  x := x + 2;
  cbv;
  x := x + 2
end;
call p(y)
end

jaka jest wartosc zmiennej y tuz przed zakonczeniem pierwszego bloku
begin..end? Tzn. czy zmiana trybu w p(x) na cbv spowoduje nie przepisanie
wartosci x (= 4) na koncu p(x) i po zakonczeniu procedury y bedzie nadal 0?

A11. Zmiana cio na cbv spowoduje wpisanie do lokacji zmiennej y wartosci 2.
Wyjscie z procedury w trybie cbv nie powinno powodowac wpisania wartosci x
na y. Po zakonczeniu procedury p zmienna y bedzie miala wartosc 2.

Q12. Rozpatrzmy program:

begin
 int w := 0;
 proc f(x) begin
   proc g(y) begin
      x := 1
   end;
   cio;
   x := x + 2;
   call g(x);

   x := x + 2;

   cbv
 end;
 call f(w)
end

Jaka bedzie wartosc x tuz przed zakonczeniem procedury f(x). Tzn czy wywolanie
g(y) zmodyfikuje x = 1 i po wyjsciu z g(y) bedziemy operowali na tym x (=1)
wiec koncowo bedzie x = 3?

A12. Kazde wywolanie ma wlasne tryby odwolania do zmiennych. W szczegolnosci g
ma tez takie. Przy czym tryb po wejsciu do procedury jest zawsze cbv. Jednak
jesli nawet nastepuje zmiana trybu, to zmiana wewnatrz procedury g, musi
zostac przeniesiona poza wywolanie tej procedury (bo x nie jest parametrem
lokalnym). Zatem x po wywolaniu g(x) bedzie mialo wartosc 1, a co za tym idzie
na koncu procedury f bedzie mialo wartosc 3, jak Pan wskazal.