为什么80%的码农都做不了架构师?>>>   

【IT168 技术文档】甫于日前落幕的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编程作法的拉扯,一开始时会很不习惯,但只要坚持下去,等到跨过门坎之后,函数编程其实更自然,生产力更高

转载于:https://my.oschina.net/digerl/blog/11091

一篇比较深刻的讲FP特性的文章相关推荐

  1. 曲线均匀分布_曲线篇:深刻理解B 样条曲线(下)

    前两篇中讲解了贝塞尔曲线和B样条基础. FrancisZhao:曲线篇: 贝塞尔曲线​zhuanlan.zhihu.com FrancisZhao:曲线篇:深刻理解B 样条曲线(上)​zhuanlan ...

  2. 【转】java提高篇(二)-----理解java的三大特性之继承

    [转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in ja ...

  3. 第十篇:面向对象系列之三大特性(二)

    本篇主要介绍面向对象的三大特性及 封装.继承.多态. 一.封装 第一层意义上的封装: 封装:从封装本身的理解,装 -- 将一系列东西(苹果.梨子.香蕉等)一股脑的塞进一个盒子内,而封--自然就是密封, ...

  4. python文本自动伪原创_新手一天30篇伪原创,快速在线生成原创文章

    新手一天30篇伪原创,快速在线生成原创文章 现如今新媒体行业的竞争可谓越来越大,在这个内容为王的时代,优质的内容等于一切.写不出令人满意的内容,自我感觉到失落只是一方面,另一方面则是面临着失业的风险. ...

  5. 想写一篇关于.net下COM工作原理的文章

    今天想写一篇关于.net下COM工作原理的文章.花了大概3个小时,文章也写的差不多了,可是越写到后来越发现自己的观点以及想法越错误. 边写边查MSDN,最后不得不放弃发布这篇文章了.虽然花了好几个小时 ...

  6. 一篇经典的TCP/IP基础知识英文文章

    一篇经典的TCP/IP基础知识英文文章 INTRODUCTION When you configure the TCP/IP protocol on a Microsoft Windows compu ...

  7. 放大招了,肝了一篇8万字的Java8新特性总结,赶快收藏

    大家好,我是冰河~~ 说实话,肝这篇文章花了我一个月的时间,关于Java8的新特性全在这儿了,建议先收藏后阅读. Java8有哪些新特性? 简单来说,Java8新特性如下所示: Lambda表达式 函 ...

  8. java 集成_java提高篇(二)-----理解java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  9. JS学习篇(一) JavaScript语言特性

    最近在学习Web开发,除了之前学习笔记提到的HTML和CSS,Web开发三件套的第三样就是JavaScript(即JS).说到JavaScript,大家就算没接触过应该也会熟悉,只要稍微看过Web开发 ...

最新文章

  1. centos防火墙端口配置
  2. acrh17华硕固件_华硕全新手游路由器RT-AC85P首发:雷达定向传输
  3. 今天整理了下所有博文
  4. 我对创业和管理的一些看法
  5. 【转载】也有很多的例子飞鸽传书
  6. js split参数为无效字符_互联网前端开发技术JavaScript字符串类型详解
  7. [转]上海五年的奋斗历程 从月薪3500到700万(感人!催人振奋!)
  8. linux安全加固-三级等保(一)
  9. Universal Radio Hacker(URH):一个用于逆向解析和攻击无线通信协议的开源工具
  10. 计算机毕业优秀作品展观后感,毕业设计作品展观后感
  11. 机器学习特征工程之特征缩放+无量纲化:非线性缩放(例如,sigmoid、tanh、arctan等)
  12. 记录日常行程的微信小程序开发与实现-武汉理工大学
  13. java 发送邮件553错误_使用Java Mail API发送邮件,抛出认证错误553 authentication is required. 解决办法...
  14. 用WinSCP登录路由器并传入文件及改文件权限
  15. java数据结构和算法——图的深度优先(DFS)遍历
  16. c语言调试时出现的三种错误,C语言课件 第十四章 常见错误和程序调试
  17. IPFS星际文件系统科普
  18. hbw-utils - 基本数据类型进制转换的实现
  19. Nancy朋友的时间线
  20. 解决aspose word 中文乱码问题

热门文章

  1. Spring Boot 基于注解驱动源码分析--自动配置
  2. Django之路——6 Django的模型层(一)
  3. 你的sql查询为什么这么慢?
  4. Vue学习小札——2.6 组件参数校验与非props特性
  5. Reactive Extensions(Rx) 学习
  6. ActionBar右边菜单按钮的添加
  7. 给力开源,.Net开源地址大收集
  8. Silverlight测试——利用Ranorex实现数据驱动测试
  9. switch和枚举的小坑
  10. SpringIOC注解的学习笔记(一)