函式式语言(functional language)一类程式设计语言,是一种非冯·诺伊曼式的程式设计语言。函式式语言主要成分是原始函式、定义函式和函式型。这种语言具有较强的组织数据结构的能力,可以把某一数据结构(如数组)作为单一值处理;可以把函式作为参数,其结果也可为函式,这种定义的函式称为高阶函式,程式就是函式,程式作用在结构型数据上,产生结构型结果,从根本上改变了冯·诺伊曼式语言的“逐词”工作方式。
基本介绍
- 中文名:函式式语言
- 外文名:functional language
- 学科:计算机科学
- 定义:非冯·诺伊曼式的程式设计语言
- 特点:并行、单元测试等
- 优点:代码管理更加方便
介绍
由于计算机技术的不断发展,函式式程式语言逐渐得到人们的重视。我们现在使用的大多数程式语言大都是以冯诺伊曼式的计算机为设计背景,所以我们称这些计算机程式语言为诺伊曼式语言。1977年,John Backus提出了函式式程式语言,这种语言以非冯诺伊曼式的计算机为设计而背景,所以我们又称这样的函式式程式语言称为非冯诺伊曼式语言。函式式编程,又称泛函编程,是一种编程范型,它将电脑运算视为数学上的函式计算,并且避免状态以及可变数据。函式程式语言最重要的基础是λ演算。而且λ演算的函式可以接受函式当作输入(引数)和输出(传出值)。和命令式编程相比,函式式编程强调函式的计算比指令的运行重要。和程式编程相比,函式式编程裹,函式的计算可随时调用。
Haskell是一种于1980年代末期所发布的函式式程式语言,Haskell函式式程式语言是在Miranda的基础上得到了,它对Miranda进行了标準化,所以这种语言集合了其他相关函式式编程开发的原理,它无需花费太多的赘述就能完成一些数据结构,比如鍊表和矩阵,是当前最广泛地被用于研究的一种函式式程式语言。它的语言衍生物有很多,有扩充Haskell、并行Haskell和面向对象的变体如Mondrian等。与此同时,它还被用作为在新语言设计时的标準模板。
另一种函式式程式语言是Clean,它和Haskell有很多一样的地方。目前这门语言是用C写成的,由尼兹梅根大学负责维护。
还有一种函式式程式语言是Meta Language, MetaLanguage是由爱丁堡大学与上个世纪七十年代末所开发的,它被归类为非纯函式式程式语言,它之所以有这样的归类是因为它允许了副作用和指令式编程的使用。 目前,函式式程式语言还有F#,这是一款针对.NET平台的开放研究的语言。
语言的特点
函式式编程经常使用递归。纯函式式的程式没有变数和副作用(Side effect)。因为纯函式式程式设计语言没有变数,函式没有副作用,编写出的程式可以利用记忆化、公共子表达式消除和并发计算在运行时和编译时得到大量最佳化。我们常见的程式语言有数十种之多。程式语言种类有很多,如果按照程式设计的方法,可分为以下几种程式语言:
(1)结构化程式语言,比如C语言等。
(2)函式式程式语言,比如OCaml, Lisp等。
(3)逻辑式程式语言,比如Prolog等。
(4)面向对象程式语言,比如Java等。
通过比较可以发现,函式式程式语言有以下几个特点:
1、并行。在函式式编程中,程式设计师无需对程式修改,程式就可以并发运行。程式运行期间,不会产生死锁现象。原因是通过函式式编程所得到的程式,在程式中不会出现某一数据被同时修改两次及以上的情况,同样的,两个不同的执行绪就更不用说了。由于函式式编程有这样的优点,导致了程式设计师完全不用花费精力去考虑增加某个执行绪带来的并发问题。
在函式程式语言中,编译器会分析代码,辨认出潜在耗时的创建字元串s1和s2的函式,然后将他们并行的运行。这样的做法,是程式设计师在使用普通的命令式程式语言时不可能做到的。而使用函式式程式语言可以自动的找出那些可以并发执行的函式。
2、单元测试。在函式式编程中,由于程式中的每一个符号都是final后的,所以这样的函式不会产生副作用。这就导致了在某个地方产生修改,同时不会有函式修改过在自身範围之外的变数或者状态被另外的函式所使用。这就导致了函式的返回结果只是返回值。只有函式自身的参数才会影响函式的返回值,所以在编程的时候,对程式中的每个函式而言,程式设计师只需在控制它们的参数,而不用在意函式自己点顺序以及函式外部变数和状态就能正确的编程。与函式式编程相比,命令式编程就没有这样的优势了,在检查函式的返回值的同时程式设计师还必须检查函式是否影响到了函式的外部状态和变数。
3、没有额外作用。副作用是指的是函式内部与外部互动。比如,函式在自身内部可以对函式以外的其他变数进行修改,这样就会产生其他结果。在函式式编程中,想要达到这样的目的就必须让函式自身要保持独立。在函式式程式语言中,所有的功能的结果就是一个返回值,不存在其他的行为,包括对外部变数的修改。
4、不修改状态。在函式式编程中,程式语言在使用中是会不修改变数的,它的一个特性可以使得函式式程式语言区别于其他的程式语言。在其他类型的语言中,变数是用来保存状态的。由于函式式编程不修改变数,导致了这些状态不能存在于变数中。那幺,函式式程式语言保存状态的方法是使用参数来保存,递归方法是最好的例子。由于採用了递归方法,函式式程式语言在运行速度上相对于其他语言较慢,所以,速度不够快是函式式程式语言长期不能广泛使用的主要原因。
5、引用透明。在函式式编程中,引用透明指的是运行函式的时候,函式的没一个步骤都不会不牵连到函式的外部变数或状态,而是只依赖于函式输入的参数,相同的参数输入总会得到相同的函式返回值。而在其他类型的语言中,函式的返回值不仅仅与函式的参数传入有关,也与当前的系统状态有关。在不同的系统状态的情况下,函式的返回值不同。
6、代码部署热。在以前,假如想在Windows上安装更新,安装之后重启计算机是必须进行的步骤,可能还不只一次的重启。即使是仅仅安装了一个小的软体也不能免于重启的步骤。一些特殊的系统,比如电信系统,这样的系统必须保证任何时间都在运行。因为如果在系统更新时紧急拨号失效,就可能造成很大的损失。最理想的情况是在完全不停止系统任何组件的情况下,达到更新相关的代码的目的。这样的想法在命令式编程中是不可能的。对函式式的程式,所有的状态即传递给函式的参数都被保存在了堆叠上,这使的热部署轻而易举。实际上,所有我们需要做的就是对工作中的代码和新版本的代码做一个差异比较,然后部署新代码。其他的工作将由一个语言工具自动完成。
使用意义
函式式程式语言相对于其他程式语言具有以下意义:首先,函式式程式语言的代码十分简单,加快了开发的速度。并且由于在使用函式式程式语言时,程式设计师会大量使用到函式,从而减少了重複的代码,因而程式比较短。其次,函式式程式语言更加接近我们使用的自然语言,程式设计师在学习和使用它的时候更加快捷容易。函式式程式语言的自由度很高,十分接近自然语言写出的代码。另外,函式式程式语言的代码管理更加方便。函式式编程不会对外部产生依赖,也不会修改外界的状态。程式设计师只需把指定的参数给函式,相同的参数其返回的结果必定是相同的。另外,函式式程式语言还支持并发编程,这就使得程式设计师在进行函式式编程时完全不用考虑死锁的问题,因为它根本就不修改变数,所以就不存在锁执行绪的问题。最后,函式式程式语言的代码支持代码热升级。