Paradygmaty programowania - ćwiczenia Lista 11
1. a) Przeanalizuj następujący kod.
declare A B C D
thread D=C+1 end
thread C=B+1 end
thread A=1 end
thread B=A+1 end
{Browse D}
W jakiej kolejności są tworzone wątki? W jakiej kolejności są wykonywane dodawania? Jaki jest wynik końcowy?
b) Przeanalizuj następujący kod.
declare A B C D
D=C+1
C=B+1
A=1
B=A+1
{Browse D}
W tym przypadku jest tworzony tylko jeden wątek. W jakiej kolejności są wykonywane dodawania? Jaki jest wynik końcowy? Jaki wniosek można wyciągnąć?
2. Przeanalizuj i wykonaj następujący kod.
declare
fun lazy {MakeX} {Browse x} {Delay 3000} 1 end fun lazy {MakeY} {Browse y} {Delay 6000} 2 end fun lazy {MakeZ} {Browse z} {Delay 9000} 3 end X={MakeX}
Y={MakeY}
Z={MakeZ}
{Browse (X+Y)+Z}
a) Powoduje on natychmiastowe wyświetlenie x i y oraz po sześciu sekundach z, a wynik 6 po piętnastu sekundach. Wyjaśnij takie zachowanie.
b) Jak będą przebiegały obliczenia, jeśli instrukcja {Browse (X+Y)+Z} zostanie zastąpiona przez
{Browse X+(Y+Z)}?
c) Jak będą przebiegały obliczenia, jeśli instrukcja {Browse (X+Y)+Z} zostanie zastąpiona przez
{Browse thread X+Y end+Z}?
d) Jak zaprogramowałbyś dodawanie n liczb i 1 , … , i n przy założeniu, że liczba i pojawia się po upływie j
t ms tak, żeby wynik końcowy był otrzymywany jak najszybciej?
j
3. Wyjaśnij, dlaczego możliwą implementacją operacji {Wait X} (patrz wykład 11, str. 29) jest: proc {Wait X} if X==unit then skip else skip end end
Wykorzystaj swoje zrozumienie instrukcji if oraz operacji ==.
4. W praktyce często pojawia się konieczność oczekiwania na związanie przynajmniej jednej z dwóch zmiennych. System Mozart w module Value zawiera procedurę {WaitOr X Y}, zawieszającą wątek, dopóki jedna ze zmiennych nie zostanie związana. Napisz procedurę symulującą zachowanie WaitOr.
Wskazówka. Wykorzystaj procedurę Wait.
5. Wyjaśnij, dlaczego w językach funkcyjnych, które nie mają zmiennych przepływu danych, wykonanie leniwe może mieć charakter sekwencyjny z wykorzystaniem współprogramów (jak w języku Haskell), natomiast wykonanie leniwe ze zmiennymi przepływu danych wymaga współbieżności.
Wskazówka. Rozważ poniższy program (lub programy z zadania 1).
local Z
fun lazy {F1 X} X+Z end
fun lazy {F2 Y} Z=1 Y+Z end
in
{Browse {F1 1}+{F2 2}}
end