87931637 2020-01-17
托马斯.库尔提出“科学的革命”的范式论后,Robert Floyd在1979年图灵奖的颁奖演说中使用了编程范式一词。
编程范式,简单来说,就是编写命令的方法。
众所周知,一门语言的思想建立在其编程范式之上。很知名的三种范式分别是面向对象编程、指令式编程和函数式编程。它们并没有优劣之分,重要的是使用正确的工具来完成工作。
其中,函数式编程是大多数软件工程师不太熟悉的一个概念。
函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言很重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。
和指令式编程相比,函数式编程强调函数的计算比指令的执行重要。
和过程化编程相比,函数式编程里函数的计算可随时调用。
曾用于编写计算机程序的第二种编程语言Lisp实际上属于函数式范式。函数式编程通过简化编程定义,优先考虑数据的不变性和数学计算,而不是像传统编程去修改存储在类构造函数中的对象。在现代函数式编程中,这种想法有点狭隘,但未必是坏事。函数式语言的可变性给函数式编程带来很多功能,可以说函数式编程非常实用。
考虑到这一点,函数式编程并不局限于函数式语言,如Python具有函数性特征。虽然函数式编程与传统编程极其不同,但是似乎函数式和面对对象范式与用于数据科学的大多数语言比较接近。
适合我们的工作
大多数函数式语言的标题都有“统计”字样。这很便利,因为数据科学家很像统计学家,只是多了编程和机器学习技能。函数式语言通常更快,且更易于数据科学家使用。 相信我,你不会想快速浏览C代码,因为这样准确性有点低。大多数函数式语言完全可读,且十分容易编写和掌握。函数式编程是互联网上最古老的大数据流水线的基础,一些人对此可能十分惊讶。随着机器学习和数据计算的发展,函数式编程逐渐流行起来。
很酷的语言
有很多很酷的统计语言,其中很多语言将自有特征与其他传统特征相互交织,融合在一起。我特别钟爱以下函数式编程语言。
R语言
R语言是我们的老朋友了。
R语言是一门传统的函数式语言,但像其它大多数语言一样,它是(或已经成为)多范式的,即可以从每个特定编程范式中挑选自己喜欢的范式。这给予R语言可变性的优点。R语言起源于S语言且一直专注于统计计算。
Julia
Julia一直是我很喜爱的编程语言。
它虽然是函数式的,但确实包含一些可变的、类似于面对对象的属性,使得编程更加方便。作为一门高级语言,Julia非常迅速。它很容易进行类型声明,当声明合适时可以像C语言一样迅速,同时比R语言和Scala更具可读性。
通常,使用Julia的好处之一是它不会占用过长时间来建立模型并进行训练,因为语言简单,机器学习(ML)也很迅速。某些情况下,如在我的ML包Lathe中,只需很少的代码行就能完成机器学习,而且可以通过使用参数动态性更容易地修改构造函数的属性。
Haskell
Haskell完全不同于以上所提及的多范式语言,它以纯粹的函数性闻名。
我从未使用过Haskell,因此不能代表它,但据我所知,Haskell确实是一门很酷的语言。我对Haskell的了解很局限。如上所述,大多数现代语言是多范式的,使得它们可以在不创建新代码库的同时有效修复漏洞。
Lisp
虽然Lisp在数据科学领域不一定闻名,但它仍是一门很酷的语言。
Lisp和Julia一样可使编程十分方便简单。一个非常值得注意的属性是Lisp和Julia的宏。宏本身是一个主要的函数式特征,如果使用恰当,可使在notebook中编程更容易。需要注意,Lisp已经将自己分为了一组包括scheme、Clojure和(通用)Lisp在内的语言集。作为第二高级语言,很难探索或估计它及其功能的影响,但影响范围肯定相当大。
笔者对于Julia的喜爱想必不言而喻了,此前也出过相关文章专门介绍Julia,虽然有时候Python的构造函数(类)可能更适合于特定的工作,但就整体而言,Julia也能完成工作,且对我而言更加流畅高效。