temps d’exécution de la méthode virtuelle elle-même estsuffisamment important. Malheureusement, dans le cas desoptions habituellement supportées par des classes de ma-trices, ce temps d’exécution est extrêmement faible.
2.2 Les bibliothèques actives
On pourrait croire que des phases d’optimisations inten-sives ou l’utilisation de techniques de programmationgénérique classiques telles que celles mises en œuvredans les bibliothèques VIGRA[15] ou ITK peuventéliminer ces problèmes. En général, il n’en est rien carles compilateurs n’ont pas accès à la sémantique desabstractions mises en œuvres. Là où un développeur voitun ensemble d’opérations sur des tableaux numériques,le compilateur ne voit que des boucles et des allocationsmémoires. L’utilisation des
templates
de manière naïveélimine certes les surcoûts dus aux appels de méthodes ouau polymorphisme dynamique mais ne permet pas – dumoins dans le type de solution classiquement proposé –d’effectuer des optimisations inter-appels.Une approche plus efficace est de développer des biblio-thèques qui proposent à la fois un niveau d’abstractionélevé et un mécanisme d’optimisation adapté utilisant nonplus seulement une programmation générique à base de
templates
mais bien une
programmation générative
ca-pable de générer un code optimisé en fonction d’un en-semble de spécifications statiques. Ce concept de «biblio-thèque active» [24] met en œuvre une phase d’optimisationhaut-niveau dépendant du modèle de programmation, lais-sant le compilateur effectuer les optimisations bas-niveauusuelles (allocation des registres et ordonnancement desinstructions par exemple). Pour réaliser de telles librairies,plusieurs systèmes de méta-définition ont été proposés.Parmi ceux ci, on peut citer des projets comme Xroma [4],MPC++ [13], Open C++ [3] ou Magik [5]. Ces systèmespermettent d’injecter au sein d’un compilateur C++ desextensions qui permettent de fournir à ce dernier les in-dications sémantiques nécessaires à une compilation effi-cace. L’utilisation de ces outils reste néanmoins difficile etcontraint les développeurs à maitriser des outils annexespotentiellement complexes. Il est donc nécessaire de cher-cher une alternative intégrable directement au sein du lan-gage C++ sans nécessiter d’outils externes.
2.3 Les
Expression Templates
L’idée maîtresse de NT2 repose sur l’utilisation d’unidiome appelé
Expression Templates
[22] qui consisteà déterminer quels aspects d’une expression mathéma-tique peuvent être évalués lors de la compilation. Cettetechnique se base sur les propriétés intrinsèques des
templates
C++ qui se comportent comme un langageTuring-complet [21, 23].Considéronsparexempleuneexpressionmettantenjeudesopérateurs manipulant une classe de tableaux numériques :
r
=
a
+
b
+
c
Cette expression s’évalue en trois passes : évaluation de
a
+
b
, de la somme de ce résultat intermédiaire avec
c
etfinalement recopie du résultat final dans
r
.
∀
i
,
t
1
[
i
] =
a
[
i
]+
b
[
i
]
∀
i
,
t
2
[
i
] =
t
1
[
i
]+
c
[
i
]
∀
i
,
r
[
i
] =
t
2
[
i
]
Lebutestalorsdeserameneràuneévaluation
enuneseulepasse
:
∀
i
,
r
[
i
] =
a
[
i
]+
b
[
i
]+
c
[
i
]
Pour cela, il faut s’intéresser à la
structure
de l’expres-sion à droite de l’affectation. La structure de l’arbre desyntaxe abstraite associé à cette expression est clairementfixée au moment de l’écriture de cette expression, alors quele contenu des tableaux n’est connu qu’à l’exécution. Cettedichotomie montre que, dans l’évaluation d’une telle ex-pression, la composition des opérateurs est une donnée
sta-tique
et que les données contenues dans les tableaux sont
dynamiques
. L’application d’un évaluateur partiel à une ex-pression comprenant
M
opérandes et
N
opérateurs revient àcréer lors de la compilation une fonction
ϕ
à
M
argumentseffectuant l’application des
N
opérateurs de l’expressioninitiale sur une unique valeur scalaire. A l’exécution, seulel’application de cette fonction composite aux données ini-tiales sera évaluée. Ici, nous obtenons :
ϕ
(
x
,
y
,
z
) =
x
+
y
+
z
∀
i
,
r
[
i
] =
ϕ
(
a
[
i
]
,
b
[
i
]
,
c
[
i
])
L’idée est donc de définir un certain nombre de classespermettant de représenter
au sein du langage
la structuremême de l’arbre de syntaxe abstraite afin de pouvoir«construire»
ϕ
au moment de la compilation. Pour cela,nous définissons plusieurs classes
templates
qui vont nouspermettre de représenter respectivement la structure del’arbre, ses éléments terminaux et les opérations effectuéesà la traversée des nœuds de l’arbre. L’ensemble de cesclasses va alors évaluer partiellement l’expression à lacompilation et générer un code résiduel correspondantà la suite d’opérations strictement nécessaires pour uneévaluation dynamique optimisée [22, 8].
2.4 Gestion statique du polymorphisme
En ce qui concerne la gestion des comportements op-tionnels, une solution consiste à utiliser une version
tem- plate
du patron de conception
Strategy
[10]. Ce patrondéfinit une famille d’algorithmes encapsulés et interchan-geables.
Strategy
permet de modifier l’algorithme sans tou-cher au code qui l’utilise et réciproquement. Dans notrecas, cette famille d’algorithmes est implantée comme unesérie de structures
templates
[1, 2] exposant une ou plu-sieurs méthodes de classe qui seront utilisées au sein même