Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler construction CTFE是如何工作的?_Compiler Construction_D - Fatal编程技术网

Compiler construction CTFE是如何工作的?

Compiler construction CTFE是如何工作的?,compiler-construction,d,Compiler Construction,D,编译时函数评估(CTFE)是如何工作的?我试图理解编译器在运行时如何创建不存在的东西(例如函数)并执行它。我习惯于源代码通过编译变成二进制文件,然后执行二进制文件。那么,当编译器正在运行并且能够运行时,源代码如何成为可执行的东西呢?函数真的被创建并运行了吗,还是只是一个函数调用的模拟?CTFE使用一个内置在编译器中的解释器,这与您对Python等解释语言的期望非常相似。当您编译如下内容时: bool not(bool arg){ 返回!arg; } void main(){ enum compi

编译时函数评估(CTFE)是如何工作的?我试图理解编译器在运行时如何创建不存在的东西(例如函数)并执行它。我习惯于源代码通过编译变成二进制文件,然后执行二进制文件。那么,当编译器正在运行并且能够运行时,源代码如何成为可执行的东西呢?函数真的被创建并运行了吗,还是只是一个函数调用的模拟?

CTFE使用一个内置在编译器中的解释器,这与您对Python等解释语言的期望非常相似。当您编译如下内容时:

bool not(bool arg){
返回!arg;
}
void main(){
enum compileTime=not(true);//在编译时调用not()
bool runTime=not(true);//在运行时调用not()
}

编译器经历了标记化/词法分析/解析等常见阶段。当遇到enum compileTime(或需要编译时值的任何其他构造)时,它将尝试计算表达式右侧的内容。对于常数,它执行您期望的操作并存储常数。如果遇到函数调用,它将启动CTFE解释器。在给定的示例中,它知道参数是什么,函数中的语句是做什么的,它一步一步地执行并解释每个参数。如果它不能在编译时解释语句,它将发出编译时错误。在这个简单的例子中,它只是否定参数,但CTFE能够解释结构、类、循环和更多,这里有文档记录-。

这本质上是一种高级形式,编译器尝试计算使用的值,因此不必在运行时发生(编译时无法发生的操作)(IO、内存分配…)将导致它失败)

CTFE的特殊之处在于它可以显式(例如,通过分配给
enum
),并且它将尝试评估用户定义的函数

实际上,这可以通过编译器中的解释器构建来完成。请注意,所有(或大部分)都是实现细节。任何具有相同最终效果的实现也可以工作。