Partie II Sémantique
Qu’est-ce que c’est ? La sémantique donne le sens d’un langage Pour un langage de programmation, elle permet de prévoir le comportement du programme Pour un langage séquentiel, on suppose que le seul comportement observable est le résultat final.
A quoi ca sert ? La sémantique permet de: décider ce que doit faire un programme dans des cas complexes calculer si des programmes sont équivalents, ce qui permet à un compilateur de remplacer l’un par l’autre. dériver la plupart des analyses de programmes construire des compilateurs fiables
Types de sémantique Sémantique opérationnelle : décrit comment un programme peut s’exécuter Sémantique dénotationnelle : donne un objet (p.ex. une fonction des données vers les résultats) comme sens d’un programme Sémantique axiomatique : donne des règles pour raisonner sur les programmes
Liens les 3 types de sémantique ont leur utilité: la sémantique opérationnelle facilite la construction de compilateurs la sémantique dénotationnelle donne les concepts du langage la sémantique axiomatique est la plus utile pour les programmeurs On peut passer de l’une à l’autre en démontrant leur équivalence.
Sémantique Opérationnelle Structurée
Sémantique opérationnelle Sémantique opérationnelle = on donne le sens du programme en donnant un ensemble d’exécutions possibles. + Avantages : + intuition claire + facilité de construire un interpréteur + traitement du non-déterminisme - Inconvénients fréquents : - non compositionnel : on ne peut pas donner de sens à certaines parties - peu abstrait : difficile de prouver que 2 programmes sont équivalents. difficile de construire un compilateur optimisant.
Sémantique Opérationnelle Structurée On évite les inconvients habituels en ajoutant: Compositionalité : On donne des règles d’inférences qui donnent les exécutions possibles en fonction de celles des composants. Abstraction : On ajoute des règles de similarités disant quelles exécutions sont équivalentes.
Système de déduction Une règle d’inférence est de la forme : prémisses conclusion « Si on a prouvé F1 ... Fn on peut déduire F0 ». (Ici les Fi décriront des exécutions possibles) - S’il n’y a pas de prémisses, on l’appelle un axiome. - Une règle peut contenir des méta-variables càd des variables qui représentent n’importe quel texte d’une catégorie syntaxique donnée. On l’appelle alors un schéma de règle. - Une preuve est un arbre fini composé de règles d’inférences ; elle a une conclusion à la racine, appelée théorème. - La théorie d’un système de déduction est l’ensemble des théorèmes.
Exemple : un système de déduction pour la syntaxe Les formules sont de la forme T : VN (le texte T dérive de VN). Chaque règle non contextuelle, par exemple S if E then S1 else S2 peut se traduire en une règle d’inférence : E : expression S1 : instruction S2 : instruction if E then S1 else S2 : instruction
Exemple : déduction syntaxique Une preuve dans ce système est un arbre syntaxique : Les règles d’inférences peuvent aussi vérifier des conditions de contexte, p.ex. les types :
Sémantique Opérationnelle Structurée : Définition Les formules qui nous intéressent: e1 e2 « dans l’état e1 par un pas d’exécution on arrive dans l’état e2 »
Etats Les états doivent contenir l ’information nécessaire à l ’exécution : la valeur des variables le point d’exécution dans le programme (ici, on le représente par la partie du programme restant à exécuter) l’état de la pile de récursion etc.
Exemple : expressions Pascal on ne traite d’abord que des expressions sans variables et sans effet de bord, donc la mémoire n’est pas (encore) nécessaire.
Règles de congruence : on peut simplifier n ’importe quelle sous-expression en Pascal : de calcul : pour chaque opérateur Pascal, on donne des règles pour calculer la valeur du résultat à partir de la valeur des arguments par exemple : not true false not false true
Exemple 7 + (4 * 5) 7 + 20 27 le premier pas est la règle de congruence pour le 2ème argument; sa prémisse est justifiée par la règle de calcul pour *. le second pas est le calcul de +.
Expressions avec mémoire Un état a maintenant 2 composantes: l’expression à évaluer; l’état de la mémoire : une fonction Identificateur Valeur de congruence : on peut simplifier une sous-expression de calcul : (not true, m) (false, m) (not false, m) (true, m) de recherche de valeur en mémoire: (id, m) (m(id) , m)
Exemple : expression recherche congruence congruence calcul * Donc l’expression s’évalue à 30 en 5 étapes.
Instructions Affectation : 1. (e, m) (e’, m ’) congruence (id := e, m) (id := e’, m ’) calcul := 2. (id := n, m) (skip, update (id, n, m)) instruction vide Conditionnelle : 1. (e, m) (e’, m) (if e then S1 else S2m) (if e’ then S2 else S2m) 2.1 (if true then S1 else S2, m) (S1, m) 2.2 (if false then S1 else S2, m) (S2, m) abréviation (if e then S1, m) (if e then S1 else skip, m) Boucle : (while e do S, m) (if e then begin S ; while e do S end, m) Séquence : (S1, m) (S’ 1, m’) (S1 ; S2, m) (S’1 ; S2, m’) (skip ; S, m) (S, m) e : expr id : identificateur n : const
Système de transitions Les règles de la SOS définissent une machine à états infinis, qu’on appelle aussi un système de transitions
Questions importantes 1. Il y a-t-il plusieurs suites de flèches partant d’un même état ? (déterminisme) 2. Certaines de ces suites sont-elles infinies ? (terminaison) 3. Aboutissent-elles toutes au même état ? (confluence) 4. Quelle forme ont les états finals ? Les état finals corrects ? Déf. : C final = il n’y a pas de C’ : C C’ (forme normale) 5. Les flèches préservent-elles les types ?
Equivalence sémantique La SOS détaille les calculs, donc peu de programme sont équivalents Deux programmes P,Q sont équivalents ssi: ils mènent aux mêmes états finaux ils bouclent dans les mêmes circonstances
Exemple if e then S1 else S2 if not(e) then S2 else S1 1. Si (e, m) * (true, m’) alors 1) (if e then S1 else S2, m) * (if true then S1 else S2, m’) (S1, m’) 2) (e, m) * (true, m’) (not(e), m) * (not(true), m’) * (false, m’) (if not(e) then S2 else S1, m) (if false then S2 else S1, m’) 2. si (e, m) * (false, m’) : preuve symétrique Exemple congruence 2.1 calcul not 2.2.