Menu

Оцінка Функції Часу Компіляції (ОФЧК чи CTFE)

ОФЧК – це механізм, який дозволяє компілятору виконати функції під час компіляції (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.

Поглиблення

rdmd playground.d