Principes des lang. de progr.
INE 11
Michel Mauny
Inria-Paris
prénom.nom@inria.fr
Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 1 / 26
Sémantique opérationnelle
1 Sémantique opérationnelle
Évaluation stricte du noyau fonctionnel d’un petit langage Ajout de données structurées
Évaluation non stricte
2 Interprétation
3 Compilation
Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 2 / 26
Sémantique dénotationnelle vs. opérationnelle
Sémantique dénotationnelle (pour ceux qui ont lu le chapitre) valeurs abstraites
le sens, pas le calcul.
quid des programmes qui ne terminent pas ?
quid des programmes qui produisent une erreur d’exécution ? Sémantique opérationnelle
utilise des valeurs concrètes (syntaxiques) explicite les étapes du calcul
procède par «réduction» (transformation syntaxique) du programme initial
des catégories syntaxiques + des règles d’inférence G. Plotkin, 1981 ; G. Kahn 1985 (sémantique «naturelle»)
Noyau fonctionnel : évaluation stricte
Le langage
c∈Const Constantes, incluant les fonctions primitives x∈Id Identificateurs
e∈Exp Expressions
Syntaxe
e ::= c|x |e1+e2 |e1=e2
| ife1 thene2else e3
| e1e2
| funx → e
| letx=e1 ine2
| let rec f(x) =e1in e2
Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 4 / 26
Noyau fonctionnel, évaluation stricte
Valeurs
v ::= c|Valf(x,e, ρ)|Valfr(f,x,e, ρ)
ρenvironnement :x∈Id→v ρ⊕[x7→v]: extension deρ
(ρ⊕[x7→v])(x) =v
(ρ⊕[x7→v])(y) =ρ(y)poury6=x
Valf et Valfr : valeurs fonctionnelles (fermeturesouclosures) Réponses
r ::= v |Erreur Règles d’évaluation
définissent des «jugements» de la forme ρ`e⇒r
«Dans l’env.ρ, l’évaluation de l’expressioneproduit la réponser.»
Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 5 / 26
Langage fonctionnel, strict : règles d’inférence
1/4Règles : elles ont un nom, et sont des axiomes ou bien des implications
Constantes, variables, fonctions
ρ`c⇒c (Const) x∈dom(ρ)
ρ`x⇒ρ(x) (Ident)
ρ`(funx → e)⇒Valf(x,e, ρ) (Fun) Conditionnelle
ρ`e1⇒T ρ`e2⇒r
ρ`ife1then e2 elsee3⇒r (IfTrue) ρ`e1⇒F ρ`e3⇒r
ρ`ife1 thene2else e3⇒r (IfFalse)
Langage fonctionnel, strict : règles
2/4Primitives
ρ`e1⇒n1 ρ`e2⇒n2 n=n1+n2
ρ`(e1+e2)⇒n (Plus)
ρ`e1⇒v1 ρ`e2⇒v2 v1=v2
ρ`(e1=e2)⇒T (EgTrue)
ρ`e1⇒v1 ρ`e2⇒v2 v16=v2
ρ`(e1=e2)⇒F (EgFalse)
Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 7 / 26
Langage fonctionnel, strict : règles
3/4Déclarations
ρ`e1⇒v1 ρ⊕[x 7→v1]`e2⇒r ρ`(let x=e1 ine2)⇒r (Let)
ρ⊕[f 7→Valfr(f,x,e1, ρ)]`e2⇒r
ρ`(let rec f(x) =e1 ine2)⇒r (Letrec)
Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 8 / 26
Langage fonctionnel, strict : règles
4/4Applications
ρ`e1⇒Valf(x,e0, ρ0) ρ`e2⇒v2 ρ0⊕[x7→v2]`e0⇒r
ρ`(e1e2)⇒r (AppF)
ρ`e1⇒Valfr(f,x,e0, ρ0) ρ`e2⇒v2 ρ0⊕[f 7→Valfr(f,x,e0, ρ0)]⊕[x7→v2]`e0⇒r
ρ`(e1e2)⇒r (AppFR)
Les règles auxquelles vous avez échappé
Production d’erreurs et propagation
x6∈dom(ρ)
ρ`x⇒Erreur(IdentErr) ρ`e1⇒r6∈ {T,F}
ρ`ife1thene2elsee3⇒Erreur(IfErr)
ρ`e1⇒r6∈N
ρ`(e1+e2)⇒Erreur(PlusErrL) ρ`e1⇒n1 ρ`e2⇒r6∈N ρ`(e1+e2)⇒Erreur (PlusErrR)
ρ`e1⇒Erreur
ρ`(e1=e2)⇒Erreur(EgErrL) ρ`e1⇒v1 ρ`e2⇒Erreur ρ`(e1=e2)⇒F (EgErrR)
ρ`e1⇒Erreur
ρ`(letx=e1ine2)⇒Erreur(LetErr) ρ`e1⇒r6=Valf(_,_,_)∧r6=Valfr(_,_,_,_) ρ`(e1e2)⇒Erreur (AppErrL)
ρ`e1⇒Valf(x,e0, ρ0) ρ`e2⇒Erreur ρ`(e1e2)⇒Erreur (AppFErrR)
ρ`e1⇒Valfr(f,x,e0, ρ0) ρ`e2⇒Erreur
ρ`(e1e2)⇒Erreur (AppFRErrR)
Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 10 / 26
Arbres d’évaluation – dérivations
Arbres :axiomes = feuilles, règles d’inférence = nœuds
Posonsf =Valf(x,x,∅)etρf =∅ ⊕[f 7→f] = [f 7→f].
f ∈dom(ρf)
ρf `f ⇒f ρf `1⇒1
x ∈dom(∅ ⊕[x7→1])
∅ ⊕[x7→1]`x⇒1
ρf `f(1)⇒1 (App)
(Fun)
∅ `(funx → x)⇒f
∅ `(letf =funx → x inf(1))⇒1 (Let)
Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 11 / 26
Données structurées
Couples et projections
e ::= . . . |(e1,e2)|fst e|snde
Valeurs
v ::= . . . |(v1,v2)
Règles
ρ`e1⇒v1 ρ`e2⇒v2 ρ`(e1,e2)⇒(v1,v2)
ρ`e⇒(v1,v2) ρ`fst e⇒v1
ρ`e⇒(v1,v2) ρ`snde⇒v2
Langage fonctionnel : évaluation non-stricte
1/4Coder les calculs suspendus : suspensions s ::= he, ρi
Valeurs v ::= c
| Valf(x,e, ρ)|Valfr(f,x,e, ρ)
| (he1, ρ1i,he2, ρ2i)
Évaluation des couples : suspension des composantes ρ`(e1,e2)⇒(he1, ρi,he2, ρi)
⇒les composantes de couples sont toujours des suspensions
Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 13 / 26
De l’évaluation (formelle) à l’interprétation (mécanique)
Implémenter les valeurs de la sémantique opérationnelle : v ::= c |Valf(x,e, ρ)|Valfr(f,x,e, ρ)
par :
typesemopval=
| Intvalofint
| Boolvalofbool
| Stringvalofstring
| . . .
| Funvalof{param:string;body:expr;env:environment}
| Funrecvalof{fname:string;param:string;body:expr;env:environment}
andenvironment= (string∗semopval)list;;
On considère qu’uneréponsesera ou bien une valeur, ou alors la levée d’une exception OCaml.
Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 14 / 26
De l’évaluation à l’interprétation
Puis «lire» les axiomes et règles d’inférence comme des cas d’une fonction d’évaluation :
val eval:Pcfast.expr→environment→semopval let rec eval t rho=matchtwith. . .
| Pcfast.EInt n→Intval n (∗ ρ`c⇒c ∗)
| Pcfast.EString s→Stringval s (∗ ρ`c⇒c ∗)
| Pcfast.EIdent x→begin
try List.assoc x rhowith (∗ x∈dom(ρ) ρ`x⇒ρ(x) ∗) Not_found→
error(Printf.sprintf "Unbound variable %s." x) end
| . . .
De l’évaluation à l’interprétation
Les axiomes et règles d’inférence comme des cas d’une fonction d’évaluation :
let rec eval t rho=matchtwith. . .
| Pcfast.EFun(x,e)→ (∗ ρ`(funx→e)⇒Valf(x,e, ρ)∗) Funval{param=x;body=e;env=rho}
| Pcfast.EIf(e1,e2,e3) → begin
matcheval e1rhowith (∗ ρ`e1⇒T ρ`e2⇒r
ρ`ife1thene2elsee3⇒r ∗)
| Boolvaltrue→ eval e2rho
| Boolvalfalse→ eval e3rho (∗ ρ`e1⇒F ρ`e3⇒r
ρ`ife1thene2elsee3⇒r ∗)
| _ → error "Boolean value expected"
end
| . . .
Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 16 / 26
De l’évaluation à l’interprétation
Les axiomes et règles d’inférence comme des cas d’une fonction d’évaluation :
let rec eval t rho=matchtwith. . .
| Pcfast.EBinop("+",e1,e2)→ begin (∗ ρ`e1⇒n1 ρ`e2⇒n2
ρ`(e1+e2)⇒n1+n2 ∗) match(eval e1 rho,eval e2 rho)with
| (Intval n1,Intval n2)→ Intval(n1+n2)
| _ → error "Integer values expected"
end
| . . .
Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 17 / 26
De l’évaluation à l’interprétation
Les axiomes et règles d’inférence comme des cas d’une fonction d’évaluation :
let rec eval t rho=matchtwith. . .
| Pcfast.ELet(x,e1,e2) → (∗ ρ`e1⇒v1 ρ⊕[x7→v1]`e2⇒r
ρ`(letx=e1ine2)⇒r ∗) let v1 =eval e1rhoin
eval e2((x,v1)::rho)
| Pcfast.ELetrec(f,x,e1,e2) → (∗ ρ⊕ρ`[f(let rec7→Valfr(ff(x) =,x,ee11, ρ)]ine`2)e2⇒⇒r r ∗) let vf =Funrecval{fname=f;param=x;body=e1;env=rho}in eval e2((f,vf)::rho)
| . . .
De l’évaluation à l’interprétation
Des axiomes et règles d’inférence aux cas d’une fonction d’évaluation let rec eval t rho=matchtwith
. . .
| Pcfast.EApp(e1,e2)→
let (vf,v2) = (eval e1 rho,eval e2 rho)in begin matchvf with
(∗ ρ`e2⇒ρv`2e1⇒ρ0Valf(x,e⊕[x7→0, ρv20])`e0⇒r
ρ`(e1e2)⇒r
∗)
| Funval{param=x;body=e0;env=rho0}→eval e0((x,v2)::rho0) (∗ ρ0ρ⊕`[fe7→1⇒Valfr(fValfr(f,x,,x,e0e, ρ0, ρ0)]0)⊕[x7→ρ`v2e]2`⇒e0v2⇒r
ρ`(e1e2)⇒r
∗)
| Funrecval{fname=f;param=x;body=e0;env=rho0}→ eval e0((x,v2)::(f,vf)::rho0)
| _ → error "Expecting a functional value"
;;end
Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 19 / 26
De l’interprétation à la compilation
Interprète
+ environnements, valeurs
− gestion du contrôle par le langage hôte
(Modèle de) Compilateur + environnements, valeurs
+ gestion explicite du contrôle (pile)
Machine abstraite
code, pile, registre, (mémoire,etc.) instruction : état→état
Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 20 / 26
Compilation
Le langage
e ::= c|x |e1e2 |funx → e|ife1 thene2 elsee3
| e1+e2|e1=e2
Codage de de Bruijn des occurrences de variables
occurrence dexdans un contexte oùnlieurs («fun y →»,
«let y=» ou «let f(y) =») séparent cette occurrence de son lieur, est codée par un accès à une profondeurndans un environnement : Access(n)
Exemples funx → x
Access(0)
funx → let y= ... in let z= ... in funt → ... x ...
Access(3)
Compilation
État de la machine(registre,code,pile)
registre: contient une valeur ou un environnement code: instructions
pile: chaque élément est valeur, ou env., ou adresse de retour Les instructions
i ::= Loadi(n)|Loadb(b) chargement de cst dans le registre
| Plus|Equal opérations binaires (arith, tests, ...)
| Access(n) accès dans env.
| Branch(c1,c2) branchement
| Push|Swap empile, échange
| Mkclos(c) constr. de valeur fonctionnelle
| Apply application
Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 22 / 26
La machine dans tous ses états
État État suivant
(r,Loadi(n) ::c,p) ⇒ (n,c,p) (r,Loadb(b) ::c,p) ⇒ (b,c,p) (n,Plus::c,m::p) ⇒ (n+m,c,p) (n,Equal::c,m::p) ⇒ (n=m,c,p) (true,Branch(c1,c2) ::c,r ::p) ⇒ (r,c1,c::p) (false,Branch(c1,c2) ::c,r ::p) ⇒ (r,c2,c::p) (r,Push::c,p) ⇒ (r,c,r ::p) (r1,Swap::c,r2::p) ⇒ (r2,c,r1::p) (r,Mkclos(c1) ::c,p) ⇒ (hc1,ri,c,p) (v,Apply::c,hc0,r0i::p) ⇒ ((v,r0),c0,c::p)
(ρ,Access(n) ::c,p) ⇒ (ρ(n),c,p) (r,[ ],c::p) ⇒ (r,c,p)
Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 23 / 26
La machine dans tous ses états (en OCaml)
let next state=matchstatewith
(r, Loadi n::c, p) → (I(n), c, p)
| (r, Loadb b::c, p) → (B(b), c, p)
| (I(n), Plus::c, I(m)::p) → (I(n+m),c, p)
| (I(n), Equal::c, I(m)::p) → (B(n=m),c, p)
| (B(true), Branch(c1,c2)::c, r::p) → (r, c1, A(c)::p)
| (B(false), Branch(c1,c2)::c, r::p) → (r, c2, A(c)::p)
| (r, Push::c, p) → (r, c, r::p)
| (r1, Swap::c, r2::p) → (r2, c, r1::p)
| (r, Mkclos(c1)::c, p) → (C(c1, r), c, p)
| (v, Apply::c, C(c0,r0)::p) → (E(v,r0), c0, A(c)::p)
| (E(v,r), Access(0)::c, p) → (v, c, p)
| (E(v,r), Access(n)::c, p) → (r, Access(n−1)::c,p)
| (r, [ (∗ ret ∗) ], A(c)::p) → (r, c, p)
| (r, [ ] , [ ] ) → raise(Success r)
| _ → error "Error: invalid state (machine stopped)"
La compilation
Compilation du noyau
[[n]]ρ = Loadi(n)
[[b]]ρ = Loadb(b)
[[x]]ρ = Access(n)
oùnest la profondeur dex dansρ [[e1e2]]ρ = Push; [[e1]]ρ;Swap; [[e2]]ρ;Apply [[ife1thene2 elsee3]]ρ
= Push; [[e1]]ρ;Branch([[e2]]ρ,[[e3]]ρ) [[funx → e]]ρ = Mkclos([[e]]x,ρ)
[[letx=e1 in e2]]ρ = [[(funx → e2)e1]]ρ
Compilation des définitions récursives ? Laissée en exercice
Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 25 / 26
Conclusion
La sémantique opérationnelle
précise comments’effectuent les calculs se rapproche des interprètes
La compilation
consiste essentiellement à expliciter le contrôle (manipulation de pile)
Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 26 / 26