Précédent : Logiciels Remonter : Projet CROAP, Conception et
réalisation Suivant : Actions industrielles
Nous avons conçu TRFL, un nouveau langage de transformations qui fournit à la fois un haut niveau d'abstraction, et des performances raisonnables (en modes interactif et batch). Nous souhaitons également pouvoir associer des outils d'aide à la preuve de ces transformations.
La définition syntaxique et sémantique de TRFL est en cours d'achèvement [24]. Un prototype interactif au sein du système CENTAUR a été développé, dans le style de celui associé au langage TRANSFORM.
Le prototype batch a été ensuite intégré à
FORESYS, autour d'une application
pour le langage FORTRAN (voir Section
).
Enfin, une application permettant de générer des documents HTML à partir de modules LELISP a été spécifiée en TRFL, puis utilisée pour la documentation du prototype.
Mikael Pettersson s'est intéressé aux techniques de mise au point de programmes (points d'arrêt, visualisation de la mémoire, etc) et a proposé une méthode portable pour les implanter. Pour cela, le compilateur a besoin d'instrumenter de façon élémentaire le code et de générer un ensemble d'informations statiques sur les structures de données. L'outil de mise au point est ensuite obtenu en se connectant à une librairie générique de mise au point. L'ensemble de ce travail a été soumis à la conférence CC'98 (Intl. Conference on Compiler Construction).
Dans le cadre d'un stage de DEA, en collaboration avec Philipp Kutter (ETH Zürich) et Alonso Pierantonio (Università degli Studi dell'Aquila) nous nous sommes intéressés à la possibilité de traduire des spécifications MONTAGES vers AS/CS et TYPOL. MONTAGES est un système de spécification semi-graphique de langages de programmation en cours de développement utilisant pour sa partie sémantique les machines abstraites de Gurevich. Il est développé par Ph. Kutter et A. Pierantonio. Le but d'une telle traduction est de fournir un environnement CENTAUR à un langage dont la définition initiale est faite pour un autre système.
Cette expérience, si elle a montré la viabilité d'une telle démarche, n'a pas permis pour l'instant de générer une sémantique naturelle raisonnable. La sémantique obtenue ressemble plus à un évaluateur d'attributs implémenté en TYPOL qu'à une sémantique naturelle telle qu'elle aurait pu être écrite directement. Bien que la génération d'une meilleure sémantique semble possible, il n'est pas prévu d'aller plus loin dans cette voie, qui permettrait pourtant d'appliquer les possibilités de preuves propres à la sémantique naturelle à des langages spécifiés à l'aide de MONTAGES.
Le composant d'affichage bidimensionnel incrémental que nous développons dans le cadre de notre collaboration avec Bull dans le GIE Dyade est la partie centrale d'une expérience d'environnement de programmation contenant une chaîne quasi-complète d'outils, implémentée en JAVA. Cette expérience montre que l'ensemble des fonctionnalités fournies jusqu'alors par CENTAUR peut être disponible dans un environnement 100% JAVA.
Dans le cadre d'un stage de DEA, nous avons repris notre environnement pour Mini-ML : syntaxe, spécifications (règles de typage, évaluation et traduction vers la Cam) en Sémantique Naturelle, traduction automatique vers COQ et preuves en COQ [28]. Une preuve de correction de la traduction de Mini-ML vers la Cam, variante de celle réalisée par l'équipe Coq (Samuel Boutin) en 95, a été aisément réalisée. La spécification du typage et sa preuve de correction présentent plus de difficultés, le système COQ ne permettant pas à l'heure actuelle l'utilisation de la syntaxe abstraite fonctionnelle.
*** rajouter un pointeur vers la section introduisant la notion en question, dans la section 3 ***
Nous avons caractérisé et prouvé des propriétés de la sémantique de EIFFEL// que nous étudions : l'organisation des objets en sous-ensembles disjoints (sous-systèmes) et la séquentialité de l'exécution à l'intérieur d'un sous-système, etc. Ces propriétés ont pour but d'une part, de prouver la correction partielle de la sémantique et d'autre part, de servir de base pour la preuve d'équivalence entre programmes séquentiels et parallèles [11,17].
Nous étudions comment paralléliser des programmes à objets de manière automatique ou semi-automatique ; il s'agit de découvrir, grâce à des techniques d'interprétation abstraite, des propriétés du graphe d'objets qui permettront de comprendre comment introduire des activités concurrentes dans des programmes JAVA. À partir d'une sémantique opérationnelle du langage JAVA, nous définissons une abstraction des règles et des structures sémantiques utilisées, afin d'obtenir ainsi une sémantique abstraite, premier pas vers un grand nombre d'analyses de formes. Ces analyses statiques permettront de dériver divers outils d'aide à la programmation.
Nous avons décrit une sémantique formelle d'un sous-ensemble de JAVA. Pour décrire la sémantique des concepts d'objets et d'héritage, nous avons utilisé une sémantique de type big-step. Cependant, pour la sémantique des aspects parallèles de JAVA, nous sommes passés à une sémantique small-step, indispensable pour décrire les actions concurrentes des threads et l'entrelacement. À partir de cette sémantique, nous dérivons un interprète du langage qui permet de visualiser, en cours d'exécution, les objets, les threads, leurs attributs et leur activité [31,33].
En complément, nous sommes en train de développer une spécification exécutable en RML (également basé sur la sémantique naturelle) de la machine virtuelle de JAVA.
Dans le but d'améliorer nos systèmes, et en complément aux travaux effectués dans le projet, nous avons repris notre étude des langages de programmation, en commencant par un petit langage à objets, le sigma-calcul avec récursion et sous-typage introduit par M. Abadi et L. Cardelli (A Theory of Objects, 1996). Ce travail a fait l'objet d'un stage de Magistère [29]. Une preuve partielle de conservation des types a été réalisée en COQ. L'expérience a mis en évidence certaines faiblesses des systèmes utilisés. Du côté CENTAUR, les règles de Sémantique Naturelle décrites en TYPOL sont loin d'être lisibles. Du côté COQ, les principes d'induction générés actuellement par le système ne sont pas toujours assez généraux, rendant relativement difficiles les preuves par double induction ou sur des structures mutuellement récursives.
Pour pouvoir spécifier et faire des preuves sur de vrais langages à objets de manière raisonnable, en suivant notre approche, il nous semble impératif d'améliorer les systèmes CENTAUR et COQ sur les points relevés.
Le but initial de cette thèse est de comprendre quels sont les outils spécifiques à la programmation parallèle asynchrone dont le programmateur peut avoir besoin. Nous nous attacherons particulièrement à la spécification et à la conception d'applications dans le but de générer une partie du code habituellement écrit à la main.
Participants : Yves Bertot , Yann Coscoy , Ranan Fraer ,
Gilles Kahn , Olivier Pons , Laurence Rideau
Mots-clés : environnement de preuve, programme annoté
édition structurée: mode d'édition de documents qui
respecte une structure syntaxique et permet d'éviter les erreurs
de syntaxe
Le projet s'intéresse à différents aspects de l'interaction avec les systèmes de validation de programme et les systèmes de preuve. En particulier nous développons et distribuons le logiciel CTCOQ qui fournit une interface homme-machine conviviale pour le système de preuve COQ.
La coupe par rapport à une variable et un point
donné dans un programme est formée par les instructions du
programme qui affectent la valeur de
en ce point.
Dans le cas des programmes annotés, le critère d'intérêt n'est
plus la valeur d'une variable mais la validité d'une assertion
logique en un point du programme. La coupe de condition
obtenue en isolant ces instructions permet de mieux comprendre
pourquoi l'assertion respective est valide ou non.
Le calcul des coupes de condition repose sur le traçage des dépendances de Field et Tip. Nous avons été amenés à adapter cette technique à l'instrumentation des règles d'inférence. Par ailleurs, nous avons proposé des structures de données plus économiques pour le stockage des coupes. Enfin, nous avons comparé les coupes de condition aux coupes de programme et aux coupes de prédicat de Comuzzi et Hart. L'ensemble de ce travail est présenté dans [12].
Notre étude sur les coupes de condition met en évidence une faiblesse du calcul wp de la plus faible précondition. Si ce calcul capture fidèlement les dépendances de données d'un programme, il prend mal en compte les dépendances de contrôle. En réponse à ce problème nous avons proposé une analyse de dépendances sur les instructions et les assertions d'un programme annoté. Cela nous a permis de calculer les conditions de vérification directement sur le graphe de dépendances. Nous avons prouvé que les conditions obtenues sont équivalentes à celles du programme initial, tout en étant plus simples. Une deuxième application des dépendances se trouve dans les transformations des programmes annotés. En permutant une assertion avec les instructions dont elle ne dépend pas, nous pouvons nous dispenser des assertions redondantes dans l'annotation d'un programme. L'ensemble de ce travail est également présenté dans [12].
Nous avons amélioré les outils de navigation et de retour en arrière logique dans une preuve de grande taille. Une difficulté théorique est apparue dans le traitement des tactiques générant des variables existentielles, qui représentent des valeurs dont la définition est reportée à plus tard. Les contraintes introduites à l'instanciation de ces variables peuvent contredire l'hypothèse d'indépendance des branches de l'arbre de preuve qui est à la base du retour en arrière logique. Cela nous conduit à réintroduire un ordre chronologique pour les commandes et sous-buts qui font intervenir des variables existentielles.
Nous avons par ailleurs commencé un travail sur le calcul des dépendances entre les théorèmes et définitions. Il s'agit de construire le graphe de dépendances entre les théorèmes d'une théorie et de l'utiliser pour des applications variées comme engendrer la théorie minimale pour un théorème particulier, faire la présentation complète des preuves en langue « pseudo-naturelle » (en utilisant les outils de Yann Coscoy déjà intégrés dans COQ), ou énumérer les théorèmes à modifier lors du changement d'un lemme. Des prototypes ont été développés pour les deux premières tâches, pour la dernière un prototype est à l'étude. L'information contenue dans le script de preuve n'est pas suffisante et l'on doit analyser également la structure interne des termes de preuve. Les problèmes rencontrés dans ces applications viennent principalement de l'inadéquation entre les informations qui apparaissent dans le script de preuve et celles qui apparaissent dans le terme de preuve.
Nous poursuivons nos travaux sur la production d'une description en langue naturelle de preuves formelles.
Les travaux de cette année ont porté sur la pertinence des textes obtenus. Nous avons développé un système, paramétrable par l'utilisateur, qui permet d'attribuer un coût à chaque étape élémentaire d'une preuve. Cela permet d'en identifier les trivialités et ainsi de produire des textes explicatifs plus courts. De plus, ce système, tout en réduisant la taille des explications, permet d'assurer que celles-ci conservent toutes les informations nécessaires à la compréhension du lecteur. Les textes que nous produisons désormais sont à la fois plus concis et plus clairs.
Ces travaux sur la production d'explications textuelles de preuves ont donné lieu à une publication [20]. Il existe aussi deux implémentations distribuées avec le système COQ et avec l'environnement CTCOQ. Celles-ci permettent d'obtenir des textes en français ou en anglais.
Le calcul formel est un champ d'application et de mise à l'épreuve important pour notre recherche sur les environnements de preuve. En effet, les algorithmes rencontrés utilisent des structures bien représentables en COQ et les preuves à effectuer sont de grande taille, ce qui permet de valider le passage à l'échelle de nos outils.
Une base de Gröbner est un ensemble de polynômes qui permet d'obtenir un test simple d'appartenance à un idéal de polynômes (un idéal étant un ensemble stable par addition et multiplication). Ces bases de Gröbner jouent un rôle central dans l'algorithmique des polynômes. Dans le but de montrer la viabilité de la certification par machine des algorithmes de calcul formel, on s'est intéressé à un algorithme classique de calcul de bases de Gröbner : l'algorithme de Buchberger. On a défini l'algorithme dans le démonstrateur COQ et on a prouvé sa correction et sa terminaison. Cette preuve a été intégralement effectuée sous CTCOQ. Ce cas d'étude et ses conclusions sont décrits dans [32].
En parallèle nous avons commencé un travail de fondation pour le démonstrateur COQ qui consiste à développer des bibliothèques réutilisables pour les structures de base du calcul formel (anneaux, corps, polynômes).
Mots-clés : sémantique, sémantique naturelle,
induction, lambda-calcul, théorie des types,
COQ
Syntaxe abstraite fonctionnelle: Syntaxe abstraite
d'ordre supérieur. Technique de représentation des langages de
programmation qui permet de formaliser les notions de variables
liées et de substitution d'un langage.
Joëlle Despeyroux, Frank Pfenning et Carsten Schürmann ont
proposé récemment [21]
un système -- un -calcul modal étendu
avec des opérateurs de raisonnement par cas et d'itération --
permettant la récursion sur des termes de type fonctionnel.
Nous proposons une variante de ce système, meilleure sur plusieurs points. D'une part, nous avons changé le noyau modal en reprenant celui de Frank Pfenning et Hao-Chi Wong (1995), plus agréable pour l'utilisateur. D'autre part, nous avons remplacé les règles d'évaluation du système initial par des règles de réduction, auxquelles nous avons ajouté l'êta-expansion.
Guidés par les travaux de N. Ghani sur l'êta-expansion, nous
avons montré les propriétés essentielles de notre système :
préservation du typage par réduction, confluence et normalisation
forte de la réduction. Nous en déduisons que notre calcul, comme
le calcul initial, est une extension conservative du -calcul simplement typé. Nous travaillons sur une
extension vers les types dépendants, extension que le calcul
initial ne semblait pas pouvoir permettre.
Dans ce travail, nous donnons une définition formelle de la syntaxe abstraite fonctionnelle (sans types dépendants) et de la récursion correspondante en termes catégoriques. Au passage, nous introduisons la notion de catégorie factorielle (fermée) : une catégorie factorielle (fermée) est une catégorie cartésienne (fermée) dans laquelle les types isomorphes sont égaux.
Nous avons amélioré le système issu du modèle catégorique
proposé dans la section précédente afin de pouvoir typer autant
de calculs que la logique modale. Cela nous a conduit à un second
modèle catégorique correspondant à un système de calcul plus
expressif. Comme le précédent, ce système a deux flèches : l'une
préserve l'espace des fonctions du -calcul
simplement typé (sans construction inductive) tandis que l'autre
permet de typer toutes les fonctions, en particulier celles
construites avec les opérateurs de récursion. Forts de cette
expérience, nous introduisons une logique à deux flèches DL, qui
s'implémente bien par exemple en LF, et qui fournit un cadre très
naturel pour implémenter non seulement la récursion pour la
syntaxe abstraite fonctionnelle, mais également d'autres systèmes
à deux niveaux comme la logique linéaire, la logique modale ou
l'inférence de types de Mini-ML.
Dans un travail en cours, prolongeant celui de Joëlle
Despeyroux et André Hirschowitz présenté en 1994, nous
définissons la sémantique d'ordre supérieur. En effet
notre thèse est que la sémantique telle qu'on peut l'écrire en LF
ou en -prolog, n'est pas vraiment le
formalisme adapté à la syntaxe fonctionnelle (ou d'ordre
supérieur) : comme nous l'expliquons dans le travail précédent,
les sous-arbres d'un arbre de syntaxe abstraite fonctionnelle
représentent des fonctions d'un nombre d'arguments qui peut
croître à mesure qu'on s'enfonce dans l'arbre. Nous pensons que
la sémantique adaptée doit manipuler des jugements dont le sujet
est aussi une fonction d'un nombre variable d'arguments. Nous
savons déjà définir cette sémantique d'ordre supérieur, pour
laquelle nous étudions une formalisation en
COQ et essayons de trouver une
syntaxe concrète agréable. Le but final de cette recherche est de
spécifier et implémenter un TYPOL
d'ordre supérieur.
Nous nous sommes penchés sur l'impact des syntaxes abstraites fonctionnelles sur l'édition syntaxique. La conclusion de cette étude est que cela permet de « descendre » au niveau de l'édition syntaxique des contraintes vérifiées traditionnellement par les vérificateurs de types, permettant une aide plus efficace à l'utilisateur.
Une première simulation d'implémentation a été réalisée en utilisant le VTP de CENTAUR. La conclusion est que si de nouvelles possibilités fonctionnelles sont bien présentes, il n'est pas raisonnable de s'appuyer sur l'actuel VTP pour implémenter des syntaxes fonctionnelles. La réalisation en JAVA d'un nouveau VTP adapté à la syntaxe abstraite fonctionnelle est donc fortement envisagée.
La conception du langage CS de spécification de syntaxes concrètes modulaires a été poursuivie. Il prend maintenant en compte non seulement l'aspect analyse syntaxique, mais aussi l'aspect présentation. Le formalisme CS couvre donc maintenant à la fois le champ d'utilisation de METAL et de PPML (avec pour l'instant des fonctionnalités réduites) tout en permettant la spécification de syntaxes modulaires. Cette formulation unique permet de garantir la compatibilité entre analyseur et décompilateur ce que ne permettait pas l'utilisation de METAL et PPML.
Le nouveau formalisme permet une utilisation beaucoup plus légère des contextes de PPML. Les fonctions de calcul de précédence deviennent inutiles. En outre, l'utilisation de contextes pour l'analyse syntaxique permet une résolution très aisée de certaines ambiguïtés ou conflits tels que ceux rencontrés pour les « else » dans certains langages avec METAL et YACC.