Je suis intéressé par l'évaluation (partielle) à temps de compilation pour c/C++ (pas avec les paramètres de template comme en C++). Lets considérons le cas suivant (tiré de [1]):Évaluation partielle/spécialisation avec LLVM-gcc ou gcc
double mypower(double x, int n) {
int i;
double ret = x;
for (i = 1; i < n; i++) {
ret *= x;
}
return ret;
}
Ensuite, vous appelez cette fonction quelque part dans le code avec:
mypower(x,3); // y varies all the time,
le compilateur peut optimiser ce (par exemple la boucle déroulage). Certaines fonctions que j'utilise souvent pourraient vraiment bénéficier de cette optimisation (testée manuellement par la fonction spécialisée de création). La présentation [1] décrit un processus dans lequel la fonction est recherchée et est remplacée par une version spécialisée de la fonction. Cela semble fonctionner. Mais il ne semble pas être très universel, le code doit être écrit pour les fonctions qui devraient être remplacées.
La présentation semble être à partir de 2008, je ne pouvais pas trouver quelque chose de plus substantiel que dans cette source. Alors, est-ce que quelque chose s'est amélioré depuis? Je préférerais une sorte d'automatisme, qui fait de même pour toutes les fonctions éventuellement contrôlées par la syntaxe d'attribut (par exemple __attribute__(peval)
...). En outre, je voudrais que la même chose fonctionne pour le code orienté objet, en créant des classes spécialisées pour différents objets ([2] semble suggérer que ce n'est pas possible).
En outre, je voudrais que cette spécialisation ne fonctionne pas seulement pour les constantes trouvées dans le code. Je pense à un programme compilé à LLVM IR (bytecode) peut effectuer les opérations suivantes:
L'exécution du Programme au cours d'une phase d'initialisation dans un interprète, au cours de cette phase d'initialisation du programme pourrait lire une configuration à partir d'un fichier. Après l'initialisation, l'interpréteur est arrêté.
Certaines variables (y compris les variables membres) sont fixées à partir de ce point. Extrayez ces variables (par exemple, marquées par un attribut lors de la compilation).
Créez des fonctions et des classes spécialisées. Cloner ceux-ci dans le bytecode. Exécutez le JIT pour créer le code machine natif.
Ceci est beaucoup que je demande et seulement quelques programmes intensifs de calcul bénéficieraient d'une telle optimisation. Mais certaines personnes doivent travailler là-dessus. Je ne connais probablement pas les bons termes de recherche pour alimenter google.
Note: Veuillez ne pas suggérer des classes de template avec des paramètres non-typés ou une spécialisation manuelle, je le fais déjà. Je préférerais que le compilateur fasse le travail pour moi.
Liens:
[1] Presentation how to partial evaluate in LLVM
[2] Forum message about partial evaluation
Un peu en rapport: http://stackoverflow.com/questions/2940367/what-is-more-efficient-using-pow-to-square-or-just-multiply-it-with-itself/2940800#2940800 –