是否有可能在C中实现无限的编译时间(即没有模板)?

时间:2015-03-29 20:46:07

标签: c compilation

所以,标题。众所周知,编写C ++程序是可能的,这需要无限的时间来编译(理论上)。但是有可能在普通C中编写这样的程序吗?或者有没有办法通过一个小程序将编译时间减慢到至少几分钟?

3 个答案:

答案 0 :(得分:1)

以下是您要求的示例,宏指数增加。

#define FOO  i++  // Substitute any statement here for i++
#define FOO1 FOO ; FOO
#define FOO2 FOO1 ; FOO1
#define FOO3 FOO2 ; FOO2
#define FOO4 FOO3 ; FOO3
#define FOO5 FOO4 ; FOO4
#define FOO6 FOO5 ; FOO5
// Keep going however much you want
...
#define FOO40 FOO39 ; FOO39

volatile int i;

int main(void)
{
    FOO40;  // This expands to 2^40 statements.
}

我使用FOO18进行时序测试,看看会发生什么。我分别测试了预处理器时间和编译时间:

(Preprocessor phase)
time gcc -E foo.c -o foo.i
1.7 seconds

(Compilation phase)
time gcc foo.i -o foo
21 seconds

出于好奇,我不断尝试越来越大的价值观。不幸的是,在某些时候编译器内存不足(预处理器很好)。我收到了这个错误:

  

cc1:在总共403505152字节之后分配16842751个字节的内存不足

FOO16 -O2,我能够在不耗尽内存的情况下获得2:23的编译时间。因此,如果您希望获得更长的编译时间,首先要找出许多可以放入单个函数的语句,而不会耗尽内存(FOO16对我来说)。然后制作几个函数,如:

int main(void)
{
    FOO16;
}

void bar1(void)
{
    FOO16;
}

void bar2(void)
{
    FOO16;
}

// etc...

答案 1 :(得分:1)

实验上,如果您要求最近的GCCClang/LLVM使用optimizations 编译某些包含单个(或极少数)C函数的C代码( s)有数千个语句,编译时间正在增长。

通过经验使用单个函数的gcc -O2进行编译,包含数千个C语句需要与 square <成比例的时间/ em>语句数量(更准确地说是预处理和放大后Gimple语句的数量)。

直觉解释说,寄存器分配,指令调度和中端优化的算法通常比 O(n)更差;天真的非优化C编译器,如tinyccnwcc8cc等,没有这样的时间行为(但生成的代码真的比gcc -O2差...)

顺便说一句,您可以使用我的manydl.c程序(在Linux上)播放(生成一些或多或少的随机C代码,然后编译它并dlopen它,以表明您可以{{1成千上万的共享对象)。阅读它的源代码,它将说明我的观点。

更严重的是,我(过去)在旧版MELT中尝试了同样的问题,它生成了适合GCC扩展的C ++代码。我不得不在几个例程中拆分一些巨大的顺序初始化代码。

您可以使用dlopen编译这么大的函数来更准确地理解编译器花费时间的优化过程。

最后,如果你想要一个小的源代码,可以通过询问gcc -ftime-report -O2来欺骗,但我认为这不算数。

答案 2 :(得分:1)

递归包含

#include __FILE__

大多数编译器可能会提前纾困,但从理论上讲,这会导致无限编译。

包括(或直接编译或链接)设备而不是文件

#include "/dev/tty"

在支持它的系统上,这会导致编译器等待输入。同样,您可以使用命名管道。

在编译器中找到错误

编译器可能存在逻辑错误,导致它永远循环。