原文地址:
http://news.csdn.net/n/20071227/112188.html甫于日前落幕的Software Development 2.0研讨会,来宾之一的Andrei Alexandrescu被问到未来编程语言的趋势时,他认为函数编程(Functional Pogramming)可能会再度兴起。我认同他的看法,我过去发表的JavaFX文章中,碰巧也有提到这一点。
目前两大开发平台(Java与.NET)都开始出现函数编程思维的踪迹。Java平台的JavaFX语言,具备所有重要函数编程的特色,所以应该归类为函数语言(或者至少是多重思维语言);.NET平台的C# 3.0也存在相当多函数编程的影子。微软的LINQ本来就源自于函数语言,更不用提微软官方的F#语言,F#沿用相当多ML语言的语法,更是彻底的函数语言(其中的F,应该是Functional的意思)。
根据Tiobe对于2007年12月语言需求所做的统计,面向对象语言占54.4%,程序语言(Procedure Language)占41.9%,函数语言占2.0%,而逻辑语言占1.8%。以上加起来刚好百分之百。
但是,这样的分类并不精确。现在的语言很少是单一思维,几乎都是多重思维(Multi-paradigm),特别是面向对象和函数编程,因为两者间并没有冲突的地方,许多面向对象语言会渐渐纳入函数编程的特色。例如,尽管C# 3.0具有相当多函数语言的特色,但是依然会被Tiobe归类于面向对象语言的类别。
函数编程最重要的基础是Lambda Calculus,在C# 3.0称为「Lambda表示式」,在Python称为「Lambda函数」,在PowerShell称为Scriptblock(剧本区块),在Java称为匿名方法(Anonymous Method),不同语言会用不同名词称呼它,但其实都是类似的东西。从这个角度来看,许多主流语言多少都具备函数编程的能力。这个趋势应该会延续下去,许多既有语言推出新版本时,会持续加入函数语言的特色。
另外,我最喜欢的REBOL,许多人工智能专家使用的Common Lisp,近年兴起的Erlang,Perl高手唐凤专精的Haskell,这些也都是函数语言。为什么我们喜欢函数编程?因为函数编程可以让我们把时间花在有生产力的事情上,而不是处理许多琐碎的事。简单地说,函数语言可以让我们用简单的方式写程序,但是威力又强大。
编程语言专家Ravi Sethi教授认为「简单」与「威力」,正是函数编程的两大优势。简单,来自于以「值」(Value)为中心,不用理会下面平台是什么机器、内存要如何配置、如何指定。函数编程的威力,则来自于「递归」以及将函数视为「First-class」(一等)的值(函数本身就是值,可以被传递、被指定)。
自动内存管理虽然始于函数语言,但是近年来已经进入各大主流语言。而将函数视为一等的数据型别,也开始进入各大主流语言。这些都要归功于函数语言,尤其是Lisp。
Lisp是函数语言的始祖,诞生于1958年,相当于50年前。换算成人类年龄的话,Lisp已经算是程序语言中的人瑞了。Lisp的后继者众多,其中,至今仍然最活跃的是诞生于1980年代的Common Lisp,它在Tiobe的排名是第十七名。在Peter Seibel写出《Practical Common Lisp》一书,并得到Jolt Award之后,让大家逐渐对Common Lisp一改印象,开始认为它不只是学术上的语言,而是一种务实的语言。
一般来说,相较于C、Pascal这类命令式编程(Imperative Programming),函数编程的缺点是效率比较差,这也是函数语言一直无法流行的主因之一。不过,随着处理器速度的提升,编译程序技术的进步,都让效率不再是问题,甚至在数学运算上,用Clean与OCaml(这些都是函数语言)开发出来的程序,效率也不会比C差。
尤其是在多核心处理器和分布式计算时代,函数编程更是比Imperative编程具有更强的优势。例如近年来逐渐受到重视的Erlang,正是将重点放在Concurrency与容错上。用Erlang可以轻松开发出来的系统,如果改用别种语言开发,可能会造成程序长度暴增以及不稳定的情况。
如果你想学习函数编程,而且如果你使用.NET平台,我会建议你使用F#;如果你使用Java平台,你可以考虑JavaFX;如果你没有Java与.NET平台考虑的话,那么你可以选择Common Lisp与Erlang。
若未曾使用过函数编程技术,思维就会受到传统Imperative编程作法的拉扯,一开始时会很不习惯,但只要坚持下去,等到跨过门坎之后,函数编程其实更自然,生产力更高。
分享到:
相关推荐
The aim of this book is to provide an introduction to the mathematical theory of infinite dimensional dynamical systems by focussing on a relatively simple, yet rich, class of examples, viz....
Learning React: Functional Web Development with React and Redux by Alex Banks English | 27 Apr. 2017 | ASIN: B071HB1526 | 350 Pages | AZW3 | 4.39 MB If you want to learn how to build efficient user ...
Haskell: Functional Programming with Types
Learn key functional programming concepts with JavaScript Peek under the hood to understand how React runs in the browser Create application presentation layers by mounting and composing React ...
OCaml的介绍,OCaml是一种为表达,安全和速度而设计的工业级编程语言。 里面的示例将帮助读者快速了解OCaml作为编写快速,简洁和易读的系统代码的工具如何脱颖而出。
SAE J2289:2021 Electric-Drive Battery Pack System:Functional Gui
同步函数编程synchronous functional programming
Dive_into_Haskell:深入Haskell:此纯函数编程语言的所有功能的示例
PD IEC TR 61508-0:2005是国际电工委员会(IEC)发布的一份技术报告,标题为“Functional safety of electrical/electronic/programmable electronic safety-related systems — Part 0:Functional safety and IEC...
SAE J2289:2021 Electric-Drive Battery Pack System:Functional Guidelines - 完整英文电子版(15页).pdf
IV: Functional and Logic Programming Languages by Peter Salus Macmillan Technical Publishing, Macmillan Computer Publishing ISBN: 1578700116 Pub Date: 06/11/98 Foreword to the Handbook of ...
functional-csharp-code, 在 C# 中,函数编程的代码示例 C# 中的函数编程这个 repo 包含了Manning出版的图书函数编程的代码示例。练习和解决方案。 代码示例在以下项目中进行组织:示例: 书中使用的例子,章节练习...
Hands-On-Functional-Programming-in-Rust:Packt发布的Rust中的动手函数编程
函数式编程:“JS 函数式... 函数式编程并不新鲜,但如今变得越来越流行,因为它是两个主要框架的核心:框架和库根据最新的谷歌趋势,ReactJS 和 Angular(这里不包括 AngularJS 和 VueJS)是最受欢迎的库和框架:Rea
函数式编程系列教程 javascript函数式编程指南。 写这个文章的原因在于函数式编程的思想非常先进,其天生的可预测性(也可以说是可测试), 更细粒度的代码(逻辑)重用,以及天生支持并行等特点, 已经被也业内越来越多...
Walter Rodin的泛函分析经典教材,应用数学、计算数学工作者的优秀参考书,第一部分1-65页。
Walter Rodin的泛函分析经典教材,应用数学、计算数学工作者的优秀参考书,第三部分131-195页。
Walter Rodin的泛函分析经典教材,应用数学、计算数学工作者的优秀参考书,第一部分66-130页。
函数式编程帮助器函数和类 Ancarda \ Functional(也称为“ FP Kit ”)是PHP 7.0+的帮助器函数和类的集合,它使基本的Functional Programming更加容易。 Operation类允许以比一系列array_*函数更直观,更易理解的...
函数式编程工作坊 ## 目标我们将通过一系列练习一起发现函数式编程。 我们将看到基本模式和相关的约束。 ## 约束 任何变量都必须是final 。 因此,禁止进行循环,因为它需要一个可更改的计数器。 禁止类继承,只...