Mots clés : sémantique,
environnements, méthodes formelles et preuves, analyses de
programmes, fiabilité du logiciel, sécurité .
Participants : Isabelle Attali,
Gilles Barthe, Denis Caromel, Carine Courbis, Pascal Degenne,
Guillaume Dufay, Alexandre Fau, Ludovic Henrio, Line
Jakubiec, Philippe Ladagnous, Francis Montagnac, Henrik
Nilsson, Didier Parigot, Marjorie Russo.
Depuis les débuts de l'informatisation des tâches,
l'utilisateur (du plus novice au plus expert) a toujours eu
besoin d'aide pour mettre au point ses programmes, manipuler
une banque de données, construire un circuit imprimé ou
encore concevoir un plan d'architecte. L'existence des termes
comme CAO (Conception Assistée par Ordinateur), EAO
(Enseignement Assisté par Ordinateur), PAO (Publication
Assistée par Ordinateur), ou dans un domaine plus proche,
CASE (Computer-Aided Software Engineering), montre bien
l'état des besoins.
Les domaines d'utilisation d'outils d'aide sont nombreux
et variés : les interfaces homme-machine, la
programmation, les aspects distribution et configuration de
systèmes, les environnements de développement de preuves, la
gestion de librairies, la simulation et l'évaluation de
performance, etc.
Nous sommes donc convaincus de l'utilité d'environnements
de développement dans lesquels le programmeur sera guidé,
dans la mise au point de ses applications, par des outils
interactifs, graphiques, utilisant la sémantique du langage.
A ce titre, Java Card est un bon exemple par la taille
réduite des applications, et permet d'envisager le traitement
de problèmes insolubles dans le cas plus général
d'applications contenant des millions de lignes de code.
Nous nous appuyons sur la Sémantique Naturelle (formalisme
issu de la sémantique opérationnelle structurelle et de la
déduction naturelle). Une spécification est un ensemble de
règles d'inférence qui décrivent comment déduire une
conclusion à partir de prémisses. Les règles décrivent le
comportement des constructeurs du langage manipulé.
L'approche structurelle de la méthode apparaît dans la forme
des séquents, qui ont généralement un sujet, terme
d'une syntaxe abstraite. Nous avons étudié plusieurs classes
de langages de programmation, en nous spécialisant sur les
langages à objets (Eiffel, Java) [2,1].
Ces environnements gagnent à être associés à des outils
d'analyses statiques et de transformations qui assurent une
certaine aide à la programmation et à l'optimisation de
programmes [10].
Enfin le contexte applicatif (Internet, commerce
électronique, cartes à puce et sécurité) nous pousse à nous
intéresser à des outils de vérification qui seront
particulièrement utiles aux programmeurs pour garantir qu'une
politique de sécurité est respectée (identification,
intégrité, confidentialité), par exemple, que tel programme
gardera des données intègres en cas de retrait inopiné de la
carte.
Notre travail sur les transformations de programmes comme
outils de généricité nous a amené à comparer différentes
techniques de transformations issues de divers styles de
programmation : fonctionnelle pour la technique de
déforestation et la programmation polytypique, à objets pour
les visitor patterns ou les tree traversals
et enfin les grammaires attribuées [9,7].
Notre travail sur la formalisation des sémantiques des
langages nous a amené à proposer des extensions aux systèmes
de types existants. Nous avons tout particulièrement étudié
le sous-typage par constructeurs [3], qui
permet de formaliser d'une manière élégante de nombreux
exemples de sémantique naturelle.