Semantica operazionale dei linguaggi di Programmazione

Semantica operazionale dei
linguaggi di Programmazione
Le espressioni con stato
Rosario Culmone, Luca Tesei
Lucidi tratti dalla dispensa
“Elementi di Semantica Operazionale”
R. Barbuti, P. Mancarella e F. Turini
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.1/43
Espressioni con variabili
Espandiamo il sistema →exp in modo da trattare il nuovo
caso sintattico Exp ::= Ide:
Exp ::= Num | Ide | (Exp) | Exp Op Exp
Op ::= + | - | * | / | %
Num ::= ...
Ide ::= ...
Con questa grammatica possiamo scrivere espressioni
che contengono variabili indicate con i nomi generabili
da Ide
Es: x + 2, 3 ∗ pippo + 45 % y, tmp, . . .
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.2/43
Espressioni con variabili
Quale può essere il significato da associare a questi
oggetti sintattici?
Quello che ci aspettiamo è che le variabili presenti
nell’espressione abbiano un certo valore associato
Se questo è vero possiamo di nuovo associare
all’espressione un valore seguendo la logica del
sistema nella versione precedente
Per far questo introduciamo il concetto di stato
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.3/43
Lo stato: forma semplice
Nella sua forma più semplice, uno stato non è altro che
un insieme di associazioni del tipo hnome, vali dove val
è un valore
Indichiamo genericamente con Val l’insieme dei valori:
per quanto visto sino ad ora Val è il dominio semantico
IN
Uno stato ϕ può essere visto come una funzione
ϕ : Ide 7→ Val
Dato un nome x viene restituito il valore associato ad x
in ϕ
Questa forma semplice di stato la chiameremo frame
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.4/43
Lo stato: forma semplice
In generale un frame ϕ è una funzione parziale sul
dominio Ide
Utilizziamo ϕ, ϕ0 , ϕ′ , ϕ′′ , . . . come metavariabili per
denotare generici frame. Usiamo Φ per indicare
l’insieme di tutti i possibili frame
Adottiamo l’usuale notazione funzionale ϕ(x) per
denotare il valore associato ad x nel frame ϕ
Dato un frame ϕ che non contiene alcuna associazione
per l’identificatore x scriviamo ϕ(x) =⊥
Indichiamo con ω un frame vuoto, ovvero tale che
ϕ(x) =⊥ qualunque sia x
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.5/43
Rappresentazione funzionale
Una possibile rappresentazione di un frame, in forma
funzionale, è la seguente
Siano x1 , x2 , . . . , xk tali identificatori e siano v1 , v2 , . . . , vk
i valori ad essi associati nello stato ϕ
Definiamo ϕ come la seguente funzione:

v1
se x = x1



se x = x2
 v2
ϕ(x) = . . .


se x = xk

 vk
⊥
altrimenti
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.6/43
Rappresentazione estensiva
Un modo alternativo di rappresentare il frame consiste
nell’elencare le associazioni presenti in ϕ come segue:
ϕ = {x1 7→ v1 , x2 7→ v2 , . . . , xk 7→ vk }
In questa notazione è essenziale che gli identificatori
x1 , x2 , . . . , xk siano tutti distinti tra loro
Non è importante l’ordine in cui vengono elencate le
associazioni xi 7→ vi all’interno delle parentesi graffe
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.7/43
Rappresentazione grafica
Graficamente indicheremo un frame in questo modo:
x1
v1
x2
v2
ϕ=
...
xk
vk
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.8/43
Miglioriamo il sistema →exp
Per poter calcolare la semantica delle espressioni
formate con la nuova grammatica dotiamo le
configurazioni non terminali del sistema di transizioni di
uno stato nella sua forma semplice:
Γexp = {hE, ϕi | E ∈ Exp, ϕ ∈ Φ}
∪
{n | n ∈ IN }
Texp = {n | n ∈ IN }
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.9/43
Regole
Rispetto alla versione precedente del sistema c’è una
sola regola in più
La nuova regola gestisce il caso sintattico di base Ide
Un qualsiasi albero sintattico di Exp può avere quindi
come foglie delle stringhe di Num o dei nomi di variabili
Ide
Dato un certo stato ϕ e una espressione E, quest’ultima
deve essere valutata tenendo presente i valori associati
da ϕ ai nomi
Quindi ϕ deve essere disponibile in tutte le chiamate
ricorsive del sistema Sexp
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.10/43
Regole
Vediamo quindi la regola (expide ) per gestire il nuovo
caso sintattico
ϕ(x) = n
hx, ϕi →exp n
La premessa ϕ(x) = n esprime il fatto che ϕ deve
associare al nome x un valore naturale e quindi diverso
da ⊥
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.11/43
Regole
Tutte le altre regole restano invariate tranne che adesso
nelle configurazioni c’è anche lo stato
Ogni regola diversa da (expide ) non usa direttamente lo
stato
Le regole ricorsive si limitano a passarlo tale e quale
alle istanze ricorsive del sistema che costruiscono
sottoderivazioni
La regola (expn ) non lo usa:
hn, ϕi →exp n
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.12/43
Regole
Vediamo alcuni esempi delle altre regole
hE, ϕi →exp n
hE′ , ϕi →exp n′
m = n + n′
(exp+ )
hE+E′ , ϕi →exp m
hE, ϕi →exp n
hE′ , ϕi →exp n′
m = n × n′
(exp∗ )
hE*E′ , ϕi →exp m
hE, ϕi →exp n
hE′ , ϕi →exp n′
n ≥ n′
m = n − n′
(exp− )
hE-E′ , ϕi →exp m
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.13/43
Derivazione
Facciamo una derivazione usando questo sistema
Prendiamo ϕ = {x 7→ 5, y 7→ 2}
h(x+8) / y, ϕi
→exp
{ (expdiv ),
(d1): h(x+8), ϕi →exp 13,
(expide ): hy, ϕi →exp 2
2 6= 0, 13 div 2 = 6 }
6
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.14/43
Sottoderivazioni
(d1):
h (x+8) , ϕi
→exp
{ (exp() ),
(d2): hx+8, ϕi →exp 13 }
13
(d2):
h x+8 , ϕi
→exp
{ (exp+ ),
((expide )): hx, ϕi →exp 5,
((expn )): h8, ϕi →exp 8,
13 = 5 + 8 }
13
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.15/43
Funzione di valutazione semantica
Alla luce di questo nuovo sistema e dell’introduzione
dello stato cambia anche la funzione di valutazione
semantica
Il significato di una espressione aritmetica contentente
dei nomi di variabili dipende anche dallo stato
Formalmente la funzione di valutazione semantica E ha
questo nuovo tipo:
E: Exp → (Φ → IN )
Ciò significa che ad ogni espressione E viene associata
una funzione
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.16/43
Funzione di valutazione semantica
La funzione associata all’espressione E, dato un certo
stato ϕ, restituisce un numero naturale n che
rappresenta il valore dell’espressione nello stato ϕ
Formalmente lo scriviamo utilizzando questa notazione:
E[[E]]ϕ = n
Possiamo, al solito, definire questa funzione utilizzando
l’ultima versione del sistema di transizioni Sexp :
E[[E]]ϕ = n
se e solo se
hE, ϕi →exp n
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.17/43
Strutturazione dello stato
Modellare lo stato come un semplice frame non basta
Il linguaggio Java ha dei meccanismi di scope delle
variabili associati ai blocchi e ai sottoblocchi annidati
Per trattare correttamente questi meccanismi abbiamo
bisogno di un modello di stato più complesso
Il modo giusto di trattare lo stato è quello di modellarlo
come pila di frame
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.18/43
Pila di frame
Ogni frame della pila si comporta esattamente come
abbiamo visto sopra
Per rappresentare una pila di frame possiamo usare
una notazione grafica:


x 31



 ϕ2 y 12
σ

z 8



 ϕ1 x 25
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.19/43
Il nuovo stato
Nella figura precedente il frame più in basso nella pila è
ϕ1
Il frame in testa alla pila è ϕ2
Una pila di frame verrà indicata con le metavariabili
σ, σ ′ , σ1 , σ2 , . . .
Indichiamo con Ω lo stato vuoto (ovvero la pila vuota di
frame)
L’insieme Σ degli stati è definito induttivamente come
segue:
Σ = {Ω} ∪ {ϕ.σ|ϕ ∈ Φ, σ ∈ Σ}
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.20/43
Il nuovo stato
Una formalizzazione dello stato σ della figura di prima è
la sequenza:
ϕ2 .ϕ1 .Ω
dove ϕ1 e ϕ2 sono le funzioni:
(
8
ϕ1 (v) = 25
⊥
(
12
ϕ2 (v) = 31
⊥
se v =z
se v =x
altrimenti
se v =y
se v =x
altrimenti
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.21/43
Nomi pluridefiniti
Nella definizione di stato che abbiamo dato potrebbero
esserci delle variabili a cui sono associati valori diversi
in frame diversi
Ad esempio nella figura di prima x ha valore 8 in ϕ1 e
31 in ϕ2
Questa possibilità deriva da una semplificazione che
facciamo nel nostro linguaggio Java didattico
Nel linguaggio Java completo questo non può mai
accadere poiché il compilatore vieta di dichiarare nei
sottoblocchi delle variabili con dei nomi che sono già
presenti nell’attivazione corrente
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.22/43
Frame e blocchi
Nel nostro caso risolviamo il conflitto seguendo la
logica della pila di frame
Ogni frame, vedremo, contiene le variabili definite in un
certo blocco
Il frame che è in testa alla pila rappresenta le
associazioni fatte più di recente, cioè quelle dell’ultimo
blocco aperto
Scendendo in basso nella pila di un frame troviamo le
variabili dichiarate nel blocco a cui quello corrente è
annidato e così via
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.23/43
Ricerca del valore di una variabile
Diciamo che il valore di un identificatore, in generale, è
quello dell’associazione più recente
Tale valore si trova ricercandolo nei frame dello stato
dall’alto verso il basso
Nell’esempio, il valore dell’identificatore x è 31
Il frame ϕ2 è stato infatti impilato sul frame ϕ1
Sempre nell’esempio, il valore dell’identificatore z è 8
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.24/43
Formalizziamo
Dato uno stato σ ed un identificatore x indichiamo con
σ(x) il valore associato ad x in σ
Diamo una definizione ricorsiva di questa operazione:

se σ = Ω
⊥
σ(x) = ϕ(x) se σ = ϕ.σ ′ e ϕ(x) 6= ⊥
 ′
σ (x) se σ = ϕ.σ ′ e ϕ(x) = ⊥
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.25/43
Esempio
Consideriamo ancora l’esempio precedente, con
σ = ϕ2 .ϕ1 .Ω
Abbiamo:
σ(x) = 31 poiché ϕ2 (x) = 31
σ(z) = 8 poiché ϕ2 (z) = ⊥ e ϕ1 (z) = 8
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.26/43
Regole
Con la nuova definizione di stato strutturato, le regole di
Sexp cambiano
Le configurazioni del sistema di transizione hE, ϕi vanno
cambiate in hE, σi
In ogni regola dobbiamo mettere σ al posto di ϕ
Vediamo come esempio la regola (expide ):
σ(x) = n
hx, σi →exp n
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.27/43
Modifica dello stato
Come vedremo in seguito il significato di un programma
è quello di eseguire transizioni di stato
Ci si aspetta che tali transizioni modifichino lo stato in
accordo al significato del programma (semantica) e allo
stato iniziale (input)
Definiamo quindi precisamente le operazioni di modifica
dello stato
Per cominciare definiremo una operazione che modifica
un frame, poi ci occuperemo di definire la modifica di
uno stato vero e proprio, cioè una pila di frame
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.28/43
Modifica di un frame
Un frame ϕ è rappresentato da una funzione parziale
La modifica di un frame corrisponde quindi alla modifica
di una funzione parziale
Per questo tipo di operazione si usa spesso la
notazione ϕ[v /x ]
La funzione denotata da questa espressione
corrisponde alla funzione ϕ originale che:
resta invariata per tutti gli identificatori diversi da x
restituisce il valore v per l’identificatore x
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.29/43
Modifica di un frame
In notazione matematica:
ϕ(y)
ϕ[v /x ](y) =
v
se y =
6 x
se y = x
Si noti che se ϕ(x) =⊥ invece ϕ[v /x ](x) = v
Cioè l’operazione di modifica, oltre a modificare il valore
di un identificatore presente in un frame ϕ, può essere
usata per aggiungere un nuovo identificatore nel frame,
dandogli un valore iniziale
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.30/43
Modifica in parallelo
La notazione può essere estesa per trattare la modifica
di un frame su più identificatori in parallelo
Se ϕ è un frame, x1 , . . . xk sono k identificatori distinti e
v1 , . . . vk sono k elementi in Val, la notazione
ϕ[v1 /x1 , . . . ,vk /xk ]
denota il frame:
ϕ[v1 /x1 , . . . ,vk /xk ](y) =
v
1



 v2



 vk
ϕ(y)
se y = x1
se y = x2
...
se y = xk
altrimenti
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.31/43
Modifica in parallelo
Ad esempio:
dato il frame ϕ = {x 7→ 5, y 7→ 2}
detto ϕ1 il frame ϕ[4 /x ,3 /y ]
avremo che
ϕ1 (x) = 4, ϕ1 (y) = 3
ϕ1 (z) =⊥ per ogni altro identificatore z
Da rimarcare ancora il fatto che gli identificatori
modificati in parallelo devono essere tutti distinti
Se così non fosse non il risultato della modifica non
sarebbe più una funzione (ci sarebbero più valori
possibili per lo stesso identificatore)
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.32/43
Modifiche multiple
Se fosse necessario rappresentare modifiche
successive per lo stesso identificatore, non potremo
utilizzare la notazione appena introdotta per modifiche
multiple
Ad esempio, saremo autorizzati a scrivere
ϕ′ = (ϕ[10 /x ])[20 /x ]
Sarebbe sbagliato invece scrivere ϕ′′ = ϕ[10 /x ,20 /x ]
Dalla definizione è chiaro che ϕ′ è una funzione e che
ϕ′ (x) = 20
Invece ϕ′′ non è una funzione da Ide in Val
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.33/43
Modifiche multiple: esempio
Sia ϕ = {x 7→ 5, y 7→ 2}
Il frame ϕ[4 /x ,3 /z ] è uguale a ϕ′ = {x 7→ 4, y 7→ 2, z 7→ 3}
Verificarlo per esercizio
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.34/43
Modifica dello stato
Passiamo ora a modificare lo stato vero e proprio, cioè
una pila di frame σ
Utilizzeremo la stessa notazione per indicare
l’operazione di modifica
Tuttavia chiariamo subito che l’operazione sarà di
natura diversa da quella definita sui frame
Sappiamo che il valore associato ad un identificatore x
in uno stato è quello che si determina trovando una
associazione per x a partire dal frame più recente
Definiamo la modifica σ[v /x ] in modo che riguardi
l’associazione più recente per x
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.35/43
Modifica dello stato
Detto altrimenti, nello stato σ[v /x ] viene modificato il
frame più recente che contiene una associazione per x
Consideriamo ad esempio uno stato σ del tipo
ϕ1 .ϕ2 . . . ϕi . . . ϕk .Ω
Se ϕi è il primo frame nella sequenza che contiene una
associazione per x
cioè ϕ1 (x) = ϕ2 (x) = . . . = ϕi−1 (x) = ⊥ e ϕi (x) 6= ⊥)
Allora lo stato σ[v /x ] non è altro che la sequenza
modificata
ϕ1 .ϕ2 . . . ϕi [v /x ] . . . ϕk .Ω
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.36/43
Modifica dello stato
Si noti che, se nessun frame nello stato contiene una
associazione per x, la modifica non ha alcun effetto
Nell’esempio, se ϕ1 (x) = ϕ2 (x) = . . . = ϕk (x) = ⊥, allora
σ[v /x ] = σ
In questo sta la maggiore differenza tra la modifica di
un frame e la modifica di uno stato
L’operazione di modifica di un frame può essere usata
per introdurre nuovi identificatori nel frame
(dichiarazione)
Invece l’operazione di modifica di una pila di frame non
può introdurre nuovi identificatori nello stato
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.37/43
Modifica dello stato
L’operazione così definita non segnala nessun
eventuale errore nel caso di modifica di un identificatore
non esistente
L’operazione si limita ad avere effetto nullo sullo stato
Questo tipo di definizione di modifica è sufficiente per
essere usata nel nostro sistema di transizioni che
definisce la semantica
Esso infatti non prevede una gestione degli errori di
questo tipo
Questo comportamento può essere cambiato qualora si
volesse espandere il sistema e introdurre una gestione
degli errori
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.38/43
Modifica dello stato
Diamo una definizione formale della modifica di una pila
di frame
Utilizziamo la struttura ricorsiva della pila per definire
ricorsivamente la modifica nel modo che abbiamo
precedentemente illustrato informalmente
σ[v /x ] =
(
ϕ[v /x ].σ ′
ϕ.σ ′ [v /x ]
Ω
se σ = ϕ.σ ′ e ϕ(x) 6= ⊥
se σ = ϕ.σ ′ e ϕ(x) = ⊥
se σ = Ω
La notazione può essere estesa facilmente per trattare la
modifica di una sequenza di identificatori distinti, che
indicheremo con
σ[v1 /x1 , . . . ,vk /xk ].
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.39/43
Modifica dello stato: esempio
Consideriamo come esempio lo stato σ = ϕ2 .ϕ1 .Ω, dove
ϕ1 e ϕ2 sono i frame seguenti:
(
(
se v =z
8
12 se v =y
ϕ1 (v) = 25 se v =x
ϕ2 (v) = 31 se v =x
⊥ altrimenti
⊥ altrimenti
Lo stato σ[50 /z ,40 /x ] è la sequenza ϕ′2 .ϕ′1 .Ω, con
ϕ′1 = ϕ1 [50 /z ] e ϕ′2 = ϕ2 [40 /x ]
D’altra parte, lo stato σ[10 /w ] = σ dal momento che ϕ2 e
ϕ1 non contengono una associazione per w
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.40/43
Notazioni riguardanti lo stato
Nelle premesse delle regole e nella discussione sulla
semantica dei comandi utilizzeremo spesso delle
equazioni che hanno come componenti parti di uno
stato o di un frame
Analizziamone alcune e chiariamo da subito il loro
significato
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.41/43
Notazioni riguardanti lo stato
1. ϕ(x) = v (risp. σ(x) = v) stabilisce semplicemente che il
valore associato ad x nel frame ϕ (risp. nello stato σ ) è
v, mentre è ignoto (e non necessariamente indefinito) il
valore associato ad ogni altro identificatore che non sia
x
2. ϕ(x) = v non equivale a dire che il frame ϕ contiene una
sola associazione (quella per l’identificatore x): non
corrisponde cioè a stabilire che ϕ = {x 7→ v}
3. La scrittura {x 7→ v} indica un frame in cui il valore
associato ad x è v, mentre è indefinito (⊥) il valore
associato ad ogni altro identificatore
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.42/43
Notazioni riguardanti lo stato
4. Entrambe le scritture precedenti non equivalgono a
ϕ[v /x ], in quanto quest’ultima sta ad indicare un frame
che associa ad x il valore v e si comporta come ϕ,
qualunque esso sia, in corrispondenza di ogni altro
identificatore
5. Infine, mentre ϕ[v /x ] rappresenta comunque un frame
diverso da ϕ (con la particolarissima eccezione in cui
ϕ(x) = v), σ[v /x ] può essere una pila di frame identica a
σ
Università degli Studi di Camerino - Corso di Laurea in Informatica - Programmazione - Lo stato – p.43/43