La evaluación de funciones en tiempo de compilación (CTFE, Compile Time Function Evaluation, en inglés) es un mecanismo que permite al compilador ejecutar funciones en tiempo de compilación. No existe un conjunto especial de características del lenguaje D necesarias para usar esta característica, simplemente cuando una función depende exclusivamente de valores conocidos en tiempo de compilación, el compilador de D puede decidir interpretarla durante la compilación.
// El resultado se calcula en tiempo de compilación.
// Si se mira el código máquina generado, este no
// contiene ninguna llamada a función.
static val = sqrt(50);
Palabras reservadas como static
, immutable
o enum
indican al compilador
que use CTFE cuando sea posible. Lo bueno de esta técnica es que no se
necesita reescribir las funciones para ser usada, además de que este código
se puede compartir sin ningún problema:
int n = doSomeRuntimeStuff();
// La misma función que antes, sólo que esta vez se
// llama de la forma clásica: en tiempo de ejecución.
auto val = sqrt(n);
Un prominente ejemplo en D de esta técnica es la librería std.regex.
Esta librería proporciona el tipo ctRegex
, que usa mixins de cadenas de
caracteres (visto en la sección anterior) y CTFE para generar autómatas que
analicen expresiones regulares altamente optimizados. La misma base de código
se usa para la versión de regex
que permite compilar expresiones regulares
que sólo están disponibles en tiempo de ejecución.
auto ctr = ctRegex!(`^.*/([^/]+)/?$`);
auto tr = regex(`^.*/([^/]+)/?$`);
// 'ctr' y 'tr' se pueden intercambiar,
// pero 'ctr' es más rápida.
No todas las características del lenguaje están disponibles para CTFE, pero el soporte de esta característica por parte del lenguaje se incrementa con cada nueva versión del compilador.