编译时函数求值(CTFE)是如何工作的?我试图理解编译器是如何在运行时创建一些不存在的东西(例如,一个函数)并执行它的。我习惯于这样的想法,即源代码通过编译成为二进制文件,然后二进制文件被执行。那么,当编译器运行并且能够运行时,源代码是如何成为可执行的东西的呢?一个函数真的被创建并运行了吗,或者它仅仅是一个函数调用的仿真?
发布于 2012-04-22 22:53:06
CTFE使用一个内置到编译器中的解释器--这与您对Python等解释型语言的期望非常相似。当你编译像这样的东西时:
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。
发布于 2012-04-24 01:35:48
这本质上是constant folding的一种高级形式,编译器试图计算使用的值,这样它就不必在运行时发生(不能在编译时发生的操作(IO、内存分配等))将导致它失败)
CTFE的特殊之处在于,它可以被显式(例如,通过赋值给enum ),并且它将尝试计算用户定义的函数。
实际上,这可以通过编译器中内置的解释器来完成
https://stackoverflow.com/questions/10268831
复制相似问题