Informatique et Sciences du Numérique au lycée : un pas plus loin/LANGAGES/Sémantiques
Soit le fragment de texte X=1. En mathématiques ce texte peut signifier " posons X=1". Dans ce cas, le nom X désigne l'entier 1 qui est aussi le rationnel 1, le réel 1, le complexe 1 ... puisque ⊆ ⊆ ⊆ .
Il en est tout autrement en informatique. Placé dans un programme, ce texte peut recevoir plusieurs significations suivant le langage de programmation choisi et la place qu'il occupe dans le programme. Une interprétation erronée conduit à un résultat incorrect. Plusieurs questions doivent être posées. L'association de X à 1 peut elle être modifiée au cours de l'exécution du programme ? Si oui, X est en général appelée variable informatique et ce nom désigne un emplacement de la mémoire où est stockée la valeur 1. Ce fragment de texte "X=1" désigne l'affectation de la valeur 1 à la variable X dans certains langages comme C. Pour rendre compte des évolutions de cet emplacement au cours de l'exécution on utilise la notion d'état mémoire. Si non, X est souvent appelée constante et la notion d'environnement permet de prendre en compte cette liaison de X à 1. Le nom X est il utilisable dans tout le programme ou seulement dans une partie délimitée par un mot clé ou une convention syntaxique ? Cette question est traitée par les notions de portée, déclarations, masquage aussi bien pour les variables que pour les constantes informatiques. Comment cette valeur 1 est elle représentée en mémoire ? La représentation en mémoire (voir architecture des machines) des entiers diffère de celle des réels qui elle même diffère de celle des complexes etc La notion de type ou de classe sert à déterminer la représentation utilisée. Les algorithmes de manipulation des nombres ( comme l'addition) dépendent essentiellement de la représentation choisie et la valeur de n'est pas toujours le successeur de .
Pour terminer cet exemple, notons que en mathématiques, ce même texte peut intervenir dans l'expression "si X= 1". Le fragment "X=1" désigne alors une valeur booléenne. Il en est de même en informatique mais ce fragment peut être directement utilisé comme expression booléenne comme il le serait en logique.
Cet exemple très simple montre que déterminer la signification d'un texte de programme n'a rien d'évident. La section distorsions sémantiques présente quelques exemples commentés. Les significations d'un même fragment de texte diffèrent suivant le langage de programmation utilisé, et dans un même langage suivant sa place dans le texte. Les différentes significations peuvent être données en langage naturel dans un manuel de référence par exemple mais manquent souvent de précision.
Définir formellement la signification d'une construction syntaxique permet de s'affranchir de toute ambiguité et permet également d'étayer un raisonnement sur les propriétés d'un programme. Trois formalismes sont classiquement utilisés: sémantique opérationnelle, sémantique dénotationnelle, sémantique axiomatique. De manière très intuitive, on peut dire que la sémantique opérationnelle décrit les évolutions de l'état mémoire au long d'une exécution. La sémantique dénotationnelle considère un programme comme une fonction de l'ensemble de ses valeurs d'entrée dans l'ensemble de ses valeurs de sortie. La sémantique axiomatique traite de la notion de transformation subie par une propriété au cours de l'exécution.
Alors que les sémantiques opérationnelle, dénotationnelle sont plutôt utilisées pour étudier l'élaboration du résultat d'un programme, on utilise l'interprétation abstraite lorque l'on souhaite étudier une propriété ou un comportement invariant au cours des différentes exécutions d'un programme. Cette théorie permet de construire, à partir d'un modèle sémantique du programme d'essence dénotationnelle, une approximation de ce modèle dédié à l'étude de la propriété. Elle utilise les théorèmes de la Théorie de Galois, qui traite des ensembles ordonnés, l'ordre utilisé ici étant en général celui défini par la progression de l'exécution. L'interprétation abstraite est à la base d'outils dits d'analyse statique utilisés dans l'industrie du logiciel.