Paradigmi - imperativo Flashcards

1
Q

Imp

Breve presentazione

A

Imp è un linguaggio imperativo. Come fun, anche imp ha 2 modalità eager per la valutazione dei parametri di una procedura: il passaggio per valore e quello per reference, ed una modalità lazy: il passaggio per nome.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Differenza tra lazy e eager

Imp

A
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Locazione

A

Un’astrazione sulla nozione di indirizzo di memoria

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Store

A

è l’insieme delle memorie. è una funzione parziale che va dalle locazioni ai valori.
Store = loc –fin–> val
Intuitivamente associa a ogni cella di memoria un valore (mentre l’ambiente serve a ricorda ogni cella di memoria - locazione - a quale variabile è associata)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Ambiente

Imp

A

L?ambiente in Imp è una funzione parziale che associa variabili a locazioni
Env = var –fin–> loc
è complementare a Store, l’insieme che ricorda i valori contenuti nelle loc

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Imp

sintassi

A

Abbiamo le costanti k€val;
le variabili x,y€var;
Le metavaribili (Espressioni) M,N€Exp;
i programmi p,q€Imp;

Val, Exp ed Imp sono definiti induttivamente dalla seguente sintassi astratta:
k ::= 0 | 1 | . . . | true | false
M ::= k | x | M + N | M < N
p ::= skip | p; q | if M then p else q | while M do p |
var x = M in p | x := M

skip è il programma che non cambia il mondo;
var rappresenta la dichiarazione (ed inizializzazione) di una nuova variabile e := rappresenta l’assegnamento di un valore
ad una variabile già definita

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Imp

Relazioni di valutazione –p–>, –M–>

A

La semantica operazionale di Imp definisce due relazioni di valutazione: una per le espressioni M, che producono un valore senza avere side-effects, ed una per i programmi p, che non producono valori ma cambiano la memoria:
–M–> ⊆ Env × Exp × Store × Val
–p–> ⊆ Env × Imp × Store × Store

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Const

Imp

A

E|- k, S –> k

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

x

Imp

A

E|- x, S –> v
(se E(x) = l ed S(l) = v)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Plus

Imp

A
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Min 1 - M < N true

Imp

A
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Min 2 - M < N false

Imp

A
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Skip

Imp

A

E|- skip, S –>S

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

All

Breve presentazione

A

All è un linguaggio imperativo, che arricchisce Imp con array e procedure. è l’acronimo di algol-like-language, infatti è considerabile il nucleo di un linguaggio Algol.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

All - call by value

Ambiente

A

Le variabili dichiarate come array saranno associate nell’ambiente a sequenze finite e non vuote di
locazioni. Indichiamo con Loc+ l’insieme di tali sequenze. Nota che la dichiarazione di una singola variabile x mediante il costrutto var assocerà ora ad x una sequenza <l> di lunghezza 1.
Le variabili dichiarate come procedure saranno associate a
chiusure.
Dunque, mentre l’insieme Val dei valori e quello Store delle memorie rimangono invariati rispetto ad Imp, per gli ambienti si ha:
Env = Var --fin--> Loc+ ∪ (Var × All × Env)</l>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

All

Relazioni di valutazione

A

–V–> ⊆ Env × LExp × Store × Loc
–M–>⊆ Env × Exp × Store × Val
–p–> ⊆ Env × All × Store × Store

17
Q

Loc 1 - x non array

All - Call by value

A

E|- x, S –V–> l
(se E(x) = l)

18
Q

Loc 2 - x array

All - Call by value

A
19
Q

Ref

All - Call by value

A
20
Q

Assign

All - Call by value

A
21
Q

Array

All - Call by value

A
22
Q

Procedure

All - Call by value

23
Q

Call

All - Call by value

A
24
Q

In all non c’è la regola diretta per calcolarsi il valore di x, come si fa?

All - Call by value

A

Per ottenere il valore referenziato da una
variabile x sono necessari ora due passi: [loc 1] e [ref ].

25
Q

Call by reference

A

Si impone che l’espressione che si passa come argomento ad una chiamata per riferimento deve essere di tipo assegnabile. Cambia solo la regola della chiamata:
call-ref

26
Q

var x = 5 in proc y(z) is z := 1 in y(x)
Valutare il seguente programma con la semantica call-by-value e con quella call-by-reference

Cosa cambia?

A

Call by value: passiamo alla funzione y il valore che x ha al momento della chiamata, ossia 5; quindi proviamo ad assegnare 1 a 5;
Call by reference: passiamo alla funzione y la locazione l, associata alla variabile x.

27
Q

Dare un programma che dà risultati diversi se valutati call-by-value o call-by-reference

A

var x = 5 in proc y(z) is z := 1 in y(x)

28
Q

Call by name

Come cambia l’ambiente e le regole

A

Come per la chiamata per riferimento, l’espressione che si passa come argomento ad una chiamata per nome deve essere di tipo assegnabile. Tale espressione deve inoltre rimanere non valutata fino a quando l’esecuzione del corpo della procedura non richieda la valutazione del parametro. Si tiene quindi nell’ambiente l’espressione non valutata.
L’ambiente diventa quindi:
Env = Var –fin–> Loc+ ∪ (Var × All × Env) ∪ (LExp × Env)
E le regole:
per valutare la variabile in un parametro loc3
call-by-name

29
Q

Seq

Imp

A
30
Q

If1 - condizione true

Imp

A
31
Q

If2 - condizione false

Imp

A
32
Q

While1 - condizione true

Imp

A
33
Q

While2 - condizione false

Imp

A
34
Q

Assign

Imp

A
35
Q

Var

Imp

A
36
Q

Valutare il seguente programma con la semantica call-by-reference e con quella call-by-name:
var x = 0 in arr y = [3, 4, 5] in proc z(w) is (x := x + 1; u := w) in call z(y[x])

Cosa cambia?

A

Call by reference: passiamo alla funzione z la locazione di y[x] al momento della chiamata di z. x vale 0, quindi questa locazione si riferisce al primo elemento dell’array y. Allora quando eseguiamo la funzione z (ossia x := x + 1; u := w), x diventa 1,e associamo alla locazione di u il valore di w=y[0] nello Store.

Call by name: passiamo alla funzione z direttamente il parametro V e l’ambiente E (quello al momento della chiamata), senza calcolarci la locazione. La calcoliamo invece quando e se servirà effettivamente. Quindi quandoe seguiamo la funzione z (ossia x := x + 1; u := w), x diventa 1, e associamo alla locazione di u il valore di w=y[1]

37
Q

Programma che cambia se valutato call by name o by reference?

Dare esempio

A

var x = 0 in arr y = [3, 4, 5] in proc z(w) is (x := x + 1; u := w) in call z(y[x])

38
Q

Differenza call by reference, by value, by name?

A

Reference e value sono eager, vengono subito valutati quando viene chiamata la funzione. Name è lazy perchè viene valutata quando e se viene effettivamente usato il parametro nel corpo della funzione.
Value passa una variabile come parametro che valutata torna un valore.
Reference passa una variabile di tipo assegnabile che valutata dà una locazione.
Name passa una coppia variabile(assegnabile)-ambiente, che valutata nel suo ambiente darà una locazione.