为什么有些语言需要在调用之前在代码中声明函数?

时间:2010-01-28 05:49:35

标签: programming-languages scope comparison lexer language-comparisons

假设你有这个伪代码

do_something();

function do_something(){
   print "I am saying hello.";
}

为什么有些编程语言需要调用do_something()才能显示在函数声明下面才能运行代码?

2 个答案:

答案 0 :(得分:7)

编程语言使用符号表来保存源代码中使用的各种类,函数等。有些语言在一次通过中编译,一旦使用它们,符号就会从符号表中拉出。其他人使用两遍,第一遍用于填充表格,然后第二遍用于查找条目。

答案 1 :(得分:2)

大多数使用静态类型系统的语言在使用前需要定义,这意味着在调用之前必须有某种函数声明,以便可以检查调用(例如,是获取正确数量和类型参数的函数。这种设计有助于人和编译器阅读程序:您看到的所有内容都已定义。阅读的简易性和一次通过编译器的普及可以解释这种设计规则的普及。

不幸的是使用前的定义在相互递归方面表现不佳,因此语言设计师采用了丑陋的黑客攻击

  1. 声明(有时称为Pascal中关键字的“前向声明”)
  2. 使用
  3. 定义
  4. 您在C中的类型级别以“不完整的struct声明的形式看到相同的现象。”

    1990年左右,一些语言设计师发现,没有抽象语法树的单通道编译器应该成为过去,而那个时代的两个非常好的设计 - Modula-3Haskell在使用之前摆脱定义:在这些语言中,任何定义的函数或变量在整个范围内都是可见的,包括在定义之前的文本部分。换句话说,相互递归是两种类型和函数的默认值。对他们说好,我说 - 这些语言没有丑陋和不必要的前瞻声明。

      

    为什么[在使用前有定义]?

    • 1975年轻松编写单程编译器。

    • 在使用前没有定义,你必须更加思考相互递归,尤其是相互递归的类型定义。

    • 有些人认为这样可以让人们更容易阅读代码。