Projet : COMPOSE

previous up next contents
Précédent : Résultats nouveaux Remonter : Résultats nouveaux Suivant : Langages dédiés et architectures logicielles


Sous-sections


   
Principes, techniques et outils de spécialisation

Mots clés : évaluation partielle, spécialisation, outils, analyses de programmes .

Résumé :

L'étude des aspects fondamentaux du processus de la spécialisation de programmes nous conduit à formaliser certaines de ses phases, telles que des analyses et des transformations de programmes, afin notamment de garantir leur correction. Ce travail nous permet un développement rigoureux de techniques de mise en oeuvre du processus d'adaptation de programmes. Pour compléter notre approche de conception de logiciels adaptatifs, nous développons des outils permettant de spécialiser un logiciel générique en fonction d'un certain contexte d'utilisation. Enfin, pour valider notre approche, il est essentiel d'utiliser nos outils pour traiter des applications industrielles. Ceci nous amène à développer des outils pour des langages de programmation utilisés dans l'industrie tel que C et Java.

Spécialisation de données



Participants : Charles Consel, Renaud Marlet, Sandrine Chirokoff.

De manière générale, la spécialisation repose sur le découpage en deux parties d'un calcul répété dont une partie du contexte d'entrée reste invariante pour toutes les itérations. Une phase préliminaire, qui n'est exécutée qu'une seule fois, effectue les calculs qui ne dépendent que des invariants. Une phase ultérieure effectue les calculs restants de manière répétée en exploitant les résultats de la phase préliminaire.

Dans la spécialisation de programmes, le résultat de la phase préliminaire est le code même de la phase ultérieure, qui incorpore la connaissance des invariants. Il existe une alternative, appelée spécialisation de données, qui consiste à encoder les résultats de la phase préliminaire dans une structure de données (un cache) qui est exploitée par la phase ultérieure. C'est une notion « orthogonale » à celle de spécialisation à la compilation ou à l'exécution.

La spécialisation de données offre un compromis espace/temps très intéressant par rapport à la spécialisation de programmes. En effet, elle génère des programmes compacts (en particulier dans le cas de dépliages de boucles). De plus, la phase préliminaire de spécialisation est très rapide. En revanche, la spécialisation de données est un peu moins performante que la spécialisation de programmes.

Au cours de cette année, nous avons implémenté un prototype de spécialiseur de donnée par extension de Tempo. Ce prototype nous a permis de procéder à une première évaluation de performance sur des programmes de calcul scientifique et des interprètes [[20]]. Nous étudions actuellement l'intégration des deux modes de spécialisation (programmes et données) au sein de Tempo.

   
Approche déclarative à la spécialisation



Participants : Charles Consel, Gilles Muller, Philippe Boinot, Ulrik Pagh Schultz.

L'utilisation directe d'un moteur de spécialisation comme Tempo nécessite la compréhension des concepts de base de l'évaluation partielle. Afin de simplifier l'utilisation d'un spécialiseur, nous avons introduit une approche déclarative à la spécialisation dans le contexte de la programmation orientée objet [VCMC97].

Plus précisément, le programmeur déclare quelles méthodes doivent être spécialisées et pour quels contextes. À partir de ces déclarations, un compilateur détermine comment les versions spécialisées sont produites et gérées. Le résultat de la compilation est une version instrumentée du programme source, capable d'activer la spécialisation lorsque nécessaire, et de gérer les versions spécialisées d'une manière transparente.

Dans notre approche, l'unité de déclaration est la classe de spécialisation. Elle enrichit l'information concernant une classe existante. Le rapport entre les classes normales et les classes de spécialisation est défini par une forme d'héritage reposant sur les classes de prédicats introduites par C. Chambers [Cha93]. Parmi les bénéfices de cette approche, on peut noter : (i) que la déclaration n'est pas intrusive et (ii) qu'il est possible d'exprimer une spécialisation de type incrémental [CPW93] par héritage de classes de spécialisation.


  
Figure 1: Spécialisation de programmes Java
\includegraphics[scale=.5,angle=0]{prototype.eps}

Une implémentation d'un compilateur des classes de spécialisation a été réalisée pour le langage Java (voir module 5.3). Nous avons travaillé à l'intégration de ce compilateur avec Harissa (voir module 5.2) et Tempo (voir module 5.1), afin de développer un spécialiseur pour Java [[27]]. L'approche consiste à traduire en C les fichiers Java produits par le compilateur de classes de spécialisation. Ces fichiers sont ensuite spécialisés par Tempo (voir figure 1). Nous avons appliqué cette approche à une application de filtrage d'images. Lorsque ce programme est spécialisé en fonction d'un filtre donné (ex: filtre à effet de flou), le programme résultant peut être jusqu'à 4 fois plus rapide. Les résultats que nous avons obtenus montrent qu'il est possible d'optimiser des composants objets génériques pour un contexte d'utilisation donné [[27]]. Nos travaux à venir portent sur l'amélioration de la précision des analyses de Tempo afin de traiter plus efficacement certaines constructions rencontrées dans les programmes orientés objets.



previous up next contents
Précédent : Résultats nouveaux Remonter : Résultats nouveaux Suivant : Langages dédiés et architectures logicielles