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


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

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

编程语言 java php JavaScript c

舍命陪基友 10 years, 4 months ago

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

cloudST answered 10 years, 4 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, 4 months ago

Your Answer