Projet Para

previous up next contents
Précédent : Logiciels Remonter : Projet PARA, Parallélisme Suivant : Actions industrielles



Résultats nouveaux

Analyse d'échappements et glanage de cellules statique



Participants : Alain Deutsch , Bruno Blanchet


 

L'analyse d'échappements (escape analysis) est une interprétation abstraite pour programmes fonctionnels fortement typés élaborée par Park et Goldberg. Cette analyse permet de remplacer statiquement des allocations en tas par des allocations en pile, ce qui diminue le coût du glanage de cellule (garbage-collection) et améliore la localité des données (en particulier pour les caches).

Park & Goldberg ont donné une borne de complexité exponentielle pour l'analyse d'une fonction du premier ordre, par analogie avec l'analyse de strictitude (strictness analysis). Nous montrons que cette borne supérieure est une approximation très grossière : nous exhibons une borne quasi-linéaire (selon la terminologie de Gurevitch & Shelah) en $O(n \log^2{n})$. Toutefois, cette borne n'est valide qu'au premier ordre : nous avons ensuite montré que l'analyse d'échappements précise devient exponentielle au second ordre, et plus précisément DEXPTIME-difficile. Ce travail fait l'objet d'une communication à la conférence POPL'97 [3].

Bruno Blanchet a ensuite étendu cette méthode en traitant les types inductifs, les constructions impératives et (avec approximations) les fonctions d'ordre supérieur, ainsi qu'en donnant une sémantique exacte non instrumentée, tout en conservant une complexité sous-quadratique. Sur le plan expérimental, un prototype intégré aux compilateur CSL a été construit (voir §[*]). Ce travail fait l'objet d'une communication à POPL'98 [2].

Validation de logiciels parallèles par interprétation abstraite

 

Participants : Alain Deutsch


Problématique

Une étude effectuée pendant plusieurs années à Berkeley et à IBM Thomas J. Watson a permis d'établir une typologie des défauts répertoriés sur de grands programmes (de l'ordre de 106 lignes de code). Il en ressort que près d'un tiers de ces défauts se manifestent par une erreur d'exécution (software fault), par opposition aux erreurs qui se manifestent par un comportement non conforme à la spécification. Ce sont justement les erreurs d'exécution qui sont accessibles à l'analyse statique, même lorsqu'on ne dispose pas de spécifications formelles.

Il s'agit là d'applications d'une grande importance pratique et qui ont été peu explorées. Il existe en effet un besoin indéniable pour des outils de détection d'erreurs, comme en témoigne le succès considérable de produits commerciaux de détection dynamique d'erreurs comme par exemple Purify.

Nous nous proposons au contraire d'effectuer cette détection statiquement. Parmi les erreurs d'exécution susceptibles d'être détectées statiquement, citons par exemple : (a) les erreurs de synchronisation et de temporisation dans les langages parallèles et temps-réel, en particulier les conflits d'accès aux variables partagées; (b) les débordements arithmétiques scalaires ou flottants.

Développements théoriques et expérimentaux

Faisant suite à nos travaux des années antérieures sur l'analyse statique interprocédurale par interprétation abstraite, nous avons cette année poursuivi plusieurs axes de recherche, visant en général à obtenir des méthodes d'analyses à la fois plus efficaces, plus précises et plus générales:

1.
adaptation de nos méthodes pour les rendre applicables à des programmes de taille significative (de 104  à 105  lignes de code). Ceci nécessite tant un travail d'ingéniérie qu'un travail de recherche scientifique. En effet, plusieurs méthodes d'analyse statique, parfaitement adaptées à des programmes de taille réduite, ne passent pas à l'échelle. Il a donc été nécessaire de concevoir, dans le cadre théorique de l'interprétation abstraite:
(a)
de nouveaux algorithmes de calculs de point fixes interprocéduraux;
(b)
de nouveaux algorithmes d'analyse numérique.
2.
analyse du parallélisme de type ADA (tâches). La présence de tâches représente une difficulté supplémentaire, qui rend les méthodes d'analyse statique de langages séquentiels non applicables. Nous avons en particulier obtenu:
(a)
une méthode d'identification de conflits d'accès potentiels sur variables partagées, ainsi qu'un générateur de scénarios de conflits d'accès;
(b)
un algorithme d'analyse interprocédurale permettant de prendre en compte les interactions intertâches.
3.
analyse des flottants.

Ces méthodes on été implantées dans l'analyseur statique IABC et testées sur deux des logiciels embarqués du lanceur Ariane 5 (voir §[*]).

Le join-calcul



Participants : Cédric Fournet , Georges Gonthier , Luc Maranget , Carolina Lavatelli , Fabrice le Fessant , Jean-Jacques Lévy , Uwe Nestmann , Didier Rémy


Le join-calcul est maintenant au coeur de l'activité du projet Para depuis deux ans. Le 18 juin, la première version d'un prototype avancé du langage du join-calcul a conclu le travail d'implémentation mené par C. Fournet et L. Maranget. Le système se compose d'un compilateur à byte-code, d'un environnement d'exécution, ainsi que d'une centaine de pages de documentation. Le développement proprement dit (comprenant l'écriture de la documentation) a duré environ 12 mois.

Un certain nombre d'exemples ont également été écrits, notamment par Cristiana Toutet (stagiaire du MIT en juin et juillet), ils illustrent les possibilités du langage.

Le join-calcul permet la programmation concurrente et distribuée, le langage permet une communication et une coopération simple entre deux tâches qui s'exécutent sur des machines différentes.

Dès le départ, le join-calcul a été conçu en tenant compte de la «localisation» des objets manipulés (processus, canaux, groupes de tels objets). Ce souci a facilité la production d'un langage de programmation qui donne au programmeur une vision de relativement haut niveau d'un réseau de machines. Classiquement, cette vision de haut niveau cache les détails de la programmation distribuée sur un système particulier et permet au programmeur de se concentrer sur l'architecture de son programme. Évidemment, cette démarche idéale de programmation ne sera possible que si le langage fournit un jeu de briques de base, briques qui devront être à la fois suffisamment générales pour permettre l'expression des idées du programmeur en quelques briques et à la fois suffisamment simples pour rester compréhensibles, voir réalisables par l'équipe qui a écrit le compilateur.

Dans le cas du join-calcul, une première brique est la communication par canaux, qui peuvent eux-mêmes voyager sur les canaux. Les canaux relient des processus entre eux, une restriction fondamentale du join-calcul est d'imposer un récepteur unique sur chaque canal, ceci permet l'identification d'un canal avec son récepteur. La perte d'expressivité qui en résulte est compensée par la réception jointe, une certaine action ne se déclenchera que si plusieurs canaux reçoivent un message. La nature du calcul et du langage permet la localisation des canaux engagés dans une réception jointe sur la même machine. La réalisation de rendez-vous entre des processus réellement distribués (i.e. résidant sur des machines différentes) devient possible car ce rendez-vous aura lieu par une communication jointe qui se décomposera en deux phases, une phase de transport des messages vers la machine qui possède les canaux de la réception jointe, puis une phase de rendez-vous purement locale et donc assez simple.

La deuxième brique de base du join-calcul est la location. Le contrôle effectif de la localisation des canaux et processus se fait par ce biais: une location est un ensemble de canaux et de processus conçus pour migrer ensemble d'une machine à l'autre. Les locations pouvant être créées dynamiquement, il s'ensuit une notion naturelle de parenté entre locations, puis de structure arborescente des locations. La migration d'une location correspond au déplacement d'un sous-arbre vers un autre point d'attache dans l'arbre des locations. Ici encore, le langage reprend un concept issu des calculs de processus, les machines n'apparaissent pas dans le langage, seul apparaît une location racine par machine. Le réseau de machine est donc abstrait en une forêt de locations, les migrations sont explicites, dans le sens que le programmeur spécifie bien une migration, mais elles restent d'assez haut niveau, tant par ce qui migre (un ensemble cohérent de canaux et de processus contenu dans une location et toutes ses sous-locations) que par la façon dont est donnée la destination de la migration (une autre location dont la location migrante devient une sous-location). Cette approche est entièrement intégrée dans notre prototype et permet l'écriture de programmes distribués, avec communications distantes, migration de code, applets, etc.

Comme démonstrations, le join-calcul permet actuellement de programmer un calcul distribué de l'ensemble de Mandelbrot et quelques jeux distribués. Grâce à l'interface entre Caml et le join-calcul, on a accès automatiquement à des librairies graphiques. Une démonstration a été présentée à TACS'97 [5]. Un article sur l'inférence du type éventuellement polymorphe des canaux a été exposé à CONCUR'97 [4].

Concurrence et sécurité



Participants : Cédric Fournet , Georges Gonthier


En 1997, nous avons continué nos recherches dans l'axe ouvert avec M. Abadi (DEC/SRC) à la fin 1996: l'implémentation sécurisée de la communication avec portée lexicale du join-calcul, et sa vérification utilisant la théorie des équivalences de processus.

L'intérêt de ces travaux réside dans le fait qu'il est très facile d'écrire des protocoles sûrs lorsque la portée lexicale est garantie, alors que les primitives cryptographiques usuelles sont toujours d'un emploi très délicat et subtil. Nos travaux permettent donc de définir un emploi générique, sûr, et modulaire de ces primitives.

La théorie des équivalences de processus, et notamment des équivalences stables par réduction, s'est révélé un outil particulièrement puissant pour l'analyse de nos protocoles cryptographiques. C'est ainsi que plusieurs attaques subtiles par analyse de trafic ont été découvertes par la preuve de correction.

De plus, l'analyse nous a permis de découper nos protocoles en plusieurs modules dont la vérification est indépendante. Nous avons ainsi deux protocoles de transport de base, qui peuvent être utilisés de façon interchangeable par deux méthodes de sécurisation, l'une reposant sur la redéfinition de toutes les primitives, et l'autre sur l'insertion de coupe-feu.

C. Fournet a présenté son approche de ces résultats à la réunion DARPA, sur Foundations for Secure Mobile Code du 26 au 28 mars à Monterey [14], puis l'ensemble de ses résultats au groupe de travail Confer-2 d'Amsterdam. Un article approfondi est en cours de préparation [11].

Equivalences dans le join-calcul



Participants : Cédric Fournet , Georges Gonthier


En collaboration avec M. Boreale (université de Rome) et C. Laneve (université de Bologne), nous avons développé une théorie de la bisimulation pour le join-calcul. Par raffinements successifs de la syntaxe et de la machine chimique, nous ajoutons au join-calcul la possibilité d'interagir directement avec le contexte. Ce travail répond à plusieurs objectifs; d'un point de vue formel, il fournit une sémantique compositionnelle au join-calcul (le join-calcul ouvert), et illustre la notion de localité dans le calcul. D'un point de vue plus pratique, il définit deux équivalences (une bisimulation faible et une bisimulation asynchrone) un peu plus discriminantes que l'équivalence observationnelle du join-calcul, mais plus faciles à établir, ce qui ouvre, par exemple, une voie à une vérification automatique d'identités entre processus.

Un article est en cours de soumission à une conférence, une présentation a été faite par C. Laneve au groupe de travail Confer-2, Amsterdam, en octobre [12].

Par ailleurs, l'utilisation d'équivalences observationnelles pour comparer des processus dans le join-calcul au cours des deux dernières années nous a conduit à l'étude de ces équivalences et de leurs relations. Dans le domaine du parallélisme, de nombreuses relations d'équivalences ont été proposées, pour modéliser certaines caractéristiques des processus, comme la convergence, la sécurité, ou l'équité. Nos résultats portent sur la comparaison de telles équivalences pour des calculs de processus mobiles comme le pi-calcul ou le join-calcul.

Nous nous intéressons surtout à des sémantiques par réduction, où l'observation se réduit à la détection de certains messages, puis raffinée par l'ajout de propriétés génériques comme le passage au contexte ou la bisimulation. Selon la manière de combiner ces propriétés, une multitude de variantes apparaissent. Heureusement, ces variantes mènent souvent aux mêmes équivalences, ou à des équivalences comparables. Notre classification comporte de nouveaux résultats, et rapproche des définitions d'apparences fort différentes comme le fair-testing et la coupled-bisimulation, ou la bisimulation-limite et la bisimulation usuelle à une seule observable. Techniquement, certaines correspondances nécessitent l'emploi de techniques de preuve originales. Plus généralement, cette classification fournit de nombreuses techniques de preuve indirectes, et contribue à une meilleure compréhension des différences entre calculs de processus.

G. Gonthier a présenté ces résultats à la réunion Confer-2 d'Amsterdam; un article est en préparation [15].

Confluence du typage



Participant : Uwe Nestmann


Nous avons recherché les propriétés de confluence dans les systèmes concurrents, communicants par échanges de messages. Ces propriétés sont utiles dans une variété d'applications, par exemple pour raisonner sur les systèmes concurrents ou pour valider les protocoles de communication mobiles ou à grande vitesse. La confluence signifie que pour toute paire de calculs démarrant dans un même état initial, il est possible de prolonger ces calculs pour obtenir un état à nouveau commun. Pour montrer la confluence d'un système, on doit alors démontrer que pour tous les états atteignables par calcul à partir de l'état initial, on peut faire converger les calculs.

Nous montrons la confluence de systèmes concurrents sans avoir à considérer tous ces états atteignables en utilisant un système de types qui permet l'analyse statique de toutes les sources possibles de non-confluence. En effet, dans les systèmes communicants par messages, la confluence est invalidée chaque fois que deux processus entrent en compétition pour communiquer avec un autre processus. Nous pouvons vérifier statiquement l'occurrence de telles situations en les réduisant à l'accès concurrent d'un canal partagé. Pour notre développement technique, nous nous concentrons sur un pi-calcul polarisé, où la notion d'unicité des canaux peut être formalisée par des décompositions disjointes. Nous présentons ensuite un système de types avec canaux à utilisation unique qui, grâce à la préservation des types par réduction, donne un critère suffisant pour garantir la confluence.

Ce travail a été publié à FMICS'97 en collaboration avec M. Steffen (Kiel, Allemagne) [7].

Expressivité et implémentabilité



Participant : Uwe Nestmann


Le pi-calcul avec des envois de messages synchrones et des opérateurs de choix mixtes est strictement plus expressif que le pi-calcul asynchrone sans choix. Comme corollaire, C. Palamidesi a montré récemment qu'il n'y a pas d'encodage du premier dans le second qui préserve l'absence de terminaison et les symétries. Nous montrons qu'il y a néanmoins de bons encodages entre ces calculs. Plus précisément, nous présentons une suite d'encodages pour des langages avec (1) le choix sur des gardes de réception, (2) le choix sur des gardes ou toutes de réception ou toutes d'émission, (3) le choix sur des gardes mixtes, et nous étudions leur composition et leur absence de non-terminaison. Les premiers et seconds codages satisfont tous les critères, mais les divers bons candidats pour le troisième codage -- inspiré par une implantation distribuée existante -- invalident les deux critères. Alors que notre travail confirme essentiellement le résultat de Palamidesi, notre étude suggère que la combinaison de la compositionnalité forte et de l'absence de non-terminaison est trop forte pour des objectifs plus pratiques, puisque les algorithmes recherchés sont utilisés dans le monde réel en tenant compte et en exploitant les asymétries.

Ce travail a été publié à EXPRESS'97 [8].

L'article de CONCUR'96 sur les codage du choix a été revu et publié comme rapport technique ERCIM; cette version révisée a été envoyée pour publication à un journal. [6].

Substitutions explicites et logique



Participant : Thérèse Hardin


T. Hardin, en collaboration avec G. Dowek (projet COQ), C. Kirchner (projet PROTHEO), travaille sur la définition d'un système d'inférence pour la déduction automatique, fournissant une présentation unifiée des méthodes de résolution du premier ordre, équationnelles et d'ordre supérieur, à l'aide d'un calcul de substitutions explicites.

T. Hardin a également travaillé, en collaboration avec B. Mammass, sur la preuve du protocole BRP (Bounded Retransmission Protocol) en pi-calcul. La preuve de correction de ce protocole avait déjà été faite avec un certain nombre de formalismes. Ils ont comparé ces preuves d'un point de vue méthodologique.

T. Hardin anime,en collaboration avec V. Donzeau-Gouge (CNAM), un groupe de recherches sur l'utilisation des systèmes d'aide à la preuve (Coq, PVS, B) dans la spécification et la programmation. Dans le cadre du LIP6, T. Hardin est coordinatrice du projet FOC, projet de développement d'un environnement pour la programmation et la preuve en Calcul formel avec l'équipe de D. Lazard (LIP6). Elle participe au projet VMAP, centré sur l' étude de la complémentarité entre les approches preuve et vérification.

Vérification mécanique de preuves mathématiques



Participant : Damien Doligez


D. Doligez a entrepris en 97 la construction d'un prototype de vérificateur de preuves du 1er ordre pour arriver à refaire plus simplement la preuve du GC concurrent achevée en 95.

L'originalité de ce système de vérification réside principalement dans le langage de preuve: il s'agit d'éviter un défaut commun à beaucoup de systèmes de preuves qui embrouillent le raisonnement dans une forêt de directives spécifiques au vérificateur. L'objectif de ce système est au contraire de définir un langage de preuves simple et facile à comprendre, mais assez rigoureux pour être vérifié mécaniquement.

Le vérificateur doit bien sûr être capable de deviner les détails qui sont laissés implicites dans une preuve normale (on n'écrit jamais une preuve complète avec tous les détails car ce serait beaucoup trop volumineux). Pour deviner ces détails, le vérificateur doit donc intégrer un démonstrateur. Une direction intéressante de recherche est de mettre au point un système facilement extensible et interfaçable avec des démonstrateurs existants, pour réutiliser leur puissance de raisonnement.

L'objectif à moyen terme est de refaire la preuve menée en 95 dans le système TLP, et de comparer sa facilité d'écriture par rapport à l'ancienne preuve.

Langages de programmation fonctionnels



Participant : Damien Doligez


D. Doligez participe activement à l'effort de maintenance et d'extension du langage Objective Caml (projet CRISTAL). Il travaille au portage sur Macintosh, avec l'écriture d'une nouvelle interface utilisateur.

Il a aussi implémenté deux extensions au glaneur de cellules d'Objective Caml: les pointeurs faibles et le compactage de la mémoire. Les pointeurs faibles (réalisés à la demande des implémenteurs du join-calcul) sont des références que le GC a le droit d'effacer pour récupérer de la mémoire. Ils sont utiles pour implémenter des caches dans certaines situations, notamment pour la transmission de données sur le réseau.

Le compactage de la mémoire permet au GC d'éviter la fragmentation de la mémoire, qui est un défaut majeur de l'algorithme à balayage utilisé dans O'Caml. Le compactage permet donc d'écrire des programmes à longue durée de vie en O'Caml sans voir leur consommation de mémoire augmenter indéfiniment. Quelques exemples de tels programmes sont: le navigateur MMM, le proxy Web V6, et l'araignée ``aspirateur'', écrits par François Rouaix (projet CRISTAL), les processus serveurs qui constituent l'environnement d'exécution réparti du join-calcul, et les "démons" du système Ensemble de Mark Hayden à Cornell (Ensemble est une boîte à outils de communication réseau écrite en O'Caml).

D. Doligez a aussi participé au travail sur la bibliothèque standard de O'Caml: gestion des noms de fichiers, lecture des arguments de la ligne de commande, implémentation simple de structures de données paresseuses; et à l'effort de réflexion sur la syntaxe du langage et le typage des fonctions de la bibliothèque.



previous up next contents Précédent : Logiciels Remonter : Projet PARA, Parallélisme Suivant : Actions industrielles