Les logiciels sont généralement développés en prenant en compte deux objectifs importants mais contradictoires : généralité et performance. Nos travaux sur ce thème visent à réconcilier ces deux impératifs. L'idée de base consiste à rendre performant un programme général en l'adaptant à un contexte donné d'utilisation par transformations de programmes. Ce processus d'adaptation repose sur l'évaluation partielle qui a pour but de spécialiser un programme en fonction d'invariants. Ces invariants peuvent être divers : taille du problème, propriétés sur les valeurs d'entrée, configuration du matériel, ... Un programme ainsi spécialisé est optimisé dans la mesure où tous les calculs dépendant des invariants sont effectués. L'évaluation partielle a été utilisée pour des applications très variées telles que la génération de compilateurs à partir d'interprètes, l'optimisation de programmes numériques, les bases de données et le graphisme. Puisque les invariants utilisés pour la spécialisation d'un programme peuvent être disponibles à la compilation ou à l'exécution, nous développons des stratégies de spécialisation qui peuvent optimiser des programmes à ces deux stades.
Traditionnellement, l'évaluation partielle est une transformation effectuée sur le texte d'un programme. De fait, elle intervient à la compilation et exploite les invariants disponibles à ce stade. Dans ce domaine, notre recherche vise à développer des principes et des techniques de spécialisation pouvant s'appliquer à des langages aussi bien applicatifs qu'impératifs.
Un nouvel axe de nos activités sur ce thème a pour objectif de rendre possible la spécialisation de programmes à l'exécution. Cette nouvelle forme de spécialisation permet d'exploiter des invariants qui ne sont pas disponibles avant l'exécution. Elle ouvre ainsi de nouvelles perspectives d'application.
Les résultats de nos travaux sont mis en oeuvre dans deux systèmes d'évaluation partielle : Schism pour des programmes Scheme purs et Tempo pour des programmes C.