Curs 6
P i
• Provocari:
– adaugarea de noi trasaturi:
• operatori
• operatori
• tipuri
• alte instructiunia te st uct u
• subprograme
– alte paradigme de programare:
• nedeterminism
• paralelism
• distribuire
Provocarea 1: operatorii =,++, --
i t
• sintaxa
op _=_ : SimVar Exp -> Exp . op = p _ _ : ArrComp Exp -> Exp .p p p op ++_ : Exp -> Exp .
op _++ : Exp -> Exp . op --_ : Exp -> Exp . op _-- : Exp -> Exp .
• semanticasemantica
eq S[[E1 = E2]] = ??
eq S[[++E1]] = ??
[[ 1 ]]
eq S[[E1++]] = ??
eq S[[--E1]] = ??
eq S[[E1--]] = ??
Operatorii =,++, --
Öf ti [[ ]] d bl f t
Öfunctia _[[_]] are un dublu efect acum:
• intoarce valoarea expresiei
• schimba starea
• schimba starea
Öde aceea _[[_]] e de natura mai mult coalgebrica decat algebrica:
_[[_]] : Store → (Store × (Int U Bool))ObjExp ∪ ObjTst
operatorii =,++, --: solutii posibile
l i l d il
• la nivel de compilare x = y = i++;
poate fi compilat in
p p
y = i;
x = y;
i = i+1;
• reconsiderarea definitiei pentru functia semantica:
[[ ]] : Store × → StoreVal _[[_]] : Store → StoreVal
<_, _> : Store Val → StoreVal Int < Val, Bool < Val
store : StoreVal → Store int : StoreVal → Int
bool : StoreVal → Bool bool : StoreVal → Bool
Provocarea 2: noi tipuri de date
i bil b l
• variabile booleene bool b;
• variabile caracter
• variabile caracter char c;
• probleme ce trebuie rezolvatep ob e e ce t ebu e e o ate – modificarea sintaxei
– expresii (definitie, evaluare) – tablouri
Provocarea 3: noi instructiuni
for (E1; E2; E3) INSTR do SECV_INSTR while(T) switch (T)
switch (T) {
case V1:
...
case Vn:
SECV INSTR1 SECV_INSTR1 ...
case W1:
...
case Wn:
SECV INSTRk SECV_INSTRk
Provocarea 4: subprograme
• exemplu
int prim(int x) {
{
int i;
i = 3;
if ( % 2 0) t 0
if ( x % 2 == 0) return 0;
while ((x % i != 0) && i < x/2) i = i + 2;
return (x % i);
}
• corectitudinecorectitudine assert(true) ret = prim(a);
t(( t 1) (∀i)(2 i /2) %i ! 0)) assert((ret == 1) => (∀i)(2<=i<=a/2) => a %i != 0))
Provocarea 5: programe nedeterministe
• sintaxa
if { T1 → INSTR1 □ ... □ Tn → INSTRn } d { T1 → INSTR1 □ □ T → INSTR } do { T1 → INSTR1 □ ... □ Tn → INSTRn }
• semantica
cq Sq [[[[if {T1 { → INSTR1 □ ... □ Tn → INSTRn}}]][[]][[ ]]X]] = S[[INSTRi]] if S[[Ti]]
cq S[[if {T1 → INSTR1 □ ... □ Tn → INSTRn}]][[X]] =
[[ ]] [[ ]]
⊥ if not S[[T1]] ∧ ... ∧ not S[[Tn]]
cq S[[do {T1 → INSTR1 □ ... □ Tn → INSTRn}]][[X]] = S[[INSTRi do {... }]] if S[[Ti]]
S[[INSTRi do {... }]] if S[[Ti]]
cq S[[do {T1 → INSTR1 □ ... □ Tn → INSTRn}]][[X]] = S[[X]] if not S[[T1]] ∧ ... ∧ not S[[Tn]]
Programe nedeterministe: exemplu
I t ti 3 t bl i
• Intersectia a 3 tablouri – descriere
program – program
i = 0; j = 0; k = 0;
do {
a[i] < b[j] → i++;
□ b[j] < c[k] → j++;
□ c[k] < a[i] → k++;
}
Programe nedeterministe: corectitudine
Provocarea 6: programe paralele cu variabile partajate i t
• sintaxa
– regiune atomica
〈INSTR〉
〈INSTR〉
– sectiuni neintreruptibile
• teste, atribuiri, skip, regiuni atomiceteste, at bu , s p, eg u ato ce – compunerea paralela
[INSTR1 || ... || INSTRn]
• semantica
Programe paralele: exemplu
C t i d i i
• Cautarea unei radacini [ x = 0;
while (!found) {( ) { x++ ;
if (f(x) == 0) found = true;
} ] ||
[ y = 1;
[ y 1;
while (!found) { y-- ;
if (f(y) == 0) found = true;
} ] ]
Programe paralele: corectitudine
assert(true)
[x = 1; || x = 3;]
assert(x == 1 ∨ x ==3)
Provocarea 7: programe paralele cu sincronizare
• sintaxa
await (T) INSTR
op await_ _ : Tst Instr -> Instr – notatie
wait T ≡ await T skip;
wait T ≡ await T skip;
• semantica
cq S[[await T INSTR]][[X]] = S[[INSTR]] if S[[T]]
cq S[[await T INSTR]][[X]] S[[INSTR]] if S[[T]]
Programe paralele cu sincronizare: exemplu
• problema producator/consumator – descriere – productia: citeste din a[0..M-1]
– consum: scrie in b[0..M-1]
– buffer: buffer[0..N-1]
Producator/comsumator: program
in = 0; out = 0; i = 0; j = 0;
[ while (i < M) { x = a[i];
x a[i];
wait ((in – out) < N); buffer[in % M] = x;
in++; i++;
} } ] ||
[ while (j < M) {
wait ((in – out) > 0); y := buffer[out % M];
out++;
b[j] = y;
b[j] = y;
j++;
} ]
Programe paralele cu sincronizare: corectitudine
Provocarea 8: programe distribuite
• program distribuit = o colectie de procese secventiale care comunica prin intermediul unor canale
ti l
• procese secventiale
– comanda de intrare: c?u – comanda de iesire:comanda de iesire: c!tc!t
unde c este numele unui canal de comunicare, u si t sunt variabile
– garda: T;iocom
unde iocom este o comanda i/o si T un test – sintaxa pentru procese secventiale:
INSTR0 do IOC1 → INSTR1 □ ... □ IOCn → INSTRn od
Programe distribuite - semantica
i f t l i i i ? i ?t t
– comunicarea: efectul unei comunicari c?u si c?t este atribuirea u = t
Programe distribuite: exemplu
• sender/receiver - descriere
R i
input output
Sender input Filter output Receiver
Sender/receiver-program
[ //sender
i = 0; do {i != M;input!a[i] → i++}
] ||
[ //filter [ //
in = 0; out = 0; x = ' ';
do { x != '*';input?x →
if { x == ' ' → skip;
if { x → skip;
□ x != ' ' → b[in] = x; in++;
}
□ out != in;output!b[out] → out++;
□ out ! in;output!b[out] → out++;
} ] ||
[ //receiver [ //receiver
j = 0; y = ' ';
do {y != '*';output?y → c[j] =y; j++;}
] ]