函数式编程语言(functional language)

  命令式编程语言是以冯诺依曼这种体系结构为模型,而函数式程序语言的目的是尽可能的模拟数学函数。

  函数式语言的核心特征:

 (1)以“函数”为首,如同命令式语言中的“变量”,函数可以赋值给其他变量,可以作为其他函数的参数或者作为其他函数的返回值。

 (2)不修改变量的值

 (3)只有表达式,没有语句。此处的语句指的是没有返回值得某些操作。

 (4)引用透明(Referential transparency),函数的运行不依赖与外部变量或“状态”,简单的说就是,同一个输入(参数),总是会产生同一个输出(返回值),这与数学函数的特征很一致。命令式语言因为全局变量等的存在,就无法做到这一点。

 (5)对比命令式语言,递归形式的循环

函数式编程的优点

   1、适用于并行编程——因为不会修改变量,所以过程中不需要同步互斥;

  2、惰性求值:这个需要编译器的支持。表达式不在它被绑定到变量之后就立即求值,而是在该值被取用的时候求值;

  3、函数确定性:给定同一个参数,肯定是有一个同样的输出

    4、代码更简洁

    ..........

  其他:

  1、命令式语言是依据冯诺依曼结构的,但是函数式语言并没有

     所以说在当前的体系结构上,函数式语言的优势体现的并不明显,还是难以取代命令式语言

  2、纯函数式语言现在很少,大多引入了命令式语言的特性

  3、函数式语言近来被关注的越来越多,也正是因为命令式语言加入了对其的支持

  4、理解函数式语言,最重要的就是理解它的设计尽可能的依照了数学函数的思想

 我们来总结一下上面这些答案。综上所述,函数式编程的优势主要针对两点:

        1. 不可变性(immutability)

        2. 并行操作性(parallelism)

    这两个概念其实与编程范式或编程语言无关。比如,Java也有不可变对象,只是需要通过自己编写实现方法来实现;而并行编程,近日在TechED大会上频频露脸的Visual Studio 2010就以并行编程为一大亮点。对于函数式编程在这两个方面的优势,我们有现成的论据可以引用。先看看这篇Scala语言的简介(这篇文章来自《Scala编程》一书,而这本书的联合作者之一就是Scala创始人)。文中有这样的一句话:“不可变数据结构是函数式语言的一块基石。”而这篇《哪种语言将统治多核时代再看函数式语言特性》一文中,则十分详细的描述了函数式语言天生的并行操作性:“函数式语言已经在简化并行开发中证明了它的作用, 这得益于它既不用共享内存,也不会产生副作用(side effect)的函数。”可以说,函数式编程在这两个方面上的优势是毫无疑问的。

    事实上,这两个优势是同进同退的,因为良好的不可变性的使用才能确保不会成为并行操作时性能的瓶颈。而这个优势的重要性,前面的答案中已经很明显的给出来了:如今的CPU在增高频率上已经遇到了瓶颈,多核CPU成为趋势,因此能够充分发挥多核性能的应用程序将越来越重要。

    技术领域的改变是极快的,因此,“大多数程序员不了解它”或者“没有大范围教授这种语言”都是十分无力的论证(比如说,OO编程并非从一开始就流行)。种种发展趋势都指向了函数式编程,而那些在编程范式上“兼容”的多范式编程(如Scala语言同时支持函数式和命令式的风格,虽然它的使用者很可能最终会倾心于函数式)将必然会流行。

    编者一直在推荐Scala编程语言,因为这个基于JVM的多范式编程语言无论怎么看都有很好的发展前景。如果你有Java开发的经验,那么51CTO的Scala编程语言专题中收集的一系列针对Java程序员的教程文章相信一定会对你有所助益。

    做为程序员,没有理由不去学习任何一门编程相关的技术,更不用说那些很可能会影响到自己未来几年饭碗的技术。编者一直相信对于一位程序员,没有“与我无关的语言”或者“与我无关的编程方法”,因为编程有着共通的哲学。没有哪个优秀的程序员会自称“Java程序员”,“.NET程序员”,“PHP程序员”。他们的唯一称呼就是“程序员”。

 

posted on 2019-02-26 17:07  HarryGreen  阅读(524)  评论(0编辑  收藏  举报