为什么早期版本的C必须在开头声明变量?

时间:2015-03-27 03:17:20

标签: c++ c compiler-construction

我已经经历了C的一些历史,我发现在早期版本的C中,就像在C89标准中一样,必须在块的开头声明变量。

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

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

另外,根据我理解的编译器设计透视图,在C89中有这样的限制,在中间文件的帮助下很容易处理变量声明和用法来存储映射。但有没有使用中间文件处理案例的方法,比如一些基于内存的存储?

2 个答案:

答案 0 :(得分:19)

如果编译器预先看到所有本地/自动变量的合并列表,它可以立即计算出将堆栈指针移动到它们的预留堆栈内存的总量 - 只需对堆栈指针执行一次操作。如果它在函数中遇到它们处理变量和drabs中的变量,逐步移动堆栈指针,那么最终会有更多专用于堆栈设置和堆栈指针更新的操作码。每当执行进一步的函数调用时,堆栈指针都是最新的非常重要。较新的编译器会做一些额外的工作来修补在考虑所有函数之后移动堆栈指针的数量。 (我觉得这个努力是如此之小,以至于早期标准的形成更多的是因为知道前面做什么而不是更灵活的努力的概念吸引力,但如果你只是想让事情变得有效 - 为什么要做出额外的努力?)

答案 1 :(得分:13)

C99原理并没有直接解释为什么它没有被C89所允许,但确实说它是在C99中添加的,因为它被其他语言所允许并且它被认为是有用的。

  

Rationale for International Standard — Programming Languages — C

     

§6.2.4对象的存储持续时间

     

C99的一个新功能:C89要求块中的所有声明都要在任何语句之前发生。另一方面,许多类似于C的语言(例如Algol 68和C ++)允许以任意方式混合声明和语句。已发现此功能很有用,并已添加到C99。