Extension du langage while
Transcription
Extension du langage while
Extension du langage while Jean-Claude Fernandez Extension du langage while – p.1/31 Sémantique opérationnelle structurelle: SOS Une sémantique opérationnelle définit un système de transition. Un système de transition est donné par: (Γ, T, →) où • Γ est l’ensemble de configurations. • T ⊆ Γ est l’ensemble des configurations finales. • →⊆ Γ × Γ est la transition de transition. Dans le cas de la sémantique opérationnelle naturelle, on a : 1. Γ = (Stm × State) ∪ State. 2. T = State 3. → définie par des arbres d’inférence. Extension du langage while – p.2/31 Sémantique opérationnelle structurelle: SOS Le système de transition sera tel que par : 1. Γ = (Stm × State) ∪ State. 2. T = State 3. → définie par des séquences d’inférence. Extension du langage while – p.3/31 Sémantique opérationnelle structurelle 1 Idée : Décrire comment le résultat de l’exécution d’un programme est obtenu. Sémantique décrite par un système d’inférence : axiomes et règles. (x := a, σ) ⇒ σ[x 7→ A[a]σ] (skip, σ) ⇒ σ (S1 , σ) ⇒ σ ′ (S1 ; S2 , σ) ⇒ (S2 , σ ′ ) (S1 , σ) ⇒ (S1′ , σ ′ ) (S1 ; S2 , σ) ⇒ (S1′ ; S2 , σ ′ ) Extension du langage while – p.4/31 Sémantique opérationnelle structurelle 2 Si B[b]σ = ff alors (if b then S1 else S2 , σ) ⇒ (S2 , σ) Si B[b]σ = tt alors (if b then S1 else S2 , σ) ⇒ (S1 , σ) (while b do S od , σ) ⇒ (if b then (S; while b do S od ) else skip, σ) Extension du langage while – p.5/31 Séquence d’inférence • Séquence fini : γ1 , γ1 , · · · , γk où • γi ⇒ γi+1 , pour i ∈ [1, k − 1] et • γk 6⇒ c.a.d. qu’il n’existe aucune configuration γ avec γk ⇒ γ . Dans ce cas, si γk n’est pas une configuration finale, on l’appelle configuration bloquante. • Séquence infini : γ1 , γ1 , · · · où γi ⇒ γi+1 , pour i ≥ 1 Donc, on ne considère que des séquence maximale. Extension du langage while – p.6/31 Discussion sur les deux sémantiques opérationnelles Comment modélisent-elles le fait qu’un programme divèrge? • Sémantique naturelle : Un programme S divèrge dans l’états σ , si (S, σ) n’a pas de configuration successeur: (S, σ) 6→ 6 ∃γ · (S, σ) → γ • Sémantique structurelle : Un programme S divèrge dans l’états σ , s’il y a une séquence infini qui commence avec (S, σ). Extension du langage while – p.7/31 Equivalence sémantique • Sémantique naturelle : S1 et S2 sont sémantiquement équivalents, si pour tout états σ et σ ′ : (S1 , σ) → σ ′ ssi (S2 , σ) → σ ′ • Sémantique structurelle : S1 et S2 sont sémantiquement équivalents, si pour tout états σ • Pour toute configuration γ finale ou bloquante: (S1 , σ) ⇒∗ γ ssi (S2 , σ) ⇒∗ γ • Il existe une séquence inifni qui commence avec (S1 , σ) ssi il existe une séquence inifni qui commence avec (S2 , σ). Extension du langage while – p.8/31 La fonction sémantique Ssos Ssos [S]σ = ( σ′ ; Si (S, σ) ⇒∗ σ ′ undef ; sinon Question a-t-on Sns = Ssos ? Lemme Pout tout S , σ et σ ′ Si (S, σ) → σ ′ alors (S, σ) ⇒∗ σ ′ . Lemme Pout tout S , σ et σ ′ 2 Si (S, σ) ⇒k σ ′ alors (S, σ) → σ ′ . 2 Extension du langage while – p.9/31 Styles de sémantique et principes de preuve associés • Sémantique inductive: ex. A. Preuve par induction structurelle sur les expressions arithmétiques. • Sémantique opérationnelle naturelle. Relation de transition définie par les arbres d’inférence. Preuve sur la structure de l’arbre d’inférence. • Sémantique opérationnelle structurelle. Relation de transition définie par les séquences d’inférence. Preuve par récurrence sur la longueur de la séquence d’inférence. Extension du langage while – p.10/31 Lemmes intermédiaires Lemme Pout tout S , σ et σ ′ Si (S, σ) → σ ′ alors (S, σ) ⇒∗ σ ′ . 2 Preuve On montre d’abord Si (S1 , σ) ⇒k σ ′ alors (S1 ; S2 , σ) ⇒k (S2 ; σ ′ ) Preuve de Lemme par induction sur la structure de l’arbre de dérivation de (S, σ) → σ ′ . 2 Extension du langage while – p.11/31 Lemmes intermédiaires 2 Lemme Pout tout S , σ et σ ′ Si (S, σ) ⇒k σ ′ alors (S, σ) → σ ′ . 2 Preuve On montre d’abord Si (S1 ; S2 , σ) ⇒k σ ′′ alors il existe σ ′ et k1 avec : (S1 , σ) ⇒k1 σ ′ et (S2 , σ ′ ) ⇒k−k1 σ ′′ . Preuve de Lemme par reccurrence sur k : (S, σ) ⇒k σ ′ . 2 Extension du langage while – p.12/31 Extensions du langage While • La commande abort. La configuration (abort, σ) n’a pas de sucesseur. C’est le blocage. • La commande or : S1 or S2 . On dénote le langage obtenu par Whileor . Configuration : {(S, σ) | S ∈ Whileor , σ ∈ State} ∪ State. Extension du langage while – p.13/31 Règles de transition pour or • Règles de transition pour SN : (S1 , σ) → σ ′ (S1 or S2 , σ) → σ ′ (S2 , σ) → σ ′ (S1 or S2 , σ) → σ ′ • Règles de transition pour SOS : (S1 or S2 , σ) ⇒ (S1 , σ) (S1 or S2 , σ) ⇒ (S2 , σ) Extension du langage while – p.14/31 Discussion Dans la sémantique naturelle le or "cache" la non-terminaison. Exemple Soit S1 = while true do skip od et S2 = while false do skip od . (S1 or S2 , σ) → σ Mais (S1 or S2 , σ) aura toujours une séquence infini dans SOS. 2 Extension du langage while – p.15/31 La mise en parallèle On ajoute la commande k : S1 k S2 . On dénote le langage obtenu par Whilek . Configuration : {(S, σ) | S ∈ Whilek , σ ∈ State} ∪ State. Règles de transition pour or • Règles de transition pour SN : (S1 ,σ)→σ ′ , (S2 ,σ ′ )→σ ′′ (S1 k S2 ,σ)→σ ′′ (S2 ,σ)→σ ′ , (S1 ,σ ′ )→σ ′′ (S1 k S2 ,σ)→σ ′′ • Règles de transition pour SOS : (S1 , σ) ⇒ (S1′ , σ ′ ) (S1 k S2 , σ) ⇒ (S1′ k S2 , σ ′ ) (S2 , σ) ⇒ (S2′ , σ ′ ) (S1 k S2 , σ) ⇒ (S1 k S2′ , σ ′ ) Extension du langage while – p.16/31 Discussion concernant le k La sémantique naturelle ne permet pas d’exprimer une sémantique d’entrelacement (interleaving semantics). La sémantique structurelle le permet. Extension du langage while – p.17/31 Conclusion Sémantique naturelle • ne distingue pas entre blocage et non-terminaison • non-determinisme "cache" la non-terminaison • ne permet pas d’exprimer la sémantiqued’entrelacement Sémantique structurelle • distingue entre blocage et non-terminaison • non-determinisme ne "cache" pas la non-terminaison • permet d’exprimer la sémantiqued’entrelacement Extension du langage while – p.18/31 Introduction des exceptions : break Provoque l’arrêt de l’exécution de la boucle immédiatement englobante ou, à défaut du bloc immédiatement englobant. Les configurations terminales sont alors State ∪ {stopb } × State.On rajoute, pour la construction break, la règle suivante : (break, σ) −→ (stopb , σ) Extension du langage while – p.19/31 Introduction des exceptions : break Composition séquentielle: us rajoutons la possibilité de déclarer des exceptions et de traiter les exceptions nommées. (S1 , σ) −→ (stopb , σ ′ ) (S1 ; S2 , σ) −→ (stopb , σ ′ ) (S1 , σ) −→ σ ′ (S2 , σ ′ ) −→ (stopb , σ ′′ ) (S1 ; S2 , σ) −→ (stopb , σ ′′ ) Extension du langage while – p.20/31 Introduction des exceptions : break While Bloc (S, σ) −→ (stopb , σ ′ ) B[b]σ = tt ′ (while b do S od, σ) −→ σ (Dv , σ) −→ σ1 (S, σ1 ) −→ (stopb , σ ′ ) (begin DV ; S end, σ) −→ σ ′ [DV (DV ) 7→ σ] Extension du langage while – p.21/31 Introduction des exceptions : exit Cette instruction provoque l’arrêt du programme en cours d’exécution. Les nouvelles configurations terminales sont alors State ∪ {stopb } × State ∪ {stope } × State. Bloc (DV , σ) −→ σ1 (S, σ1 ) −→ (stope , σ ′ ) (begin DV ; S end, σ) −→ (stope , σ ′ [DV (DV ) 7→ σ]) Extension du langage while – p.22/31 Introduction des exceptions : raise possibilité de déclarer des exceptions et de traiter les exceptions nommées. La syntaxe d’un bloc devient : S ::= begin DE ; DV ; S; T end Les déclarations d’exceptions se font de manière analogue aux déclarations de variables : DE ::= exception e; DE | ǫ Un exception est provoquée par la commande raise e. Le traitement d’exception, à la fin du bloc, prend la forme suivante : T ::= when e =⇒ S; T La syntaxe des commandes devient alors : S ::= x := a | skip | S; S | if b then S else S | while b do S od | be break | exit | raise e Extension du langage while – p.23/31 Introduction des E/S On rajoute au langage while deux commandes : S ::= · · · | read(x) | write(a) • La commande read(x) prend en entrée un entier et le range dans la mémoire associée à x, • La commande write(a) écrit la valeur associée à a. on modifie les configurations de la manière suivante : (S, i, o, σ) où S désigne une commande, i la séquence d’entiers en entrée, o, la séquence d’entiers en sortie et σ la mémoire. Par exemple, l’axiome (x := a, σ) → σ[x 7→ A[a]σ] devient (x := a, i, o, σ) → (i, o, σ[x 7→ A[a]σ]) Extension du langage while – p.24/31 Introduction des E/S Entrée (read(x), v : i, o, σ) → (i, o, σ[x 7→ x]) Sortie (write(a), i, o, σ) → (i, v : o, σ) Extension du langage while – p.25/31 Des expressions qui modifient la mémoire ? Extension du langage while – p.26/31 Un interpréteur pour le langage while Structure de données : typedef struct node{ int type_node ; /*oper ou feuille */ leaf val_node ; struct node *fg ; struct node *fd ; struct node *els ; } NODE; typedef NODE *PTR_NODE ; Extension du langage while – p.27/31 Expressions arithmétiques int EvalAexp(n,m) NODE *n; MEM *m; { switch(n->type_node) { case PLUS: return(EvalAexp(n->fg,m)+EvalAexp(n->fd,m)) ; case MOINS: return(EvalAexp(n->fg,m)-EvalAexp(n->fd,m)) ; case MULT: return(EvalAexp(n->fg,m)*EvalAexp(n->fd,m)) ; case NUM: return((n->val_node).u_int) ; case IDF: return(EvalMem(m,(n->val_node).u_char)); } } Extension du langage while – p.28/31 Expressions booléennes int EvalBexp(n,m) NODE *n; MEM *m; { switch(n->type_node) { case AND: return(EvalAexp(n->fg,m)&&EvalAexp(n->fd,m)) ; case EGAL: return(EvalAexp(n->fg,m)==EvalAexp(n->fd,m)) ; case INF: return(EvalAexp(n->fg,m)<EvalAexp(n->fd,m)) ; case TRUE: return(True) ; case FALSE: return(False); } } Extension du langage while – p.29/31 Un interpréteur pour les instructions PTR_MEM interprete(n,m) NODE *n; MEM *m; { int val ; switch(n->type_node) { case ASSIGN: val=EvalAexp(n->fd,m); m=maj_mem(m,((n->fg)->val_node).u_char,val) ; return(m); case SEMI_COLON: m=interprete(n->fg,m); m=interprete(n->fd,m); return(m); Extension du langage while – p.30/31 Un interpréteur pour les instructions case WHILE: val=EvalBexp(n->fg,m); if(val) { m=interprete(n->fd,m); m=interprete(n,m); return(m); } return (m); case IF: val=EvalBexp(n->fg,m); if(val) { m=interprete(n->fd,m); return(m); } else { m=interprete(n->fd,m); return (m); } Extension du langage while – p.31/31