您所在的位置:开发 > 语言&工具 > 哪种语言将统治多核时代 再看函数式语言特性(1)

哪种语言将统治多核时代 再看函数式语言特性(1)

2009-06-30 11:40 阿风 编译 51CTO.com 字号:T | T
一键收藏,随时查看,分享好友!

函数式语言发展到现在,也可以算是不新不老了。一直以来,函数式语言在企业和商业开发领域逐渐让位于面向对象的开发语言,流行领域也逐渐缩小到只剩下学术界。不过随着多核流行以及并发需求的日益增长,函数式语言的反攻开始了。

AD:

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

【51CTO外电精选】最近这几年,软件开发语言可谓是层出不穷。在这些新的编程语言中,最多的就是函数式语言。本文将向你介绍函数式语言的概念、术语、方法以及几种典型的函数式语言。本文面向的读者是那些已经懂得其它编程语言、但却对函数式语言没有了解的开发人员。

什么是函数式语言?

如果你已经用面向对象的语言(例如Java和C#)写了很长时间的代码,那么可能很难想象出另一种新的编程思维方式,而函数式语言恰恰做到了这一点。它的核心就是通过对算法进行功能分解,从而解决软件问题。在函数式语言里,函数是首要的。如果你是Java阵营出身,那应该能理解到这之间的差异。在Java中,实现某种方法的唯一形式就是将其作为某个类的成员。

虽然最近风头正劲的某些特殊语言引人注目,但是函数式语言其实也可以代表一门技术,而不仅仅是一种语言。我们可以用函数式编程的方式,用面向对象的编程语言实现一般的功能(后面的章节里我们就会看到一个用函数式方法编写的C#程序)。虽然这可以实现,但是在稍大一点的程序中,我们很快就会感觉到缺乏表现力,反模式(anti-pattern)也随之出现。试想一下,不用extend和implement关键字写个上规模的Java程序有多痛苦。由于这些困难的存在,人们需要一种新的语言:一种函数式语言

为何需要函数式语言?

很明显,现代计算平台上发生了一个重大变化,那就是多核技术的引入。除了上网本和PDA,我们甚至都找不出还采用单核处理器的台式机和笔记本电脑了。我们正在向多核心,多处理器发展,并且所有迹象都表明这一趋势将继续下去。除了采用多核心之外,高运算量和高复杂度的算法应用都倾向于优化使用图形处理单元(GPU),从而提高并行性。归纳起来,从开发者的角度来说,这些都属于并发问题的范畴。

我们大多数的编程语言都不容易实现并发。想想几十年前,C语言程序里的错误处理直接就被代码基底(code base)丢弃了。它与业务逻辑混在了一起。C函数成功后就将返回0 ,失败则返回错误代码。很明显这不是很理想的办法,但是C语言本身的表达能力限制了开发者们用其它方法来进行出错处理。其他语言对此进行了改进,在C++或者Java中,出错时会抛出异常,异常处理程序把出错处理和正常事务处理分离开来。有些人可能会说这也算不上什么太好的办法,但是这至少是个不小的进步了。在解决并发这个问题上,我们所掌握的技术的成熟度也和这差不多。如果想要在一个用面向对象语言编程的程序里实现并行,那编写起来真得费一番脑筋。像生成一个打印任务线程并不需要处理多少并发控制,但是往往它还会牵扯到进程间的状态共享显示器的阻塞。随着内核数的增加,同时运行的线程数可能进一步增大,系统的效率也将随之降低。这时,我们就需要一种新的语言,让我们能从这些细节工作中抽身出来,以更好地利用并发。

函数式语言已经在简化并行开发中证明了它的作用, 这得益于它既不用共享内存,也不会产生副作用(side effect)的函数。进一步深入函数式语言,你就会发现它让开发者从并发这个概念中抽身出来了,让开发者不用老是想着现在CPU是在并发作业。许多语言实现了一种并发开发模式,通常称之为Actor模型。在这种模型下,进程间传递消息而不是共享状态从而消除线程阻塞

函数式语言的另一大宝贵优点就是简洁。在Stuart Halloway的《Programming Clojure》一书第一章中,Stuart展示了3行clojure代码,这比用Jakarta Commons框架开发减小了三分之一的代码量,同时还体现出更清晰明了的逻辑思路。

有一个很重要的观点就是,函数式语言不是用来取代面向过程或者面向对象的编程语言的。看看我们在上一节中所列举出来的几种函数式语言,就会发现许多新的函数式语言都是多范型(multi-paradigm),很多时候这些语言都是运行在虚拟机上,并且作为其它面向对象语言和命令式语言的桥梁出现的。选择适合手头工作的语言才是最重要的。我希望从业者们在开发主流应用时继续使用Java,Groovy或者C#这些通用语言,但当面临着一个极为复杂的算法或需要实现高并发时,最好还是转而用函数式语言来集成这些方案。这也正是Neal Ford说了多年的 “多语言程序员”(polyglot programmer)。对于此类程序员的形成,我们可以参考一下一位Java兼Scala开发者的学习历程

几种典型的函数式语言

当我们回顾历史上的编程语言时,就会发现其实函数式语言并不是一个新生事物,它早就出现过。其中最广为人知的几种“祖父”级语言包括:LISP和FORTRAN 。自1980年代中期以来,这些语言在企业和商业开发领域逐渐让位于面向对象的开发语言,流行领域也逐渐缩小到只剩下学术界。不过下面列出的这几种函数式语言最近正在向商业领域发起反攻

◆Erlang:这是一种以A.K Erlang的名字命名的通用并行编程语言。它有函数式语言的元素,以及一个Actor 并发模型,从而简化并行开发工作。编辑推荐对Erlang感兴趣的读者阅读一下51CTO以前的一次访谈:因并发而生 因云计算而热:Erlang专家访谈实录

◆Haskell:这是一门已经有超过20年历史的开源编程语言,它的设计宗旨就是成为一门纯粹的函数式语言。

◆OCaml:面向对象的Caml(Objective Caml)是Caml语言的一个开源版本,Caml语言可以算是ML语言的一个方言版了,ML语言1970年就已经开发出来了,也是作为一种通用函数式语言存在的。它被认为是后来出现的F#等多种函数式语言的基础。

◆Lisp:表处理语言(List Processing Language)是一种函数式语言,最初是于1958年拟定的。由它派生出了许多分支。

◆Scala:Scala 语言的设计目标是在Java虚拟机上实现函数式和面向对象这两类编程语言的集成。它是一种强类型的编程语言。Scala编程语言近年来的流行度在不断提升,编辑推荐读者参阅51CTO的Scala编程语言专题

◆Clojure:Clojure是Lisp语言的一个现代分支,它运行在Java虚拟机上,是为并发程序开发设计的。它是一种动态类型编程语言。

◆F#:这是一种运行在.Net CLR平台上的新语言。它是OCaml的一个分支,它兼具了函数式和命令式面向对象语言的特点。同时它也是一种强类型的编程语言。F#在未来的.NET平台上有重要的作用,将在Visual Studio 2010中被正式包含

值得注意的是函数式语言并不一定要是动态语言(dynamic language)。函数式语言允许动态或静态类型。这里所列出的语言只是各种各样函数式语言中的一个子集,每一种实现了某种特定的需求。本文将介绍好几种典型函数式语言,而不是专门讲解某一种语言。另外我们还有一个没有回答的问题就是:为什么现在对函数式语言的需求越来越强烈?



分享到:

热点职位

更多>>

热点专题

更多>>

读书

网络工程师教程(第2版)
本书是全国计算机技术与软件专业技术资格(水平)考试的指定用书。按照新的网络工程师考试大纲的规定,本书包含了数据通信基础知

51CTO旗下网站

领先的IT技术网站 51CTO 领先的中文存储媒体 WatchStor 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i