Why was mixing declarations and code forbidden up until C99?

In the very beginning of C the available memory and CPU resources were really scarce. So it had to compile really fast with minimal memory requirements.

Therefore the C language has been designed to require only a very simple compiler which compiles fast. This in turn lead to “single-pass compiler” concept: The compiler reads the source-file and translates everything into assembler code as soon as possible – usually while reading the source file. For example: When the compiler reads the definition of a global variable the appropriate code is emitted immediately.

This trait is visible in C up until today:

  • C requires “forward declarations” of all and everything. A multi-pass compiler could look forward and deduce the declarations of variables of functions in the same file by itself.
  • This in turn makes the *.h files necessary.
  • When compiling a function, the layout of the stack frame must be computed as soon as possible – otherwise the compiler had to do several passes over the function body.

Nowadays no serious C compiler is still “single pass”, because many important optimizations cannot be done within one pass. A little bit more can be found in Wikipedia.

The standard body lingered for quite some time to relax that “single-pass” point in regard to the function body. I assume, that other things were more important.

Leave a Comment