Projet Lande

previous up next contents
Précédent : Composition de l'équipe Remonter : Projet LANDE, Conception et validation Suivant : Fondements scientifiques



Présentation générale et objectifs

  Le thème de recherche central du projet LANDE est la conception de méthodes et d'outils d'aide au développement et à la validation de logiciels. Ces méthodes possèdent deux caractéristiques majeures:
1.
Elles reposent sur des bases formelles (sémantique de langage, modèle de sécurité, etc.) permettant d'apporter des garanties quant à la correction des outils.
2.
Elles conduisent, autant que faire se peut, à des outils automatiques. Les utilisateurs visés sont en effet des programmeurs ou des valideurs qui ne possèdent pas forcément d'expertise particulière en matière de méthodes formelles ou de techniques de preuves.
Pour atteindre ces objectifs, nous distinguons deux types d'interventions: les traitements postérieurs à la phase de programmation (<<actions aval>>) et ceux qui la concernent ou la précèdent (<<actions amont>>).

Actions <<aval>>

Les traitements <<en aval>> ou a posteriori concernent la validation de codes existants (vérification, test, débogage). Ce type d'actions s'applique à des logiciels dont on ne maîtrise pas forcément le développement. Nous concevons dans ce cadre des techniques d'aide à la mise au point de programmes qui reposent essentiellement sur des analyses de programmes (statiques ou dynamiques). Par exemple, nous avons proposé une technique permettant la détection d'accès incorrects à la mémoire (déréférences de pointeurs invalides). Cette analyse est extrêmement précise et permet un certain nombre d'interactions avec l'utilisateur. Nous nous intéressons également à l'analyse dynamique, qui sert de base pour l'aide à la mise au point dans le cadre de la programmation logique et des bases de données déductives.

Nous considérons aussi l'analyse sémantique dans une perspective plus large, notamment en étudiant la construction systématique d'analyseurs reposant sur des sémantiques opérationnelles de langages. En particulier, nous avons proposé un format de sémantique naturelle et nous avons appliqué notre méthode à l'analyse de slicing. Nous avons pu ainsi dériver, par simple instanciation d'une définition générique, des analyses dynamiques et statiques pour un langage impératif, un langage fonctionnel et un langage de programmation logique.

En nous appuyant sur des résultats récents concernant l'inférence de types d'intersection et de types polymorphes, nous avons également conçu un algorithme qui permet de déduire pour chaque programme une propriété principale à partir de laquelle toute autre propriété démontrable par l'analyse peut être déterminée. Un avantage de cet algorithme est qu'il traite des fragments de programmes aussi bien que des programmes entiers. Il s'agit donc d'une démarche qui, à plus long terme, peut mener à un cadre général pour l'analyse modulaire.

Le test de logiciels représente un autre centre d'intérêt important du projet. Nous avons proposé une méthode de génération de suites de tests qui a conduit à l'outil CASTING développé en collaboration avec la société AQL. La méthode est indépendante du format d'entrée, ce qui la rend utilisable aussi bien dans le cas du test structurel (ou <<boîte blanche>>) que fonctionnel (ou <<boîte noire>>). Les suites de tests engendrées dépendent de stratégies spécifiées par l'utilisateur, permettant ainsi d'atteindre la souplesse d'utilisation exigée pour un usage industriel. Nous nous intéressons conjointement à la manière d'assurer que des programmes sont conformes à des hypothèses de test, ce qui permet de faire le lien avec la problématique <<vérification de programmes>>.

Actions <<amont>>

Les actions <<amont>> sont utilisables dans le cas, idéal, où il est possible d'agir dans la phase de développement du logiciel. Le but visé est alors de fournir des moyens de construction qui faciliteront la phase ultérieure de validation du logiciel. Les actions de cette catégorie se traduisent notamment par des méthodes et des langages qui induisent une discipline de programmation. Nous étudions dans ce cadre des langages de haut niveau comme les langages déclaratifs (logiques, fonctionnels) ou le langage Gamma conçu à l'Irisa. Ces langages fournissent un pouvoir d'expression appréciable tout en offrant un niveau de description des programmes qui facilite le raisonnement formel (cf. module [*]). S'agissant des langages déclaratifs, les enjeux les plus importants concernent leur mise en oeuvre efficace et la conception d'environnements de programmation adéquats. Ces deux problèmes sont abordés dans le projet LANDE. En particulier, nous avons proposé un cadre formel pour décrire et comparer les techniques de compilation des langages fonctionnels. Cela nous a permis d'établir une taxonomie des mises en oeuvre de langages fonctionnels. Nous avons également étudié l'expression d'optimisations classiques et la conception de machines hybrides (i.e. intégrant plusieurs choix de compilation). Pour ce qui concerne les environnements de programmation, nous avons développé un outil, OPIUM, qui analyse les traces d'exécution de programmes générées par un traceur Prolog existant; nous concevons actuellement un traceur pour Mercury, un nouveau langage de programmation logique développé à l'université de Melbourne.

Les langages déclaratifs possèdent des atouts majeurs qui devraient leur permettre de jouer un rôle plus important dans l'avenir, tout du moins dans certains secteurs d'application. Cependant, ils ne sont cependant pas encore très répandus en milieu industriel. Un autre moyen d'améliorer les pratiques en matière de programmation consiste à apporter des améliorations à des langages largement utilisés. On peut par exemple les augmenter pour y introduire des traits favorisant une programmation plus robuste. Nous avons exploré cette voie en proposant Shape-C, une extension de C intégrant la notion de type graphe. On peut y décrire précisément des structures classiques comme les listes circulaires ou les listes doublement chaînées. La vérification de type permet de détecter de nombreuses erreurs de programmation et la manipulation de pointeurs devient plus sûre.

Une autre action importante dans la catégorie <<amont>> concerne les architectures logicielles. Une ambition majeure dans ce domaine est le passage à l'échelle de techniques comme l'analyse, le raffinement ou la vérification de programmes. Nous avons proposé une manière de spécifier des architectures en terme de graphes. La description d'une application est séparée en deux niveaux bien identifiés: d'une part, l'ensemble de ses entités de base qui représentent des calculs autonomes; d'autre part la coordination de ces entités. Les entités individuelles peuvent être décrites dans des langages traditionnels (par exemple séquentiels) et la coordination est assurée par un composant défini séparément: le coordinateur.



previous up next contents Précédent : Composition de l'équipe Remonter : Projet LANDE, Conception et validation Suivant : Fondements scientifiques