"至少一个" C标准翻译限制规范

时间:2016-02-27 19:20:48

标签: c c11 language-specifications

(这个问题是由对this previous question

的回答提示的

C11标准在讨论兼容编译器应该支持的程序的复杂性时,使用以下公式:

  

5.2.4.1翻译限制

     

实施应能够翻译和执行至少一个   包含至少一个实例的程序   以下限制:

     

...

     
      
  • 一个函数调用中的127个参数
  •   
     

...

这"至少一个"短语对我来说似乎很好奇,因为看起来符合标准的程序可以对大多数用法施加任意限制并且仍然符合要求。例如,对可变参数函数具有63参数限制,但对具有显式参数的函数具有127参数限制。或者要求只有名称以" BIGARG _"可以使用超过99个参数调用。或者其他一些限制。

即使有可能的任意限制,也可能存在一些支持127参数限制的奇怪条件,因此至少有一个包含该限制的一个实例的程序可以被翻译和执行。只是不是所有 - 甚至是大多数 - 接近这个限制的程序都会得到支持。

这种特殊的措辞有没有理由?为什么不明确要求支持遵守这些限制的每个程序(否则都是合规的)?或者是否有其他机制需要统一支持,例如,函数调用中的127个参数?

2 个答案:

答案 0 :(得分:4)

是的,实现可以对它可以处理的程序施加任意限制,同时仍然符合标准的字母。但5.2.4.1的目的是满足其特定要求的最简单方法是支持所有程序的合理限制。

您可以创建一个程序,它可以达到5.2.4.1中定义的每个转换限制(例如,不会产生任何输出),然后编写一个识别该单个程序并生成可执行文件的“编译器”相当于int main(void){},同时拒绝所有其他程序的诊断消息,说它超出了实现的翻译限制。

这样的编译器当然是完全无用的,这就是为什么(据我所知)没有人打扰创造这样的东西。 (我已经考虑过自己动手了,只是为了它。)

实际上,编译器编写者希望生成有用的编译器,这些编译器将正确编译真正的C代码。

5.2.4.1的要求的设计是为了满足它们的最简单方法(如果你正在编写一个有用的C编译器)是要尽可能少地施加实际限制。

例如,符合标准的编译器必须支持127个神奇的“一个程序”的嵌套级别的块。满足该要求的最简单方法是通过让编译器使用动态数据结构来支持任意深度的嵌套块。实际上,深度是有限的,不是由编译器源中的硬连线限制,而是由编译时可用的内存量限制。 (或者编译器可以使用一些固定大小的内部数据结构,允许完全 127级别,但允许动态大小可能更容易。)

您可能认为标准更好地施加更“合理”的要求,因此符合标准的编译器必须接受所有程序,这些程序不超过某些指定的限制。问题是这种“合理的”限制很难准确指定。总会有一些程序超出编译器的容量 - 这些程序的大小或复杂程度取决于编译器使用的内部数据结构和算法,以及编译器运行的特定系统的容量上。标准无法涵盖这些细节,或预测未来系统的“合理”限制。

答案 1 :(得分:3)

标准不能要求实现接受所有此类合规程序。考虑几个限制,例如,127个嵌套级别的块和511个带有块范围的标识符。现在假设一个程序在每个级别中具有127级嵌套块 511标识符。在每个标识符中输入63个重要字符,并且您获得了一个强大的程序。在比如PDP-7的16位微机上运行的实现可能无法应对它。