为何有的语言要声明function关键字,有的却不需要呢?


我看了很多语言源代码,突然发现一个有趣的现象,对于 function 这个关键字,很多语言设计出来了,而很多语言却没有。这是基于一种什么考虑呢?

而且经过我的统计,出现 function 关键字的大多数是脚本语言,比如 php , js 等等,而编译式语言比如 java , c 等等,往往却没有用到这个关键字,这其中有什么内在联系吗?

编程语言 java php JavaScript c

舍命陪基友 10 years, 10 months ago

function 是个标记,表明正在声明的是一个函数,这个关键字和编译型或解释型没什么太大关系,使用这个关键字的大多是 动态类型 语言,对于C/JAVA这一类 静态类型 语言,标明返回值和参数列表就可以明确的区分 函数声明 函数调用 ,因为函数本身和参数都标明了类型,但动态类型的语言没有类型表示,如果不加入一个特定的关键字,从语法上就不太好区分 函数声明 函数调用 ,比如C语言中:
int f(int n) 是一个声明, f(n) 是一个调用,但在JavaScript中,如果你不加 function 这个关键字,你该如何解释 f(n) 到底是什么呢?

cloudST answered 10 years, 10 months ago

很赞的一个问题。

我也看过很多语言源代码,也对不同的语言的语法感兴趣,所以简单的聊聊这个问题。

LISP 属于函数式编程语言,所有的语句都是函数,因此不需要 function 这个关键词。

随后的 Fortran 语言,公式翻译的意思 For mula Tran slation。既然是公式翻译语言,因此 数学公式 f(x) = a + b 在 Fortran 的调用就是 x = a + b

在定义函数的方式上,使用 function:(代码来自google)


 function add(a, b)
implicit none
real::a, b    !声明函数参数类型,这是必需的
real::add     !声明函数返回值类型,这是必需的
add = a + b   !返回值的表达式
return
end

COBOL语言。COBOL 设计的目的和 Fortran 不同,甚至连赋值语句都没有,而且根本就没有函数的概念,取而代之的是 PROCEDURE DIVISION(过程)。

随后就是 Basic: B eginner's A ll-purpose S ymbolic I nstruction C ode。Basic 可谓是集大成者,不仅仅有函数,还有过程。函数使用 function, 过程使用 sub。(抄袭 fortran 和 cobol?)

C语言改变了这种局面,原因是C语言的一个独辟蹊径的设计理念:函数如何调用,就如何声明。也就是说,我们如果这样调用函数


 sum = f(a, b);

那么,我们就这么声明:


 double f(a, b)     /* 旧式语法 */
    double a;
    double b;
{}

double f(double a, double b)  // 新式语法
{}

随后的 C++ Java C# 走的是C的路线。

但是 调用和声明一致 的前提是,函数调用之前需要声明。在 C 语言中,不仅仅是函数,即使数据类型定义也需要声明。

不过在很多动态语言中,大部分数据和函数都不需要提前声明,而且有很多函数只调用一次,那么在函数调用之前声明一次,以后这个函数就再不使用了,这样就会显得繁琐。这时,就需要在语法上将函数定义和函数调用分别出来。

还有一个原因,C是种编译性的语言,他的语法是为了更好的提升编译速度和编译完成后的代码性能,比如早期C和pascal编译器要求的数据和代码分离的原则。

而现在的主要动态编程语言都不再需要编译,更无需预编译。

接二连珊D猫 answered 10 years, 10 months ago

Your Answer