张晓龙,就职于中兴通讯,公司十佳敏捷教练,资深软件架构师,gomonkey作者,具有十多年软件架构和开发经验。近年来专注于PaaS等大型平台软件的设计与开发,尤其对于DDD和微服务有着浓厚的兴趣。
编程范式一词最早来自RobertFloyd在年图灵奖的颁奖演说,是程序员看待程序应该具有的观点,代表了程序设计者认为程序应该如何被构建和执行的看法,与软件建模方式和架构风格有紧密关系。
现在主流的编程范式有三种:
结构化编程(structuredprogramming)
面向对象编程(object-orientedprogramming)
函数式编程(functionalprogramming)
这几种编程范式之间的关系如下:如果你对上图中编程范式之间的关系已理解得非常透彻,那就没有必要再往下看了,否则建议耐心看完本文,在过程中可以跳过熟悉的章节。
众所周知,计算机运行在图灵机模型之上。最初,程序员通过纸带将指令和数据输入到计算机,计算机执行指令,完成计算。后来,程序员编写程序(包括指令和数据),将程序加载到计算机,计算机执行指令,完成计算。时至今日,软件已经非常复杂,规模也很大,人们通过软件来解决各个领域(Domain)的问题,比如通信,嵌入式,银行,保险,交通,社交,购物等。
人们把一个个具体的领域问题跑在图灵机模型上,然后做计算,而领域问题和图灵机模型之间有一个很大的gap(What,How,Why),这是程序员主要发挥的场所。编程范式是程序员的思维底座,决定了设计元素和代码结构。程序员把领域问题映射到某个编程范式之上,然后通过编程语言来实现。显然,编程范式到图灵机模型的转化都由编译器来完成,同时这个思维底座越高,程序员做的就会越少。
你可能会有一个疑问:为什么会有多个编程范式?换句话说,就是程序员为什么需要多个思维底座,而不是一个?
思维底座取决于程序员看待世界的方式,和哲学及心理学都有关。程序员开发软件是把现实中的世界模拟到计算机中来运行,每个程序员在这个时候都相当于一个造物主,在计算机重新创造一个特定领域的世界,那么如何看待这个世界就有些哲学观的味道在里面。这个虚拟世界的最小构筑物是什么?每个构筑物之间的关系是什么?用什么方式把这个虚拟世界层累起来。随着科学技术的演进,人们看待世界的方式会发生变化,比如生物学已经演进到细胞,自然科学已经演进到原子,于是程序员模拟世界的思维底座也会发生变化。
程序员模拟的世界最终要跑在图灵机模型上,这就有经济学的要求,成本越小越好。资源在任何时候都是有限的,性能是有约束的,不同的编程范式有不同的优缺点,程序员在解决领域问题时需要有多个思维底座来进行权衡取舍,甚至融合。
为了能更深刻的理解编程范式,我们接下来一起回顾一下编程范式的简史。
编程范式简史机器语言使用0和1组成的二进制序列来表达指令,非常晦涩难懂。汇编语言使用助记符来表达指令,虽然比机器语言进步了一些,但编写程序仍然是一件非常痛苦的事情。汇编语言可以通过汇编(编译)得到机器语言,机器语言可以通过反汇编得到汇编语言。汇编语言和机器语言一一对应,都是直接面向机器的低级语言,最贴近图灵机模型。
站在结构化编程的视角,机器语言和汇编语言也是有编程范式的,它们的编程范式就是非结构化编程。当时goto语句满天飞,程序及其难以维护。后来,大家对于goto语句是有害的达成了共识,就从编程语言设计上把goto语句拿掉了。
随着计算机技术的不断发展,人们开始寻求与机器无关且面向用户的高级语言。无论何种机型的计算机,只要配备上相应高级语言的编译器,则用该高级语言编写的程序就可以运行。首先被广泛使用的高级语言是Fortran,有效的降低了编程门槛,极大的提升了编程效率。后来C语言横空出世,它提供了对于计算机而言较为恰当的抽象,屏蔽了计算机硬件的诸多细节,是结构化编程语言典型代表。时至今日,C语言依然被广泛使用。
当高级语言大行其道以后,人们开发的程序规模逐渐膨胀,这时如何组织程序变成了新的挑战。有一种语言搭着C语言的便车将面向对象的设计风格带入主流视野,这就是C++,它完全兼容C语言。在很长一段时间内,C++风头十足,成为行业中最主流的编程语言。后来,计算机硬件的能力得到了大幅提升,Java语言脱颖而出。Java语言假设程序的代码空间是开放的,在JVM虚拟机上运行,一方面支持面向对象,另一方面支持GC功能。
不难看出,编程语言的发展就是一个逐步远离计算机硬件,向着待解决的领域问题靠近的过程。所以,编程语言后续的发展方向就是探索怎么更好的解决领域问题。
前面说的这些编程语言只是编程语言发展的主流路径,其实还有一条不那么主流的路径也一直在发展,那就是函数式编程语言,这方面的代表是Lisp。首先,函数式编程的主要理论基础是Lambda演算,它是图灵完备的;其次,函数式编程是抽象代数思维,更加接近现代自然科学,使用一种形式化的方式来解释世界,通过公式来推导世界,极度抽象(比如F=ma)。在这条路上,很多人都是偏学术风格的,他们