Sous-sections
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 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 tels que C et
Java.
Participants : Charles Consel,
Sandrine Chirokoff, Renaud Marlet.
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 la 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.
Nous avons implémenté un prototype de spécialiseur de
données 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 [11].
Spécialisation du langage Java
Participants : Charles Consel,
Gilles Muller, Jacques Noyé, Ulrik Pagh Schultz.
Le développement d'un nouveau spécialiseur à partir du
néant est une tâche longue et complexe demandant d'importants
moyens de développement. Afin de développer un spécialiseur
pour le langage Java, nous expérimentons une nouvelle
approche reposant sur l'utilisation de Tempo en tant que
moteur de spécialisation commun à plusieurs langages et de
traducteurs spécifiques à chaque langage. Pour pouvoir
traiter efficacement des programmes à objets, cette approche
demande l'enrichissement des analyses de Tempo. En
particulier, nous développons une analyse de temps de liaison
plus précise en ce qui concerne les instances de structures
de données [12].
Nous avons développé un prototype de spécialiseur Java,
nommé JSpec (voir module 5.2), par
intégration d'outils que nous avons antérieurement réalisés
(voir figure 1). Nous avons utilisé
ce spécialiseur Java pour optimiser une application de
filtrage d'images, avec un gain d'un facteur 4 en temps
d'exécution [12], et une mise en oeuvre incrémentale des
points de reprise [22]. Pour cette dernière application, le gain
est proportionnel à la complexité de la structure objet du
programme et au schéma de modification des objets. Sur nos
expériences, nous avons mesuré un gain d'un facteur allant
jusqu'à 15.
Les schémas de conception sont reconnus pour faciliter le
développement de programmes à objets. Cependant, ils
introduisent souvent une certaine inefficacité au sein du
logiciel final. En associant spécialisation de programmes et
schémas de conception, il est possible d'extraire des
informations sur la structure du programme qui permettent de
guider le processus de spécialisation. Plus précisément, nous
avons introduit la notion de schémas de
spécialisation qui permet de capturer la connaissance
sur l'optimisation d'un schéma de conception [27].
La réflexion facilite l'implémentation de composants
génériques. De ce fait, elle est très utilisée dans la
conception de bibliothèques Java. Toutefois, la réflexion
ajoute une couche d'interprétation, ce qui nuit à la
performance. Une solution consiste à utiliser l'évaluation
partielle pour éliminer cette couche d'interprétation. Nous
nous sommes intéressés aux modifications à apporter à un
évaluateur partiel pour Java afin de traiter l'API de
réflexion [20,19]. Ces modifications consistent
essentiellement à prendre en compte les informations de type
dans la division entre données statiques et dynamiques et à
introduire, lors de la spécialisation, une action de
réflexion. Un banc d'essai utilisant le canevas de
sérialisation nous a permis d'illustrer les bénéfices de
l'approche.
Composants et adaptation
Participants : Charles Consel,
Renaud Marlet, Gilles Muller, Philippe Boinot, Anne-FranÇoise
Lemeur.
Une application adaptative doit être apte à modifier son
comportement en fonction de son contexte d'exécution. En
fait, pour un contexte d'exécution donné, l'application doit
choisir un comportement approprié. Actuellement, il n'existe
pas d'approche qui permet de raisonner sur le contexte
d'exécution et d'y associer un comportement. De ce fait, les
mécanismes d'implémentation de l'adaptation sont ad-hoc, ce
qui complexifie le développement et la maintenance de telles
applications.
Nous avons proposé une approche déclarative à la
conception d'applications adaptatives à base de composants.
Cette approche permet au programmeur d'expliciter de manière
indépendante du code des composants les aspects relatifs à
l'adaptation. Nous introduisons la notion de classe
d'adaptation qui enrichit une classe Java avec les
aspects relatifs à l'adaptation. À partir des déclarations,
un compilateur dédié génère un programme Java qui implémente
le comportement adaptatif. Par ailleurs, la consistance des
déclarations d'adaptation peut être vérifiée afin d'offrir
des garanties de sûreté sur le comportement de
l'application [18].
L'utilisation de composants génériques est aujourd'hui une
methode reconnue pour l'ingénierie des systèmes complexes.
Toutefois, trop de généricité peut engendrer des problèmes
tels que la taille des programmes résultants, dans le cadre
des systèmes embarqués. Nous proposons d'utiliser
l'évaluation partielle pour adapter automatiquement et
systématiquement des composants génériques. Notre approche
repose sur un langage déclaratif qui permet au développeur
d'un composant de décrire les opportunités de généricité et
de configuration. À partir de ces informations, il est
possible de générer des composants spécialisés pour un
contexte donné, tout en effectuant des vérifications sur la
validité du contexte [23].