Estoy interesado en la evaluación (parcial) en tiempo de compilación para c/C++ (no con parámetros de plantilla como en C++). Vamos a considerar el caso siguiente (tomado de [1]):Evaluación parcial/especialización con LLVM-gcc o gcc
double mypower(double x, int n) {
int i;
double ret = x;
for (i = 1; i < n; i++) {
ret *= x;
}
return ret;
}
Luego llama a esta función en alguna parte del código con:
mypower(x,3); // y varies all the time,
A continuación, el compilador puede optimizar este (por ejemplo desenrollado del bucle). Algunas de las funciones de uso frecuente que utilizo podrían beneficiarse realmente de esa optimización (probada manualmente por la función especializada creadora). La presentación [1] describe un proceso en el que se busca la función y se reemplaza por una versión especializada de la función. Esto parece funcionar Pero no parece ser muy universal, el código debe escribirse para las funciones que deben reemplazarse.
La presentación parece ser de 2008, no pude encontrar nada sustancial más información que en esta fuente. Entonces, ¿ha mejorado algo desde entonces? Preferiría algún tipo de automatismo, que hace lo mismo para todas las funciones posiblemente controladas por sintaxis de atributo (por ejemplo, __attribute__(peval)
...). Además, me gustaría que lo mismo funcione para código orientado a objetos, creando clases especializadas para diferentes objetos ([2] parece sugerir que esto no es posible).
Además, me gustaría que esta especialización no solo funcione para las constantes que se encuentran en el código. Estoy pensando en un programa compilado a LLVM IR (código de bytes) podría hacer lo siguiente:
Ejecución de la Programm durante una fase de inicialización de un intérprete, durante esa fase de inicialización del programa podría leer algunos de configuración desde un archivo. Después de la inicialización, el intérprete se detiene.
Algunas variables (incluidas las variables miembro) se corrigen a partir de ese momento. Extraiga estas variables (por ejemplo, marcado por atributo durante la compilación).
Crea funciones y clases especializadas. Clonar estos en el bytecode.
Ejecute el JIT para crear código de máquina nativo.
Esto es mucho lo que pido y pocos programas intensivos en computación se beneficiarían de tal optimización. Pero algunas personas deben estar trabajando en eso. Probablemente no conozco los términos de búsqueda correctos para alimentar a google.
Nota: No sugiero clases de plantilla con parámetros sin tipo o especialización manual, ya lo hago. Solo preferiría que el compilador hiciera el trabajo por mí.
Enlaces:
[1] Presentation how to partial evaluate in LLVM
[2] Forum message about partial evaluation
Algo relacionado: http://stackoverflow.com/questions/2940367/what-is-more-efficient-using-pow-to-square-or-just-multiply-it-with-itself/2940800#2940800 –