ОФЧК – це механізм, який дозволяє компілятору виконати функції під час компіляції (compile time). Мова D не містить набору спеціальних механізмів, необхідних для використання цих можливостей. Тому кожен раз, коли функція залежатиме тільки від часу компіляції (компілятор зможе розрахувати вираз відразу на основі відомих значень), компілятор D може інтерпретувати її безпосередньо під час компіляції.
// результат буде вирахований під час
// компіляції. Перевірте машинний код, він
// не міститиме виклику функції!
static val = sqrt(50);
Ключові слова static
, immutable
та enum
інструктують компілятор,
як використовувати ОФЧК, коли існує така можливість. Найкраще у цій
технології те, що не потрібно переписувати функції, щоб використовувати
ОФЧК, адже той самий код може бути чудово розподілений:
int n = doSomeRuntimeStuff();
// така ж функція як вище-зазначена, але
// на цей раз вона викликається класичним
// часом виконання (run-time).
auto val = sqrt(n);
Один з відомих прикладів у мові D, це бібліотека std.regex.
Вона забезпечує тип ctRegex
, який використовує string mixins і ОФЧК
для створення високо-оптимізованих регулярних виразів, які генеруються
під час компіляції. Той самий базовий код повторно використовується
під час виконання run-time версії regex
, що дозволяє компілювати
регулярні вирази, доступні тільки під час run-time.
auto ctr = ctRegex!(`^.*/([^/]+)/?$`);
auto tr = regex(`^.*/([^/]+)/?$`);
// ctr і tr можуть використовуватися поступово
// але команда ctr є більш швидкою!
Не всі властивості мови є доступними під час ОФЧК, але набір можливостей збільшується з кожним новим релізом компілятора D.