October 4, 2019
By: Kevin

为什么函数式编程没有流行?

  1. 语言演进
  2. 流行模式
  3. FP会流行起来吗?

琼瑶是比简奥斯丁流行,但总不能说《还珠格格》是比《傲慢与偏见》更好的小说吧?

这是以前我对文章标题这个答案的回答。其实有点逃避问题,选择不直接回答,而跑去说格调,美感。。。

首先,要承认从流行的角度讲,函数式语言当先还不是很能打。

数据说话,哪些语言是流行的:

img

面向对象的编程语言 10

函数式语言:0

语言演进

一个语言能流行,无外乎如下几个因素:

  1. 有杀手级应用
  2. 是一门平台语言(排他),不用你也得用
  3. 快速更新

杀手级应用的例子在不算长的计算机发展史上有诸多例子:苹果的AppleⅡ计算机诞生时候,“VisiCalc”(世界上第一款流行的电子表格)是70%用户购买它的原因。

Ruby前几年的流行,可以归因于Ruby on Rails的成功。Google trends上,两者的关注度同进退。Ruby的热度完全由Rails带动起来的。 img

PHP的崛起,和Web动态化的趋势相符,面对动态页面的这个刚需,没有什么比在现有的html上增加部分模版代码更容易的了,很快风靡一时。虽然历史包袱沉重,但是毕竟有WordPress,Drupal两个堪称统治性的内容管理平台,影响巨大,会写php的扎克伯格也撸出了Facebook。

C/C++语言的杀手级应用是系统级编程,在70~2000年除了它,只有用汇编可用。

所以,函数式语言的流行,也有待于某个杀手级应用能够加冕。社区里能看到的希望的:

  • Elm: ElmUI最好的前端编程体验,如果你熟悉Haskell的话
  • Clojure:Datomic、Ring、ClojureScript+React一站式解决方案
  • ReasonML:revery,跨平台原生App

平台语言,第一类:富二代语言,有个好爸爸。最典型的就是Objc和swift,前十名额苹果占俩。

不断有人为swift/objc的系统级编程能力背书,其实,即便swift真的可以强大到去抢c/c++,go的饭碗,So what, who cares? 凭着iPhone每年2亿的出货量,管他什么过程式、函数式,面向对象。苹果爸爸的儿子,榜单哪还用去抢?

img

Java也是个典型的二代,Sun在2003年曾经投入5亿美元来为它做市场推广,甚至还拍了很尬的广告片,无所不不在的内容植入不输特仑苏,信用卡都不放过:

img

Java一度爬到了排名第一,风头如此之劲,微软都害怕,山寨了一个.net 版的Java:C#。当然C#也是平台二代战士,在windows平台编程,你也几乎没得选(VB??)。

第二类:拆迁户语言,遇上了大趋势,躺赢。最典型的就是JavaScript。网景和微软掐的死去活来的浏览器之争,争夺的就是全球上网人群的入口,浏览器是PC时代(1995~2010的十五年间)无可争议的王,得浏览器者得天下! 主战场围绕网景和微软的爱恨情仇,延伸到JavaApplet,JS,Flash的三国杀。

网景的Brendan Eich受命一周之内设计出一门在浏览器上执行的脚本语言。最初他想参考scheme(一门lisp)的设计和语法。但是网景公司处于商业推广目的的考虑,希望这门语言语法上尽可能像Java,而且给它命名JavaScript。虽然Java和JavaScript毫不相干,但是这个商业策略是成功的。在淘汰Applet和Flash之后,JS一统天下,登基为王。

JS一开始攀附Java扩展影响力,编程界一直有一个笑话:JavaScript之于Java,恰如老鼠之于鼠标。

imng

下图展示了web的增常:这是持续20年的指数级增长!这是用户从0到30亿的增长!这是个猪都能飞起来的风口,JS的语法,性能被诟病至今,丝毫不影响它的地位。因为它是web的语言。

如果当初JS采用了Schema的语法,而不仅仅是设计的话,Lisp要比现在火的多。

img

第三类:亲戚语言。完全的语法兼容性是起码的,代码改个后缀就是另一种语言了,还提供自动转化工具,一键转码。最典型的CoffeScript和TypeScript。CoffeScript的口号就是“It's just JavaScript”。它一度爬到GitHub的11位。

TypeScipt是JavaScript的一个语法上更严格的超集,就像C++是C语言的超集一样。ts后缀改成js就可以跑了。Kotlin虽然语法上和Java有差异,但是从语言实现上保证了和Java的代码级别一致(100%的互操作性),Java的代码和Kotlin可以互相转化(JetBrarin家的IDE里都有这个快捷键)。

其他因素:

  • 语法
  • 工作是不是好找
  • 社区

流行模式

排名前10的语言(除了C)90%都是面向对象的语言,这是个偶然吗?

或者可以换一个问题:OO语言的成功是不是因为OO

让我们先定义OO,从OO的主要特性来看,只有继承(实现继承是OO独有的):

  • 继承
  • 封装:封装的本质是模块化,很难想象非模块化的现代语言
  • 多态:动态派发,都支持

仔细看一下继承。 继承分两种:接口继承(subtyping)和实现继承(inheritance),实现继承是我们尽全力去避免的一种恶习,《编程模式》整本书就是在喊“组合优于继承”: img

OO 的圣经是诋毁 OO 主要特性吗?😂

看一下更加现代的语言怎么介绍自己:

Go的faq:

Is Go an object-oriented language?

Yes and no. Although Go has types and methods and allows an object-oriented style of programming, there is no type hierarchy

Go是一个没有历史包袱的语言吧,和Kotlin不一样,不用考虑和xx语言的兼容性。所以go自己说支持OO风格的编程,但是不支持继承。

GO并不支持实现继承!但是它还声称自己支持OO特性。不姓爱新觉罗还惦记我大清国,太过分了!

GO还进一步狡辩:对象和对象方法,本质上是一种语法糖果:object1.move(right)(move object1 right)并无实质区别...

回溯一下OO的历史,最早成功的面向对象语言是Smalltalk,甚者'面向对象'这个词都是Alan Kay(偶像,图灵奖得主)发明的。

在smalltalk中,一切皆对象(这句话是不是听起有点耳熟?)。 对象(对象是对象)之间的方法调用是通过传递消息(消息是对象),所有的对象都有类(类也是对象)...

后面的语言对他的想法多有借鉴和阐发。以至于在30年之后,Alan Kay出来说你们把OO都玩坏了,咱们说的不是一回事,只有lisp和Smalltalk才OO,真是一个爸爸都不认识的悲伤的故事:

txt

继Smalltalk之后,C++是语言上对传统语言进行‘面向对象化’升级的典型成功案例了。

C++支持多种风格的编程:比如基于STL模版的范型模式,C的模式,带类的C的模式。带类的C这个特性是最早加入的(和更强的类型检查一起),近就这个版本而言,并不成功。

OO和语言的成功,并没有相关性。

FP会流行起来吗?

一定的!!

FP的实质就是:

"Avoid side effect and mutation"

这两个概念日渐深入人心,Kotlin的FAQ里这么说:

faq

作为一个和Java 100%兼容的面向对象语言,太没骨气了。10年前,你们不这么样的:

"Python是支持面向对象的脚本语言。" -- Guido van Rossum(Python作者)

"Ruby的初衷是要设计一个比Python更加面向对象的,更加强大的脚本语言。" -- 松本行弘(Ruby作者)

而现在,没骨气的远不止Kotlin一个:

  • 连Java都开始支持lambda了
  • swift在强调自己的函数特性
  • JavaScript因为自身的灵活性和设计上的历史渊源,甚至开始声称自己是lisp方言的一种。

从市场营销上,FP已经是一个加分项!

未来是FP的,现在已经是大概率事件。

OO -> 混合 -> FP

FP这个词注定会被用烂,这是另外一个故事了。

Tags: essay clojure