我最近成为一门大学课程的助教,该课程主要教授 C。该课程以 C90 为标准,主要归功于广泛的编译器支持。对于具有 Java 经验的 C 新手来说,非常令人困惑的概念之一是变量声明和代码不得混合在块(复合语句)中的规则。
这个限制最终在 C99 中被取消了,但我想知道:有人知道它最初为什么存在吗?它是否简化了变量范围分析?它是否允许程序员指定在程序执行的哪些点堆栈应该为新变量增长?
我认为如果语言设计者根本没有任何目的,就不会添加这样的限制。
在 C 语言的最初阶段,可用的内存和 CPU 资源是really稀缺。因此它必须以最小的内存需求快速编译。
因此,C 语言被设计为只需要一个非常简单且编译速度快的编译器。这又导致“单遍编译器 http://en.wikipedia.org/wiki/One-pass_compiler” 概念:编译器读取源文件并尽快将所有内容翻译为汇编代码 - 通常是在读取源文件时。例如:当编译器读取全局变量的定义时,立即发出适当的代码。
直到今天,这个特征在 C 中仍然可见:
- C 要求所有内容的“前向声明”。多遍编译器可以自行前瞻并推断同一文件中函数的变量声明。
- 这反过来又使得
*.h
必要的文件。
- 编译函数时,必须尽快计算堆栈帧的布局 - 否则编译器必须对函数体进行多次传递。
如今,没有哪个严肃的 C 编译器仍然是“单遍”,因为许多重要的优化无法在一次内完成。更多内容可以在以下位置找到:维基百科 http://en.wikipedia.org/wiki/Compiler#One-pass_versus_multi-pass_compilers.
标准体徘徊了相当长的一段时间,以放松函数体的“单通”点。我认为其他事情更重要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)