3 Paradigm Overview
本章讲解三种不同类型的编程范式-结构式编程,面向对象编程和函数式编程
结构化编程
第一个被广泛采用的编程范式(但并非最早被发明的)是结构化编程,由艾兹格・迪杰斯特拉在 1968 年提出。迪杰斯特拉证明:无限制的跳转(goto 语句)会破坏程序结构。我们在后续章节会看到,他用我们更熟悉的 if/then/else 和 do/while/until 等结构取代了这些跳转。
我们可以这样概括结构化编程范式:结构化编程,对程序中直接的控制转移施加了约束。
面向对象编程
第二个被采用的范式,实际上早两年(1966 年)就由 Ole-Johan Dahl 和 Kristen Nygaard 提出。
这两位程序员发现:ALGOL 语言里的函数调用栈帧可以移到堆上,这样一来,函数里声明的局部变量在函数返回后依然可以长期存在。于是:
函数变成了类的构造函数
局部变量变成了成员变量
嵌套函数变成了方法
这就自然而然地通过规范使用函数指针引出了多态。
我们可以这样概括面向对象编程范式:面向对象编程,对程序中间接的控制转移施加了约束。
函数式编程
第三种范式直到最近才开始流行,但它其实是最早被发明的,甚至早于计算机编程本身。函数式编程直接来源于阿隆佐・邱奇的研究成果。1936 年,他在研究和图灵当时同样的数学问题时,发明了 λ 演算。λ 演算是 1958 年约翰・麦卡锡发明的 LISP 语言的基础。
λ 演算的一个核心思想是不可变性—— 即符号的值一旦确定就不再改变。这意味着:函数式语言本质上没有赋值语句。尽管大多数函数式语言确实提供了修改变量的方式,但都受到非常严格的约束。
我们可以这样概括函数式编程范式:函数式编程,对赋值操作施加了约束
值得深思
你可以注意到我在介绍这三种编程范式时,特意摆出的规律:每一种范式,都是在剥夺程序员的某些能力,而不是增加新能力。
它们都施加了某种额外约束,意图是限制性的。这些范式更多是在告诉我们不能做什么,而不是告诉我们要做什么。
换个角度看:每种范式都在拿走我们的一些东西。这三种范式合在一起,分别拿走了:
goto 语句
随意使用函数指针
随意赋值
还有什么能被拿走的吗?大概没有了。
因此,这三种范式很可能就是仅有的三种—— 至少是仅有的三种限制性范式。进一步的证据是:它们全都在 1958–1968 这十年内被发现。在之后的几十年里,再也没有新的范式出现。
结论
这段关于范式的历史和架构有什么关系?关系极大。
我们用多态(面向对象)作为跨越架构边界的机制;
我们用函数式编程对数据的位置与访问施加约束;
我们用结构化编程作为模块中算法的基础。
你会发现,这三者刚好完美对应架构的三大核心关注点:功能、组件解耦、数据管理

浙公网安备 33010602011771号