首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CTFE是如何工作的?

CTFE是如何工作的?
EN

Stack Overflow用户
提问于 2012-04-22 22:34:19
回答 2查看 498关注 0票数 8

编译时函数求值(CTFE)是如何工作的?我试图理解编译器是如何在运行时创建一些不存在的东西(例如,一个函数)并执行它的。我习惯于这样的想法,即源代码通过编译成为二进制文件,然后二进制文件被执行。那么,当编译器运行并且能够运行时,源代码是如何成为可执行的东西的呢?一个函数真的被创建并运行了吗,或者它仅仅是一个函数调用的仿真?

EN

回答 2

Stack Overflow用户

发布于 2012-04-22 22:53:06

CTFE使用一个内置到编译器中的解释器--这与您对Python等解释型语言的期望非常相似。当你编译像这样的东西时:

代码语言:javascript
复制
bool not(bool arg) {
    return !arg;
}
void main() {
    enum compileTime = not(true); // not() called at compile time
    bool runTime = not(true);     // not() called at runtime
}

编译器通常会经历标记化/词法分析/解析等阶段。当遇到枚举compileTime (或任何其他需要编译时间值的构造)时,它将尝试计算表达式右侧的内容。在常量的情况下,它做你所期望的事情,并存储常量。如果遇到函数调用,它将启动CTFE解释器。在给定的示例中,它知道参数是什么,函数中的语句做了什么,它一步一步地检查并解释每个参数。如果它不能在编译时解释语句,它将发出编译时错误。在这个简单的示例中,它只是取消了参数,但CTFE能够解释结构、类、循环和更多内容,这里记录了- http://dlang.org/function#interpretation

票数 11
EN

Stack Overflow用户

发布于 2012-04-24 01:35:48

这本质上是constant folding的一种高级形式,编译器试图计算使用的值,这样它就不必在运行时发生(不能在编译时发生的操作(IO、内存分配等))将导致它失败)

CTFE的特殊之处在于,它可以被显式(例如,通过赋值给enum ),并且它将尝试计算用户定义的函数。

实际上,这可以通过编译器中内置的解释器来完成

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10268831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档