IOCCC 早期的另一颗明珠是Larry Wall 1986 年的条目:
http://www.ioccc.org/years.html#1986(墙)
我怀疑今天没有 C 编译器可以直接直接编译该源代码,因为它包含严重的预处理器滥用:
- 最新
TDM-GCC 9.2.0
设置为 ANSI 模式失败 - 最后
TCC 0.9.27
失败
然而,在从混淆的原始代码(总是使用 GCC's cpp -traditional
)中提取预处理代码之后,TCC 和 GCC 都设法编译它;然而,GCC 的努力白费了,因为程序在尝试开始解码其混淆的介绍文本时阻塞(对于那些想要深入研究的人来说,这里不会破坏它!)
另一方面,TCC 设法对 的隐式声明进行简要警告system()
,read()
并write()
快速生成一个工作程序。
我尝试使用 GDB 逐步执行 GCC 代码,这就是我发现编译的 GCC 代码在for
遍历文本字符串以对其进行解码的循环的第二遍时阻塞的方式:
[Inferior 1 (process 9460) exited with code 030000000005]
该进程 ID 无关紧要,因为它代表崩溃的调试构建可执行文件。但是,退出代码保持不变。
显然,TCC 比 GCC 更适合此类 IOCCC 条目。后者仍然能够成功编译甚至运行一些条目,但是对于像这样的棘手案例,TCC 很难被击败。它唯一的缺点是在预处理像这个例子这样极度滥用的代码时它不够用。它在某些预处理条目之间留下空格,因此无法将它们连接到作者预期的 C 关键字中,而 GCC 的cpp
作品 100%。
我的问题是,听起来很哲学,甚至是修辞:
与 TCC 不同,现代 GCC 中是什么导致它无法编译或在编译早期的 C 程序时产生不可用的代码?
提前感谢所有反馈,我很感激!
注意:我使用的是带有 WSL 2 的 Windows 10 版本 2004;GCC 在 Windows 和 WSL 2 环境中都失败了。我也计划在 WSL 2 中编译 TCC,以便在该环境中进行比较。
PS:当它最终按预期执行时,我非常喜欢这个程序。毫无疑问,当之无愧当年的“最全能大奖”!