编译时计算迭代的可能性

Possibility of Iteration For Compile-Time Computations

在我的理解中,编译时计算是编译器可以计算的任何内容,而不是在程序执行期间计算的那部分以提高性能。程序执行时可以进行迭代计算,但在编译时计算期间不允许迭代计算。一个麻烦且具体的例子是 Variadic Templates,人们自然而然地想到迭代来处理提供的各种类型,但标准和编译器强制程序员递归地处理它们。

一般来说,所有编译时计算都是通过递归而不是迭代来处理的。据我所知,预期在编译时计算的 constexpr 函数也应该是递归的。是什么让编译时的任何东西都禁止迭代?

当我在 Hammer 中实现消除常量子表达式作为优化时,问题原来是递归基本上已经在代码生成期间发生了。你真的不需要定义变量,因为它们只是被常量替换。

另一方面,如果您尝试 运行 一个循环,您不仅需要代码不仅要在 运行 时间对常量执行操作,而且是一个full-blown 您的语言的翻译。你需要能够声明变量,设置和接收它们的值(作为循环计数器),更糟糕的是,你需要检测无限循环,这样你的编译器就不会挂起(我的意思是,while(true); 是一个完美的常量表达式).

所以简而言之,由于解析器、AST 和优化器的性质,在编译时递归评估部分比实现完全控制流和实现循环和变量操作更容易。