2016-11-30 176 views
0

在阅读一本关于机器指令和程序的书时,我遇到了一个特殊的问题,那就是汇编程序扫描整个源程序两次。它在第一遍/扫描期间构建一个符号表,并在第二次扫描期间将整个程序与它关联起来。汇编程序需要以类似的方式为函数提供地址。
现在,由于汇编程序通过了两次程序,为什么需要在可以使用之前声明一个函数呢?汇编程序不会从第1遍提供函数的地址,然后在第2遍期间将其与程序关联? 我正在考虑在这种情况下的C编程。程序的汇编和执行 - 两遍汇编程序

+2

在什么汇编程序之前,你需要声明一个函数才可以使用? –

+4

C编译器不是汇编器。 C语言的规则与装配工的工作无关。 –

+0

我的意思是说,要被“组装”的编译程序需要对程序包含的每个函数,变量等进行适当的定义。如果汇编程序必须通过程序两次,那么不需要宣布功能是不必要的? –

回答

1

简单的答案是,C程序要求函数在可以使用之前被声明,因为C语言被设计为一次编译器处理。它与汇编器和函数的地址没有任何关系。在使用它之前,编译器需要知道符号的类型,无论是函数,变量还是别的东西。

考虑一个简单的例子:

int foo() { return bar(); } 
int (*bar)(); 

为了生成正确的代码编译器需要知道bar不是一个函数,而是指向函数的指针。该代码仅适用于在foo的定义之前放置extern int (*bar)();,以便编译器知道bar是什么类型。

虽然语言理论上可以设计为要求编译器使用两遍,但这需要语言设计上的一些重大改变。要求两次通过也会增加编译器所需的复杂性,减少可以托管C编译器的平台数量。在C开始开发时,这是非常重要的考虑因素,当64K(65,536)字节的RAM是大量内存时。即使在今天,对大型程序的编译时间也会有明显的影响。

请注意,通过支持隐式函数声明,C语言确实允许你想要什么。 (在我上面的示例中,foo中的bar之前没有声明过)。但是,此功能已过时,受到限制并被认为是危险的。