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.