为什么早期版本的 C 强制要求在开头声明变量?

Why earlier versions of C made it mandatory to declare variables in the beginning?

我浏览了一些 C 的历史,发现在 C 的早期版本中,如 C89 标准,必须在块的开头声明变量。

但我也发现 C99 标准规范有一些放宽,其中变量可以在使用前在任何地方声明。

我的问题是为什么早期版本强制要求它?我的重点是了解当时在设计编译器时是否存在任何技术困难,导致他们无法在任何时候识别声明。

此外,从我理解的编译器设计角度来看,在 C89 中有这样的限制,借助于存储映射的中间文件可以很容易地处理变量声明和使用。但是有没有方法可以在不使用中间文件的情况下处理这种情况,比如一些基于内存的存储?

如果编译器预先看到所有 local/automatic 变量的综合列表,它可以立即计算出移动堆栈指针的总量,为它们保留堆栈内存 - 只需一个操作堆栈指针。如果它处理函数中遇到的零散变量,逐步移动堆栈指针,那么最终会有更多专用于堆栈设置和堆栈指针更新的操作码。重要的是,每当执行进一步的函数调用时,堆栈指针都是最新的。较新的编译器会做一点点额外的工作来修补在考虑了所有函数之后移动堆栈指针的数量。 (我冒昧地说,这种努力是如此之小,以至于早期标准更多的是通过知道预先做什么的概念吸引力而不是更加灵活的努力来塑造的,但是如果你只是想让一些东西起作用 - 为什么要付出额外的努力?)

C99 Rationale 没有直接解释为什么它在 C89 上不被允许,但确实说它是在 C99 中添加的,因为它在其他语言中被允许并且被发现很有用。

Rationale for International Standard — Programming Languages — C

§6.2.4 Storage durations of objects

A new feature of C99: C89 requires all declarations in a block to occur before any statements. On the other hand, many languages similar to C (such as Algol 68 and C++) permit declarations and statements to be mixed in an arbitrary manner. This feature has been found to be useful and has been added to C99.