为何有的语言要声明function关键字,有的却不需要呢?
我看了很多语言源代码,突然发现一个有趣的现象,对于
function
这个关键字,很多语言设计出来了,而很多语言却没有。这是基于一种什么考虑呢?
而且经过我的统计,出现
function
关键字的大多数是脚本语言,比如
php
,
js
等等,而编译式语言比如
java
,
c
等等,往往却没有用到这个关键字,这其中有什么内在联系吗?
Answers
function
是个标记,表明正在声明的是一个函数,这个关键字和编译型或解释型没什么太大关系,使用这个关键字的大多是
动态类型
语言,对于C/JAVA这一类
静态类型
语言,标明返回值和参数列表就可以明确的区分
函数声明
和
函数调用
,因为函数本身和参数都标明了类型,但动态类型的语言没有类型表示,如果不加入一个特定的关键字,从语法上就不太好区分
函数声明
和
函数调用
,比如C语言中:
int f(int n)
是一个声明,
f(n)
是一个调用,但在JavaScript中,如果你不加
function
这个关键字,你该如何解释
f(n)
到底是什么呢?
很赞的一个问题。
我也看过很多语言源代码,也对不同的语言的语法感兴趣,所以简单的聊聊这个问题。
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编译器要求的数据和代码分离的原则。
而现在的主要动态编程语言都不再需要编译,更无需预编译。