这是这个系列的最后一篇,从编程范型的角度概览,前面几篇的链接在文章后半部分有汇总。
我在之前已经介绍过编程范型的概念,而事实上,我们到现在为止,纠结在这四门迥异的语言上面,浅看是各种语言特性,深看就是编程范型和思维方法。
下面这张“神图”来自于 这里 ,可以说是对于范型和语言归类的概览,从左往右从更强的声明式向着更弱的声明式发展;依据状态分为Unnamed state(串行或并发,包含逻辑式和函数式这几种分类)、Nondet. state(所谓的不确定性状态)和Named state(包含数据流、消息传递和状态共享这几种分类),Haskell出现在了左侧函数式语言的分支内,而Java出现在了右侧状态共享的分支内。有了这棵大树,范型之间的关系变得很容易识别,比如这样的粗线条:
最初的范型仅仅是简单的“record”而已,纯粹的声明和静态的描述;有一天加上了过程,于是有了一阶函数式编程;之后有一天再加上了状态,于是有了命令式编程。
一阶函数式编程加上闭包,得到了真正的函数式编程(有了闭包,就可以写高阶函数了);命令式编程加上对函数的搜索,就得到了串行的OO以及状态共享的函数式编程。
……
从维基百科的 Comparison of multi-paradigm programming languages 词条中,可以看得到常见多范型语言的分类情况。Java和JavaScript位列其中,从表中的分别可以看出二者的分别:因为Java有线程的概念,可以写并发编程范型的代码;有泛型的定义,可以进行泛型编程;有专门的Class类,可以反射和自省。
这里提到“多范型”,其实这个概念定义也不精确,大致来说,除了Haskell,我们今天讨论的三门其它的语言,都算是多范型的编程语言。例如用Java也可以写函数式编程的代码,但是需要避免使用状态。越是强大的语言,约束越少,可能性越强,代码却不一定简洁。
因此与其讨论一门语言“可以”写哪些范型,倒不如讨论一门语言“擅长”写哪些范型:
纵览编程范型之后,再来回顾一下之前几篇的内容,欢迎移步阅读:
如上仅仅只是冰山一角,希望对于想了解这四门语言和相关编程范型的读者有帮助,也是对我自己而言,通过Java和JavaScript来学习Groovy和Haskell的一个总结。很多特性都没有涉及,比如Haskell的很多高级特性,是因为我觉得我没法写好,就先不写了。
工作需要,要开始学习Scala了,我本来对Scala的认识水平仅仅停留在“了解”的基础之上,通过最近这段时间的学习,我发现有了Groovy和Haskell的基础以后,再来看Scala的那些语法和特性,阅读的速度很快,很多面孔都似曾相识。