我最近成为大学课程的助教,主要教授C. C90课程标准化,主要是由于广泛的编译器支持.具有以前Java经验的C新手的一个非常令人困惑的概念是变量声明和代码可能不在块内混合的规则(复合语句).
最终用C99解除了这个限制,但我想知道:有人知道它为什么会出现在那里吗?它是否简化了可变范围分析?它是否允许程序员指定堆栈应该为新变量增加哪些程序执行点?
我认为语言设计师如果完全没有任何目的就不会增加这样的限制.
A.H*_*.H. 52
在C的最开始,可用内存和CPU资源非常稀少.所以它必须以最小的内存要求快速编译.
因此,C语言被设计为只需要一个非常简单的编译器,它可以快速编译.这反过来导致" 单程编译器 "的概念:编译器将读取源文件,并尽快转化到一切汇编代码-通常在读取源文件.例如:当编译器读取全局变量的定义时,会立即发出相应的代码.
直到今天,这个特征在C中可见:
*.h
文件成为必要.现在没有严肃的C编译器仍然是"单程",因为许多重要的优化不能在一次传递中完成.在维基百科中可以找到更多.
标准身体徘徊了相当长的一段时间,以放松关于功能体的"单程"点.我认为,其他事情更重要.
就是这样,因为它总是以这种方式完成,它使编写编译器变得更容易,并且没有人真正想过以任何其他方式进行编写.随着时间的推移,人们意识到让语言用户而不是编译器编写者更容易让生活变得更加重要.
我认为语言设计师如果完全没有任何目的就不会增加这样的限制.
不要以为语言设计者开始限制语言.像这样的限制通常是出于机会和环境.
我想非优化编译器以这种方式生成高效代码应该更容易:
int a;
int b;
int c;
...
Run Code Online (Sandbox Code Playgroud)
虽然声明了 3 个独立的变量,但堆栈指针可以一次递增,无需优化策略,例如重新排序等。
将此与:
int a;
foo();
int b;
bar();
int c;
Run Code Online (Sandbox Code Playgroud)
只增加一次堆栈指针,这需要一种优化,虽然不是非常高级的优化。
此外,作为一个文体问题,第一种方法通过能够在一个地方看到所有局部变量并最终将它们作为一个整体一起检查来鼓励更规范的编码方式(难怪 Pascal 也强制执行此操作)。这在代码和数据之间提供了更清晰的分离。
归档时间: |
|
查看次数: |
4383 次 |
最近记录: |