• Nenhum resultado encontrado

Provocarea 1: operatorii =,++, --

N/A
N/A
Protected

Academic year: 2023

Share "Provocarea 1: operatorii =,++, --"

Copied!
21
0
0

Texto

(1)

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

(2)

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--]] = ??

(3)

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

(4)

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 : StoreValBool bool : StoreVal Bool

(5)

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

(6)

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

(7)

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))

(8)

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]]

(9)

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++;

}

(10)

Programe nedeterministe: corectitudine

(11)

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

(12)

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;

} ] ]

(13)

Programe paralele: corectitudine

assert(true)

[x = 1; || x = 3;]

assert(x == 1 x ==3)

(14)

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]]

(15)

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]

(16)

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++;

} ]

(17)

Programe paralele cu sincronizare: corectitudine

(18)

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

(19)

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

(20)

Programe distribuite: exemplu

• sender/receiver - descriere

R i

input output

Sender input Filter output Receiver

(21)

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++;}

] ]

Referências

Documentos relacionados

ESTADO DO RIO GRANDE DO SUL Município de Tenente Portela Praça Tenente Portela, 23 – Fone Telefones: 055 3551.1452 - 055 3551.1454 CEP 98.500-000 – Tenente Portela – RS MUNICÍPIO