• Aucun résultat trouvé

INE 11

N/A
N/A
Protected

Academic year: 2022

Partager "INE 11"

Copied!
9
0
0

Texte intégral

(1)

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

(2)

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/4

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

(3)

Langage fonctionnel, strict : règles

2/4

Primitives

ρ`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/4

Dé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/4

Applications

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

(4)

Les règles auxquelles vous avez échappé

Production d’erreurs et propagation

x6∈dom(ρ)

ρ`xErreur(IdentErr) ρ`e1r6∈ {T,F}

ρ`ife1thene2elsee3Erreur(IfErr)

ρ`e1r6∈N

ρ`(e1+e2)Erreur(PlusErrL) ρ`e1n1 ρ`e2r6∈N ρ`(e1+e2)Erreur (PlusErrR)

ρ`e1Erreur

ρ`(e1=e2)Erreur(EgErrL) ρ`e1v1 ρ`e2Erreur ρ`(e1=e2)F (EgErrR)

ρ`e1Erreur

ρ`(letx=e1ine2)Erreur(LetErr) ρ`e1r6=Valf(_,_,_)r6=Valfr(_,_,_,_) ρ`(e1e2)Erreur (AppErrL)

ρ`e1Valf(x,e0, ρ0) ρ`e2Erreur ρ`(e1e2)Erreur (AppFErrR)

ρ`e1Valfr(f,x,e0, ρ0) ρ`e2Erreur

ρ`(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

(5)

Langage fonctionnel : évaluation non-stricte

1/4

Coder 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

| . . .

(6)

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)→ (∗ ρ`(funxe)⇒Valf(x,e, ρ)∗) Funval{param=x;body=e;env=rho}

| Pcfast.EIf(e1,e2,e3) → begin

matcheval e1rhowith (∗ ρ`e1T ρ`e2r

ρ`ife1thene2elsee3r ∗)

| Boolvaltrue→ eval e2rho

| Boolvalfalse→ eval e3rho (∗ ρ`e1F ρ`e3r

ρ`ife1thene2elsee3r ∗)

| _ → 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 (∗ ρ`e1n1 ρ`e2n2

ρ`(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) → (∗ ρ`e1v1 ρ[x7→v1]`e2r

ρ`(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)e2r r ∗) let vf =Funrecval{fname=f;param=x;body=e1;env=rho}in eval e2((f,vf)::rho)

| . . .

(7)

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])`e0r

ρ`(e1e2)r

∗)

| Funval{param=x;body=e0;env=rho0}→eval e0((x,v2)::rho0) (∗ ρ0ρ`[fe7→1Valfr(fValfr(f,x,,x,e0e, ρ0, ρ0)]0)[x7→ρ`v2e]2`e0v2r

ρ`(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)

(8)

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

(9)

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

Références

Documents relatifs

Les Premiers soins en santé mentale (PSSM), dans le cadre du projet relatif aux membres de la collectivité des vétérans, visent à améliorer la capacité de la collectivité

The Mental Health First Aid (MHFA) for Members of the Veteran Community Project aims to improve the capacity of the veteran community to address mental health problems and illnesses

[r]

découpage du programme en morceaux compilables indépendamment pour rendre les gros programmes compilables. donner de la structure

Comment produire un analyseur à partir d’une spécification traduction d’expressions rationnelles en automates finis non-déterministes.

[r]

Monsieur Bertrand souhaite acheter un réservoir d'eau ayant la plus grande capacité possible. Il a le choix entre deux modèles : un modèle de forme parallélépipédique rectangle et

Les fils bleus sont reliés au , les fils noirs sont utilisés pour les de commande et les fils rouges sont reliés à la. Pour protéger les utilisateurs on