中国领先的IT技术网站
|
|

为什么大家都觉得函数式编程将会流行?

函数式编程真的会流行么?有不少开发者,尤其是Web应用开发人员对于函数式编程对他们而言的价值一直心有存疑,而本文将解答为什么函数式编程将成为所有程序员所无法忽视的一道风景。

作者:司马牵牛 编译来源:51CTO.com|2009-11-06 10:48


【51CTO精选译文】这几年来,函数式编程似乎忽然红火了起来,但事实上,函数式编程却是个已经存在了四十余年但长期只活跃于学术领域而非商业开发领域的一个编程方式。那么,为什么大家会认为函数式编程将流行?有一位从事电子商务Web应用开发的程序员在stackoverflow上提出了自己的疑问,而这个疑问也普遍存在于很多程序员的脑中。让我们先看看这位程序员是怎样说的:

51CTO编辑推荐:Scala编程语言专题

jjnguy:

不管什么时候去 stackoverflow 或 reddit 这样的网站,总会遇到一群 Haskell / Scala / F# 语言的粉丝,顽固地坚持函数式编程将是下一个“大事件”。不可否认,有一些问题的确适合使用函数式编程的方式来解决,但是我过往的经验告诉我:

◆普通的公司程序员,比如和我一起工作的大多数同事,并不懂函数式编程,并且多数工作环境也不会让你使用它来编程。

◆实际上,大学不教函数式编程这门课(或者现在大学有这门课?)

◆大多数应用程序足够简单,使用普通的面向对象方式就可以解决。

函数式编程真的有必要吗?或者只不过是一个很酷的玩具?我不是想要贬低它,我只是真的不确定:如果在我的日常工作(编写电子商务 web 应用程序)中使用函数式编程的几率接近零,我是否还应该去学习这种编程?

而对函数式编程充满信心的程序员们往往不会默默认同这样的观点,而他们大多数也不是第一次遇到这样的疑问。51CTO编者选取了以下几个比较有代表性的回答进行了编译:

joel.neely:

我觉得,对于函数式编程会流行这一话题没有任何疑问,因为作为一种编程方式,它都用了大约四十年了。面向对象的程序员,每当为了编写干净简洁的代码而使用了不可变对象时(immutable object),这都是借用了函数式编程的概念。

不过,强制性的函数式编程语言最近这些日子里的确获得了很多文章的关注,而这些语言是否将主宰未来的编程语言还是一个悬而未决的问题。我自己的推测是,那种混合型、多范式的语言,比如 Scala 或 OCaml ,很可能会超过那些“纯正的”函数式语言,正如纯正的面向对象语言(Smalltalk、Beta 等):他们影响了主流编程但并未最终成为使用最多的语言。

最后,我要实在忍无可忍地指出,你那些有关函数式编程的评论和不久前我从过程式编程程序员听到的论述高度相似:

◆“传说中的”“普通”程序员不懂它。

◆没有大范围内教授这种语言。

◆用它编写的任何程序都可以使用当前的技术完成。

图像用户界面和“作为商业模型的代码”这些概念让面向对象受到更多好评,同样,我相信对不可变性的使用逐步增加以及更为简单的(大规模)并行操作将让更多程序员看到函数式编程所具有的优点。虽然在过去 50 年左右的时间里(这个时间构成了数字化计算机编程的整个历史)我们经历了很多,但我认为仍然有很多东西需要学习。

从今日起,二十年后,程序员回头再看,看到我们当下所用的那些工具是如此原始,其中包括现在流行的面向对象和函数式编程语言,他们将会大吃一惊。

Greg Hewgill:

对我来说,主要的加分处在于它固有的并行操作性,尤其是现在更高频率的CPU正在转变为更多内核。

我认为,函数式编程不会成为下一个编程范式并完全替代面向对象类型的方式。但我的确认为,如下说法非常正点:我们或者需要使用函数式语言编写某些代码,或者那些通用的语言将逐渐包含更多函数式构造。

stbuton:

即使你在工作中从不会用到函数式语言,理解函数式编程将能够让你成为一个更优秀的开发人员。总的来讲,对于代码和编程,它将给予你一个新的视角。

让我说,没有理由不去学它。

我认为,那些能够将函数式和命令式这两种风格很好地混合在一起的语言将是最有趣的,并且最可能获得成功。

Norman Ramsey:

我可以告诉你人们为什么因函数式编程而兴奋:很多很多程序员在使用函数式编程时都有一种“信仰改变”的体验:生产力提升了一倍(或者十倍),而产出的代码更加容易改写,bug也更加的少。这些人把函数式编程看作是秘密武器。一个很好的例子是Paul Graham的《Beating the Averages》(击败平均值)。而你知道他的应用是什么?电子商务Web应用。

========

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

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程序员”。他们的唯一称呼就是“程序员”。因此,如果你还没有开始学习函数式编程,那么现在就开始吧。

【责任编辑:杨赛 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

Visual Studio Team Systems软件工程实践

本书论述了软件开发价值增加的思维方式。这一思维方式构成了VSTS的基础,包括VSTS的指导思想,为什么这些指导思想会以某些方式表现,以及它...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊
× 学习达标赢Beats耳机