函数式语言
---恢复内容开始---
函数式语言
函数式编程并不是新概念,实际上,在计算机科学出现之初,函数式编程就已经崭露头角,教科书式的函数式编程语言Lisp在1958年就诞生了,但是,为什么一直都是命令式编程和面向对象编程大行其道呢?
阿兰·图灵和冯·诺依曼祖师爷开天辟地,创立了计算机这门学科,因为这行前无古人,所以最早的一批学者都有其他专业的背景,有的是电子电气方面的专家,有来自物理学科,还有的本来是数学家。不同的背景,也就带来了对计算机发展方向的不同观点。
因此,对于编程语言有着不同方向的发展,涌现出了最初的函数式编程,命令式编程和面向对象的编程等。函数式编程可以理解为如下:
函数式编程:将业务逻辑细化,抽象,封装成一个个功能函数,并借助语言自带的高阶函数api,将整个业务流程转化为函数之间的相互调用,这就是函数式编程。
函数式编程语言(functional language)
命令式编程语言是以冯诺依曼这种体系结构为模型,而函数式程序语言的目的是尽可能的模拟数学函数。
函数式语言的核心特征:
(1)以“函数”为首,如同命令式语言中的“变量”,函数可以赋值给其他变量,可以作为其他函数的参数,
或者作为其他函数的返回值。
(2)不修改变量的值
(3)只有表达式,没有语句。此处的语句指的是没有返回值得某些操作。
(4)引用透明(Referential transparency),函数的运行不依赖与外部变量或“状态”,简单的说就是,
同一个输入(参数),总是会产生同一个输出(返回值),这与数学函数的特征很一致。
命令式语言因为全局变量等的存在,就无法做到这一点。
(5)对比命令式语言,递归形式的循环
函数式编程语言 Haskell 和 OCaml 几乎成为新想法的摇篮,它们当中有一些已经成为主流编程语言的一部分。垃圾回收和参数化多态就是其中最好的例子。Java 的泛型是在 2000 年初引入的,但它在函数式编程语言中早已存在了 20 年。Linq 的设计思想直接来自 Haskell,F# 的 workflow 设计灵感则来自 Haskell 的 monadic I/O story。
随着摩尔定律的放缓,计算机用户开始更多地依赖软件能够并行地运行于多个核芯片之上,以此来获得更快的处理速度。毫无疑问,函数式编程语言特别适合用于并行执行,因为它们很少有机会发生崩溃。
“在使用函数式编程语言时,可以通过避免运算单元之间发生交互来实现并行运算。这就要求程序员对程序各个部分之间的交互细节了如指掌,从而降低 bug 出现的几率”。
函数式编程语言的市场仍然相对较小,但毕竟已经存在了 27 年,它们的用户群还是很强大的。很多公司也开始使用函数式编程语言。
---恢复内容结束---