OTCC: 探索微型C编译器的极限与便携性

需积分: 0 0 下载量 141 浏览量 更新于2024-11-07 收藏 2KB 7Z 举报
资源摘要信息:"OTCC混淆的微型C编译器" OTCC是一个微型的C编译器,它由作者为了参加2002年的国际混淆C代码竞赛(IOCCC)而编写。编译器的核心目标是自我编译,即编译器自身能够编译自己的源代码,这需要编译器足够小,以至于能从一个足够小的C源代码开始,并最终生成自身。OTCC达到了这一目标,它能够编译一个足够通用的C语言子集,并且能够扩展这个子集直到达到比赛授权的最大大小限制:2048字节的C源代码,这个大小不包括分号、花括号、空格等非代码字符。 在实现上,OTCC选择了生成i386架构的代码,这可能是因为作者对这一架构的熟悉程度较高,也可能是因为i386在当时相对较为普遍。原始的OTCC代码只能在i386架构的Linux环境下运行,因为它依赖于特定的字节序和未对齐的内存访问。编译过程会在内存中生成程序,然后直接启动,这表明OTCC具有高度的自包含性。编译器使用了dlsym()来解析外部符号,这是在动态链接时用于查找函数的地址的一个函数。 作者为了使OTCC更具有便携性,开发了名为OTCCELF的一个变体。OTCCELF与OTCC相比只稍微大一点,但它能够直接从C源代码生成i386架构的ELF可执行文件,而不需要依赖于任何binutils工具,这使得OTCCELF在i386 Linux和Sparc Solaris等平台上都可以使用。 OTCC的实现细节说明了微型编译器的设计考虑,包括: - 代码压缩技巧:通过使用非常精简的代码结构,确保编译器体积尽可能小。 - 自我编译的能力:编译器可以编译自己的源代码,这要求编译器必须足够通用和可扩展。 - 目标平台选择:i386架构的选择可能是基于平台的普及程度和作者的熟悉度。 - 内存中生成和启动程序:这种方式可以避免文件I/O操作,进一步减少代码量。 - 动态链接的使用:通过dlsym()函数来动态查找函数地址,这对于内存中操作至关重要。 - ELF格式的支持:OTCCELF版本支持ELF格式的可执行文件,增加了平台的兼容性。 在描述中,作者还提到了另一个项目TinyCC。TinyCC是一个功能齐全的ISO C99编译器,它起始于OTCC的源代码,并在OTCC的基础上扩展而来。这表明OTCC不仅可以作为一个自我编译的工具,而且其设计思路和代码结构也为后续的编译器开发提供了一定的参考价值。 总结来说,OTCC混淆的微型C编译器代表了一类特殊的软件开发案例,它通过限制自身大小来挑战传统编译器的设计和实现方式,并且成功地以一种非常小的代码体积实现了编译器的核心功能。这一项目不仅体现了对编译器技术深刻的理解,还展示了在代码压缩和优化方面的创新能力。