Sous-sections
Mots clés : sémantique, sémantique
dénotationnelle, sémantique opérationnelle .
Résumé :
La sémantique d'un langage de programmation s'attache à
donner un sens mathématique aux programmes. Il existe
différentes méthodes formelles de définition de sémantique
comme les méthodes opérationnelle et dénotationnelle. Une
sémantique dénotationnelle attribue un sens aux programmes
d'un langage en associant à chaque construction syntaxique
du langage une valeur dans un domaine de définition. Une
sémantique opérationnelle donne un sens aux programmes en
terme d'étapes de calcul (ou réécritures). Quel que soit
son mode de définition, une sémantique permet d'Ôter toute
ambiguïté dans la définition d'un langage de programmation.
Elle peut aussi fournir une base pour des techniques de
manipulation formelle de programmes : preuves de
propriétés de correction, analyse, transformation. C'est
dans cette optique que les sémantiques de langages sont
utilisées dans le projet Lande.
La sémantique d'un langage de programmation s'attache à
donner un sens mathématique aux programmes. Il existe
différentes méthodes formelles de définition de sémantique
comme les méthodes axiomatique, algébrique, opérationnelle ou
dénotationnelle. Nous présentons ici les méthodes
dénotationnelle et opérationnelle sur un langage très simple
d'expressions arithmétiques :
E : : =
N | E1 +
E2
où N représente un entier
Sémantiques dénotationnelles
Une sémantique dénotationnelle [Sch86]
attribue un sens aux programmes d'un langage à l'aide d'une
fonction qui associe à chaque construction syntaxique du
langage une valeur dans un domaine de définition. La
sémantique d'une expression est construite à partir de celle
de ses sous-expressions ; on dit que la sémantique est
compositionnelle. La technique de preuve classique quand on
travaille avec de telles sémantiques est la récurrence sur la
structure ( structural induction).
En prenant les entiers naturels Nat comme domaine
sémantique et la fonction Plus : Nat
x Nat
Nat, la sémantique dénotationnelle de notre langage
se décrit comme suit :
 |
: |
Expression
Nat |
[[N]] |
= |
Val (N) |
[[E1 + E2]] |
= |
Plus (
[[E1]],
[[E2]]) |
Dans la deuxième ligne de cet exemple, il est important
de noter la distinction entre le symbole N, qui dénote un élément de syntaxe du
langage, et Val (N)
qui représente la valeur correspondant à N dans l'ensemble Nat. Sur ce
langage élémentaire, la sémantique dénotationnelle apparaît
presque comme une paraphrase de la syntaxe. Ce n'est plus le
cas pour des langages plus réalistes. Par exemple, la
sémantique d'un langage impératif classique encode à l'aide
de fonctions un environnement, une mémoire et le flot de
contrÔle ; la sémantique d'un programme récursif est la
plus petite solution de l'équation qui le définit ( plus
petit point fixe).
Les sémantiques opérationnelles donnent un sens aux
programmes en terme d'étapes de calcul (ou réécritures). Nous
présentons ici deux styles de sémantiques
opérationnelles : les sémantiques opérationnelles
structurelles et les sémantiques naturelles.
Une sémantique opérationnelle structurelle
(SOS) [NN92]
est un système composé d'axiomes et de règles d'inférence qui
décrit le comportement du programme en terme d'étapes
élémentaires de calcul (on parle de sémantique à petits pas).
La technique de preuve classique associée à ce type de
sémantique est la récurrence sur le nombre d'étapes de
calcul.
La SOS de notre langage se décrit à l'aide
d'un axiome et de deux règles d'inférence :
N1+N2
N où
N est la somme de
N1 et
N2
Une règle d'inférence est constituée d'hypothèses (partie
haute) et de conclusions (partie basse). Dans cet exemple,
N dénote une expression
complètement réduite (c'est à dire un entier) et Ei des expressions
quelconques. La seconde règle ne peut donc s'appliquer que si
l'expression à gauche du symbole +
a déjà été calculée, ce qui impose un ordre d'évaluation des
arguments « gauche-droite ».
Une sémantique naturelle [Kah87]
décrit le comportement du programme par un arbre de
dérivation décrivant le calcul de ses composants. Elle ne
fait apparaître que les réductions des expressions en leur
résultat final (leur forme normale). On parle de sémantique à
grands pas et la technique de preuve associée est la
récurrence sur les arbres de dérivation.
La sémantique naturelle de notre langage se décrit comme
suit.
N
N
Contrairement à la SOS précédente, cette
sémantique n'impose pas d'ordre d'évaluation particulier
entre E1 et
E2. Les
sémantiques naturelles permettent de cumuler certains
avantages des SOS et des sémantiques
dénotationnelles : comme les premières, elles
fournissent des informations sur les étapes de calcul, ce qui
facilite la définition d'un certain nombre d'analyses ;
comme les secondes, elles déterminent le sens d'une
expression en fonction de ceux de ses sous-expressions. Cette
forme de compositionnalité facilite les raisonnements sur les
programmes.
Quel que soit son mode de définition, une sémantique
permet d'Ôter toute ambiguïté dans la définition d'un langage
de programmation. Elle peut aussi fournir une base pour des
techniques de manipulation formelle de programmes :
preuves de propriétés de correction, analyse, transformation.
C'est dans cette optique que les sémantiques de langages sont
utilisées dans le projet Lande.