CTFE - это механизм, позволяющий компилятору исполнять функции во время компиляции. Для использования этой возможности не требуется ограниченное подмножество языка D: любую функцию, зависящую только от значений, известных во время компиляции, компилятор может решить исполнить во время компиляции.
// результат будет вычислен во время компиляции.
// Проверьте машинный код, вызова функции там
// не будет!
static val = sqrt(50);
Ключевые слова вроде static
, immutable
, enum
указывают компилятору использовать CTFE там, где
это возможно.
Отличительной чертой данной техники является то,
что функции не нужно переписывать каким-либо особым образом
для её использования, один и тот же код используется
и во время компиляции, и во время исполнения:
int n = doSomeRuntimeStuff();
// та же функция, что и выше,
// но в этот раз она будет вызвана классически,
// во время исполнения.
auto val = sqrt(n);
Ярким примером использования данной техники в D является
библиотека std.regex.
Она предоставляет тип ctRegex
, использующий строковые mixin'ы
и CTFE для генерации во время компиляции высоко оптимизированного автомата
обработки регулярных выражений. Та же кодовая база используется
и версией времени исполнения regex
, позволяющей работать
с регулярными выражениями, доступными только во время исполнения.
auto ctr = ctRegex!(`^.*/([^/]+)/?$`);
auto tr = regex(`^.*/([^/]+)/?$`);
// ctr и tr взаимозаменяемы,
// но ctr работает быстрее!
Не все возможности языка доступны во время CTFE, но поддерживаемый набор увеличивается с каждой версией компилятора.