Projet :
LANDE

Précédent : Fondements scientifiques Remonter :
Fondements
scientifiques Suivant : Analyse de programmes
Sous-sections
Sémantique des langages de programmation
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 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 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.

Précédent : Fondements scientifiques Remonter :
Fondements
scientifiques Suivant : Analyse de programmes