Projet : LANDE

previous up next contents
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 $ \rightarrow$ Nat, la sémantique dénotationnelle de notre langage se décrit comme suit:
$ \varepsilon$ : Expression $ \rightarrow$ Nat
$ \varepsilon$ [[N]] = Val (N)
$ \varepsilon$ [[E1 + E2]] = Plus ( $ \varepsilon$ [[E1]], $ \varepsilon$ [[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).

Sémantiques opérationnelles

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 $ \Rightarrow$ N où N est la somme de N1 et N2

$ \mbox{ $\frac{ \begin{array}{@{}l@{}} \rule{0pt}{0pt}{E_1}\Rightarrow {E_1'} \... ...}$\space \settowidth{\condlength}{} \ifdim\condlength>0pt\hspace{1em}\fi \ \ } $ $~~~~~ \mbox{ $\frac{ \begin{array}{@{}l@{}} \rule{0pt}{0pt}{E_2}\Rightarrow {E_... ...}$\space \settowidth{\condlength}{} \ifdim\condlength>0pt\hspace{1em}\fi \ \ } $

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 $ \Rightarrow$ N                $ \mbox{ $\frac{ \begin{array}{@{}l@{}} \rule{0pt}{0pt}{E_1}\Rightarrow {N_1} \h... ...0pt\hspace{1em}\fi où $N$\space est la somme de ${N_1}$\space et ${N_2}$\ \ } $
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.



previous up next contents
Précédent : Fondements scientifiques Remonter : Fondements scientifiques Suivant : Analyse de programmes