【51CTO独家特稿】在09年7月,51CTO开发频道的一篇译文中,一位名叫Neil的美国开发者向我们废了半天的口舌说明一个好的入门编程语言应该要尽可能的鼓励学生发展天生的好奇心,最好是像Python一样简单,而千万不要用Scheme这种可能是“最好”的学习编程的方式去扼杀了大多数年轻人的热情。当然无论Neil持怎样的观点,事实上Scheme在美国的很多著名大学中都被列入第一年的计算机课程,而Neil也并不否认Scheme能够为今后的编程学习打下简单而坚实的基础,并认为教授Scheme的学校很可能都是一流的。那么,这个Scheme是个什么样的语言呢?
“Scheme是Lisp语言的一个分支,它是现今仍然在使用的最古老的编程语言之一。它提供了最少的语法和极少几个操作符。同样重要的是,Scheme支持函数式编程范式,这意味着它可以用数学函数表达式来编程。”
今天这篇文章的主角不是Scheme——这个古老的语言在国内几乎可以说是鲜为人知。不过,这个语言跟我们今天要讨论的话题有很深的关系:为什么我们要开始关注和学习函数式语言。在刚刚结束不久的QCon 2010大会上,51CTO开发频道有幸面对面的采访到了NetBeans上的Erlang和Scala插件的作者邓草原先生,对函数式语言在最近几年的普及进行了探讨。(值得一提的是,草原最初接触的函数式语言正是Scheme和Lisp。)
邓草原,宏爵财经资讯技术主管。除了NetBeans Erlang和Scala插件项目之外,他也是开源软件AIOTrade项目的主创者,以及NetBeans梦之队成员。在2009年11月,51CTO开发频道曾经就Scala IDE的开发情况对草原做过一次邮件访谈,感兴趣的读者们可以参考这篇文章。
本次采访的内容主要从两个角度探讨了函数式语言的普及:开发者的角度,以及项目的角度。从市场而言,这是一个供需的关系:因为项目需要这种特点的编程语言,所以需要招聘掌握此种语言的开发者,所以开发者需要开始学习。软件领域是一个日新月异的产业,虽然说函数式语言是一个计算机界的老古董,但这个埋了许久的金子在近几年来开始发光了起来。也许是时候开始仔细考虑这样一个选择,迎着风险前进了。
以下是访谈实录。
项目的角度:为什么要考虑函数式语言?
函数式语言近年来开始流行,原因何在?
草原:一个是我们现在的程序员适应变化,开发的周期比以前要加快了。以前一个程序写出来,可能一年去开发,然后两三年间只需要小的修修补补就可以了。但是现在一个很明显的特点就是,很多程序都是要求你去非常快的,根据需求的变动,根据系统的压力,不断地做一些滚动的开发。这个时候,对于一个语言的抽象能力就会有些新的要求。比如在Java里头,我们可能会用到很多事件处理,内部类,匿名类这些东西,但是Java在语言的简洁性方面,可以说一直到Java 6以来都没有考虑的太远。从这个角度来讲,函数式编程它首先在语言的简洁性方面带来很多新的机制;或者说,函数式语言它提供了另外一种抽象的能力,可以让你的代码更加简洁。
另外,有些问题本来就是适合用函数式来处理的。原来我们没有这种手段的时候,这些问题可能要写一堆命令式的代码;那么现在有这种手段之后,我们就可以很快的跟实际问题通过函数的方式把它对上,代码本身的质量也会得到很大的提高。
当然还有一个原因就是现在多核时代,并发和并行计算的要求。并发和并行,尤其是并行,相对而言是希望能够把一个任务分配到多个CPU上去运行。因为相对来说,函数式语言强调的是引用透明,就是说,一个函数只要你给我一个相同的输入,那么按理来说我会给出一个相同的输出。像这种应用就是一个很好的并行计算的基本颗粒,这些颗粒可以简单的把它分配到不同的CPU上面或者不同的节点上面去运行。这个是函数式语言现在受到更多关注的一个重要原因。
在项目中应用函数式语言,主要面对哪些障碍?
草原:我一直有这样一个观点:我们的语言是为了解决现实世界中的问题,而现实世界应该从对象和函数两个角度去看。或者应该这样说,现实世界既是函数,又是对象。所以从这个角度来看,如果我们用一个纯函数式的语言去解决我们现实问题的时候,而不是为了解决一个学术问题或是做一些计算,那么做这些工作的时候就会发现,纯函数语言只发挥了语言抽象能力的一面而已。所以我认为,如果让函数式语言能够得到更好的发展,最好的途径是像Scala这样:它是一个融合了OO和FP(函数式风格)的,而且融合的相当好的语言。我觉得更多的人以后会发现,从函数的角度去抽象,Scala会帮助他们渐进的了解这一点。
使用函数式语言与其他语言进行多语言混合编程的效果如何?
草原:从多语言混合编程的角度来看,它们之间交互的关键我觉得还不是在它们是函数式或者是OO。因为现在,比如说Ruby,Erlang,还有Scala,Java,它们之间的互操作一般都是会通过一些特定的协议。只要这个协议得到保证,那么不管你之前在某个部件上面,或者是应用的某一块上使用了Ruby或者Erlang,实际上都没有关系。所以从这个角度而言,当你在一个项目中使用不同语言的时候,你重点考虑的可能是,我现在所要解决的这一块是不是这个语言所适合的。
比如说我们以前有一个例子,是我们做过的一个银行的项目,就是一个非常典型的混合语言的项目。这是个两三年前的项目,那时候,银行的业务系统是用Java编写的,中间有一个Erlang的程式来把手机发过来的信息转换成后台的业务系统需要的协议,并且从后台业务系统返回来的数据再转换成手机上需要的协议。这个转换过程是用Erlang来做的。但是在转换过程中,我们用到了大量的XML文件的解析,这个解析本身,说实话,Erlang它并不擅长做这种字符串或是文本的处理,所以这一块我们是用Scala写的。Scala它包装了一个XML的库,这个时候,Scala就可以发挥它在JVM上运算的效率优势。Erlang和Scala之间的通讯使用的是Erlang的那套IPC通讯机制。然后在我们的前端还有个Web应用,这个Web应用在那时是用Ruby写的。所以这是一个非常典型的混合语言的应用,试图发挥不同的语言在做不同事情时的优点。
但说实话,我本人是希望能找到一种更一般化的语言,能够同时具有不同的抽象能力,它能同时在不同的领域用不同的方式去解决不同的问题。如果现在我再设计这套系统的话,可能里面就只剩Scala了。
#p#
开发者的角度:如何学习函数式语言?
51CTO:您是如何开始了解函数式语言的?
草原:我本身对函数式语言了解的话,可能是源于大学里头了。大学里头对于Lisp或是Scheme有过一些了解,只是那时候的了解还不够深入,大概有个概念。真正把它应用到自己的实际项目当中应该是从Erlang开始的。这个大概是在三、四年前。那时候开始认真的去考虑,一个纯函数式的语言,能够在应用中能带来哪些新的,或者说,抽象的手段,还有处理问题的手段。
51CTO:您觉得学习函数式语言的难点都有哪些?
草原:掌握函数式语言,我觉得相对来说,数学的基础要扎实一些。如果实在是觉得自己在这方面有所欠缺的话,没有关系,你可以把过去的很多算法啊,数学方面的这些东西都拿回来看一看。然后你再回头去看函数式编程,那个时侯你可能会理解的更深一点。
另外呢,还要多做练习。因为如果你长久以来都是在做OO的开发,忽然转到函数式风格的编程,可能是需要一个适应的过程。这个时候,一些教程和练习就能起很大的作用。
51CTO:函数式编程的技术门槛会比较高吗?
草原:以Scala为例,如果我从Java转过去使用Scala的话,这个过渡实际上是比较循序渐进的。我可以按照传统的风格写很多命令式的代码,但是在写的过程中你会发现,Scala提供了非常多的能够以函数式风格处理的API,你可能慢慢的就会熟悉这种API。熟悉了API之后,可能就会慢慢有了函数式编程的习惯。我觉得这是最切实可行的转变的一种手段,这也是为什么我比较看好Scala的原因。
【相关阅读】
这篇可以算是是Artima总编Bill Venners的一个函数式语言初步体验感言。在学习Scala的过程中,Bill总结道:“函数化的编程风格强调不可变对象、变量可被初始化但不能重新赋值(Java中的最终变量)、数据结构转换,以及方法和控制的构造,最终产生一个没有副作用的结果。这个领域的另一端是命令式的风格,以可变对象、变量可被重新赋值(Java里的正常变量)、在数据结构中索引、以及带副作用的方法和控制构造为特征。”
51CTO在08年对国内Erlang阵营的两位先驱者,赵东炜和成立涛两人的访谈。云计算的背景和多核的需求使函数式语言开始复苏,但Erlang的学习的确有很大难度:“它主要是把一个程序拆成各个不同的任务,在并行上面跑,这其实不是很彻底的、完全新的东西,比如说我们从Google的地图里面可以看到这个思想,但这就是并发的思想。它对我们大家目前所熟悉的语言会造成冲击,这个思维模式会是一个难点,除此之外语言的语法是一个难点。”
这是一个系列文章,适合刚刚开始起步学习F#的开发者。F#是微软.NET开发平台的一门编程语言,其最大的特点是对函数式编程(FP,Functional Programming)的引入;F#对面向对象(OOP)编程的支持也很出色,使用F#语言,开发人员可以自由选择函数式编程或面向对象编程来实现他们的项目。此外,F#还可以与.NET平台上C#、VB等其他编程语言紧密结合。
两个相关技术专题:Scala编程语言 | F#函数式编程语言
51CTO专访邓草原视频请见下一页
#p#
视频采访实录