在浏览一本关于机器说明和程序的书时,我遇到了一个特定的观点,该点说,汇编器两次扫描整个源程序。它在第一次通过/扫描期间构建了一个符号表,并将整个程序与第二次扫描相关联。汇编器需要以类似方式提供一个函数的地址。
现在,由于汇编器两次通过了程序,为什么有必要在使用函数之前声明函数?汇编程序是否是否从第一张通行证中提供了该功能的地址,然后在第二次通过期间将其与程序相关联?在这种情况下,我正在考虑C编程。
简单的答案是,C程序要求在使用函数之前先声明功能,因为C语言是由编译器在单个通行证中设计的。汇编器和功能地址无关。编译器需要知道符号的类型,无论是函数,可变还是其他东西,才能使用它。
考虑这个简单的示例:
int foo() { return bar(); }
int (*bar)();
为了生成正确的代码,编译器需要知道bar
不是函数,而是指向函数的指针。该代码仅在将extern int (*bar)();
放置在foo
的定义之前,因此编译器知道哪种类型bar
是。
虽然该语言本来可以设计用于要求编译器使用两次通行证,但这将需要对语言的设计进行一些重大变化。需要两次通过还会增加编译器所需的复杂性,从而减少可以托管C编译器的平台数量。这是第一次开发C的那一天,这是非常重要的考虑因素,当64K(65,536)字节的RAM是很多记忆时,这是很重要的。即使在今天,也会对大型计划的编译时代产生明显的影响。
请注意,C语言确实可以通过支持隐式函数声明来允许您无论如何。(在上面的我的示例中,当bar
先前未声明时,在foo
中发生了什么。)但是,此功能是过时的,有限的,并且被认为是危险的。