一、什么是函数式编程语言
函数式编程语言(functional progarm language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言。函数式语言主要成分是原始函数、定义函数和函数型。这种语言具有较强的组织数据结构的能力,可以把某一数据结构(如数组)作为单一值处理;可以把函数作为参数,其结果也可为函数,这种定义的函数称为高阶函数,程序就是函数,程序作用在结构型数据上,产生结构型结果,从根本上改变了冯·诺伊曼式语言的“逐词”工作方式。
 
 
二、函数式编程语言包含的编程语言及其特点
函数式编程经常使用递归。纯函数式的程序没有变量和副作用(Side effect)。因为纯函数式程序设计语言没有变量,函数没有副作用,编写出的程序可以利用记忆化、公共子表达式消除和并发计算在运行时和编译时得到大量优化。我们常见的编程语言有数十种之多。编程语言种类有很多,如果按照程序设计的方法,可分为以下几种程序语言:
(1)结构化编程语言,比如C语言等。
(2)函数式编程语言,比如OCaml, Lisp等。
(3)逻辑式编程语言,比如Prolog等。
(4)面向对象程序语言,比如Java等。
通过比较可以发现,函数式编程语言有以下几个特点:
1、并行。在函数式编程中,程序员无需对程序修改,程序就可以并发运行。程序运行期间,不会产生死锁现象。原因是通过函数式编程所得到的程序,在程序中不会出现某一数据被同时修改两次及以上的情况,同样的,两个不同的线程就更不用说了。由于函数式编程有这样的优点,导致了程序员完全不用花费精力去考虑增加某个线程带来的并发问题。
在函数编程语言中,编译器会分析代码,辨认出潜在耗时的创建字符串s1和s2的函数,然后将他们并行的运行。这样的做法,是程序员在使用普通的命令式程序语言时不可能做到的。而使用函数式程序语言可以自动的找出那些可以并发执行的函数。
2、单元测试。在函数式编程中,由于程序中的每一个符号都是final后的,所以这样的函数不会产生副作用。这就导致了在某个地方产生修改,同时不会有函数修改过在自身范围之外的变量或者状态被另外的函数所使用。这就导致了函数的返回结果只是返回值。只有函数自身的参数才会影响函数的返回值,所以在编程的时候,对程序中的每个函数而言,程序员只需在控制它们的参数,而不用在意函数自己点顺序以及函数外部变量和状态就能正确的编程。与函数式编程相比,命令式编程就没有这样的优势了,在检查函数的返回值的同时程序员还必须检查函数是否影响到了函数的外部状态和变量。
3、没有额外作用。副作用是指的是函数内部与外部互动。比如,函数在自身内部可以对函数以外的其他变量进行修改,这样就会产生其他结果。在函数式编程中,想要达到这样的目的就必须让函数自身要保持独立。在函数式程序语言中,所有的功能的结果就是一个返回值,不存在其他的行为,包括对外部变量的修改。
4、不修改状态。在函数式编程中,程序语言在使用中是会不修改变量的,它的一个特性可以使得函数式编程语言区别于其他的程序语言。在其他类型的语言中,变量是用来保存状态的。由于函数式编程不修改变量,导致了这些状态不能存在于变量中。那么,函数式编程语言保存状态的方法是使用参数来保存,递归方法是最好的例子。由于采用了递归方法,函数式编程语言在运行速度上相对于其他语言较慢,所以,速度不够快是函数式编程语言长期不能广泛使用的主要原因。
5、引用透明。在函数式编程中,引用透明指的是运行函数的时候,函数的没一个步骤都不会不牵连到函数的外部变量或状态,而是只依赖于函数输入的参数,相同的参数输入总会得到相同的函数返回值。而在其他类型的语言中,函数的返回值不仅仅与函数的参数传入有关,也与当前的系统状态有关。在不同的系统状态的情况下,函数的返回值不同。
6、代码部署热。在以前,假如想在Windows上安装更新,安装之后重启计算机是必须进行的步骤,可能还不只一次的重启。即使是仅仅安装了一个小的软件也不能免于重启的步骤。一些特殊的系统,比如电信系统,这样的系统必须保证任何时间都在运行。因为如果在系统更新时紧急拨号失效,就可能造成很大的损失。最理想的情况是在完全不停止系统任何组件的情况下,达到更新相关的代码的目的。这样的想法在命令式编程中是不可能的。对函数式的程序,所有的状态即传递给函数的参数都被保存在了堆栈上,这使的热部署轻而易举。实际上,所有我们需要做的就是对工作中的代码和新版本的代码做一个差异比较,然后部署新代码。其他的工作将由一个语言工具自动完成。
 
 
三、函数式编程语言为什么那么流行,原因有5点。
1. 代码简洁,开发快速
函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。
Paul Graham在《黑客与画家》一书中写道:同样功能的程序,极端情况下,Lisp代码的长度可能是C代码的二十分之一。
如果程序员每天所写的代码行数基本相同,这就意味着,"C语言需要一年时间完成开发某个功能,Lisp语言只需要不到三星期。反过来说,如果某个新功能,Lisp语言完成开发需要三个月,C语言需要写五年。"当然,这样的对比故意夸大了差异,但是"在一个高度竞争的市场中,即使开发速度只相差两三倍,也足以使得你永远处在落后的位置。"
2. 接近自然语言,易于理解
函数式编程的自由度很高,可以写出很接近自然语言的代码。
前文曾经将表达式(1 + 2) * 3 - 4,写成函数式语言:
subtract(multiply(add(1,2), 3), 4)
对它进行变形,不难得到另一种写法:
add(1,2).multiply(3).subtract(4)
这基本就是自然语言的表达了。再看下面的代码,大家应该一眼就能明白它的意思吧:
merge([1,2],[3,4]).sort().search("2")
因此,函数式编程的代码更容易理解。
3. 更方便的代码管理
函数式编程不依赖、也不会改变外界的状态,只要给定输入参数,返回的结果必定相同。因此,每一个函数都可以被看做独立单元,很有利于进行单元测试(unit testing)和除错(debugging),以及模块化组合。
4. 易于"并发编程"
函数式编程不需要考虑"死锁"(deadlock),因为它不修改变量,所以根本不存在"锁"线程的问题。不必担心一个线程的数据,被另一个线程修改,所以可以很放心地把工作分摊到多个线程,部署"并发编程"(concurrency)。
请看下面的代码:
var s1 = Op1();
var s2 = Op2();
var s3 = concat(s1, s2);
由于s1和s2互不干扰,不会修改变量,谁先执行是无所谓的,所以可以放心地增加线程,把它们分配在两个线程上完成。其他类型的语言就做不到这一点,因为s1可能会修改系统状态,而s2可能会用到这些状态,所以必须保证s2在s1之后运行,自然也就不能部署到其他线程上了。
多核CPU是将来的潮流,所以函数式编程的这个特性非常重要。
5. 代码的热升级
函数式编程没有副作用,只要保证接口不变,内部实现是外部无关的。所以,可以在运行状态下直接升级代码,不需要重启,也不需要停机。Erlang语言早就证明了这一点,它是瑞典爱立信公司为了管理电话系统而开发的,电话系统的升级当然是不能停机的。

函数式编程语言(Fuction Program Language)的更多相关文章

  1. 函数式编程语言(functional language)

    内容根据百度词条整理! 转载请声明来源:https://baike.baidu.com/item/%E5%87%BD%E6%95%B0%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8 ...

  2. Functional language(函数式编程语言)初步了解

    对于函数式语言并不太了解,查询了百度.博客.知乎等做了以下总结. What 函数式语言(functional language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分 ...

  3. 函数式编程语言(Functional Program Language)

    (一) 什么是函数编程语言 简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论. 是一种编程典范, ...

  4. 函数式编程(Function Program Language)

    WHAT: 简单说,"函数式编程"是一种"编程范式",也就是如何编写程序的方法论. 它属于"结构化编程"的一种,主要思想是把运算过程尽量写成 ...

  5. History of program (language).

    1 编程语言的发展历程及未来趋势 1.1 编程语言的发展 · 1946 Plankalkul     Konrad Zuse,一位德国工程师,他躲藏在巴伐利亚附近的阿尔卑斯山上时,独立开发了Plank ...

  6. Function program language

    历史 Lambda演算为描述函数及其评估提供了理论框架.它是一种数学抽象而不是编程语言 - 但它构成了几乎所有当前函数式编程语言的基础.等效的理论公式,组合逻辑,通常被认为比lambda演算更抽象,并 ...

  7. 函数式语言(Functional language)简单介绍

    函数式语言(functional language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定义函数和函数型. 函数式语言有:Haskell,Clean,M ...

  8. functional program language(what,include,why popular)

    函数式语言(functional language)一类程序设计语言.是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定义函数和函数型.这种语言具有较强的组织数据结构的能力,可以把某 ...

  9. functional program language

    1.什么是函数式编程语言 函数式语言(functional language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定义函数和函数型.这种语言具有较强的组 ...

随机推荐

  1. 所有JTAG集成电路都应该支持菊花链

    菊花链 在电气和电子工程中,菊花链是一种布线方案,其中多个设备按顺序或环形连接在一起.相邻设备才能通信.菊花链可用于电源,模拟信号,数字数据或其组合. 但是由于菊花链的串联特性,如果任何一个设备从链路 ...

  2. usart2 重映射

    今天拾起闲置很久的灰机,测试发现nrf2401坏掉,重新淘宝.还发现机上搭载的usart1坏掉,换成usart2,发现端口被电机占用,重映射到PD5,PD6 关键是后面两句不要忘记了 RCC_APB1 ...

  3. javascript创建函数的20种方式汇总

    http://www.jb51.net/article/68285.htm 工作中常常会创建一个函数来解决一些需求问题,以下是个人在工作中总结出来的创建函数20种方式,你知道多少? function ...

  4. Chrome控制台console的各种用法(方便调试)

    1.输出信息 console.log('消息内容!'); //输出普通信息 console.info('消息内容!'); //输出提示信息 console.error('消息内容!');//输出错误信 ...

  5. select2 使用方法总结

    官网:http://select2.github.io/ 调用 <link href="~/Content/select2.min.css" rel="styles ...

  6. 网页title左边显示网页的logo图标

    打开某一个网页会在浏览器的标签栏处显示该网页的标题和图标,当网页被添加到收藏夹或者书签中时也会出现网页的图标,怎么在网页title左边显示网页的logo图标呢? 方法1: 找一个或者作一个ico文件, ...

  7. 二: vue的属性及功能,axios

    一: 过滤器 1. 定义:    过滤器,就是vue允许开发者自定义的文本格式化函数,可以使用在两个地方:输出内容和操作数据中. 定义过滤器的方式有两种. 2.使用vue.filter()进行全局定义 ...

  8. 关于python的基础知识

    一,编程语言的类型: 1.编译型 2.解释型 3.静态语言 4.动态语言 5.强类型定义语言 6.弱类型定义语言 编译型vs解释型 编译型: 优点:编译器一般会有预编译的过程对代码进行优化.因为编译只 ...

  9. PHP 的命令行模式

    php CLI SAPI 内置Web Server 从版本 4.3.0 开始,PHP 提供了一种新类型的 CLI SAPI(Server Application Programming Interfa ...

  10. Qt532的QString输出各种编码的16进制数组(测试代码)

    环境:Win7x64.Qt5.3.2 MSVC2010 OpenGL.vs2010 1.只测试了 4种:Utf8.Latin1.Local8Bit.unicode 2.测试代码:(这个是 " ...