写点什么

四,编程范式

用户头像
Arvin
关注
发布于: 2021 年 01 月 19 日
四,编程范式

在开篇之前,先对计算机语言的几个关键节点进行一下罗列。

机器语言阶段(第一代)

机器的每一个动作都需要人们用二进制字符串,即“0”和“1”组成的字符书写出来,并用纸带等光电设备或通过控制台上的扳键输入机器,才能得以存储和执行。

汇编语言(第二代)

针对难以记忆的,无意义的,二进制的字符串,人们试图用英语中具有一定意义的单词来代替它,这就是所谓的“助记忆码”,或汇编码。用汇编码编写的程序称为汇编程序。而把这些汇编指令转换为机器指令的程序则称为汇编系统。

高级语言(第三代)

与汇编语言不同,第三代语言突破了与机器指令一一对应的限制,用尽可能接近自然语言的的表达方式描述人们的设想和处理过程,而把这种表达方式向机器指令的转化工作,交给专门的“工具” 一一编译系统去完成。另外一个进步高级语言实现的对机器的独立性,即它不依赖特点的硬件系统,抽象地描述处理和算法,把不同硬件系统之间的区别交给不同的编译器系统处理,从而大大提高了程序的可移植性。

非过程化语言(第四代)

在第三代语言的应用中,人们发现了新的瓶颈(处理过程的描述)。第三代程序设计语言一般都是过程化语言,即需要编写程序的人一步步的安排好机器的执行次序,虽然不是一对一的指挥机器指令,但是还必须在人的头脑中安排好实际的执行过程。人们希望机器能够自动的完成更多的工作,包括自动安排某些工作的执行顺序,而做到只要给机器下达命令,由机器自己去安排执行顺序。


随着计算机语言的数次变革,也就是编程语言的变革。除此之外,计算机领域还经历另外一个更巨大,更重要的变革,那就是“编程范式”的变迁。

结构化编程

结构化编程是对程序控制权的直接转移,进行了限制和规范。使用顺序结构,分支结构,循环结构三种结构可以构造出任何程序。

可推导性:Dijkstra 认为“理论物理学家”(cheng xu yuan)可以向数学家一样对自己的程序进行推理证明。即程序员可以用代码将一些已经证明可用的结构串联起,只要自行证明这些额外的代码是正确的,就可以推导出整个程序的正确性。

功能性降解拆分:既然结构化编程范式可用将模块递归降解拆分为可推导的单元,那就意味着模块可用按功能进行降解拆分。


用于理解科学理论和科学定律的方式理解结构化编程,也就是说它可用被证伪,但无法被证明。一段程序可以有一个测试来证明其错误性,但是不能被证明是正确的。

面向对象编程

面向对象编程是对程序控制权的间接转移,进行了限制和规范。

究竟什么是面向对象?是数据与函数的组合,还是面向对象编程是一种对真实世界进行建模的方式。那个到底如何进行建模?那么可以单纯将面向对象编程理解为 “封装”,”继承“,”多态“的有机组合吗?


封装:采用面向对象的编程语言的封装特性的实现可以讲一组相关联的数据和函数圈起来,使圈外面的代码只能看见部分函数,数据则完全不可见。C 语言中的头文件和实现文件分离编程的方式封装性要高于 java 或 c#这种面向对象编程语言。

继承:继承的主要作用是让我们在某个作用域内对外部定义的某一组变量与函数进行覆盖。

多态:多态其实不过是函数指针的一种应用,但是面向对象编程语言中确实让这种多态变的更安全和更方便使用了。如果如果 c 语言中的用函数指针显示实现多态,那么函数指针(依赖于一系列需要人为遵守的约定)带来的危险性无法预估。使程序产生无法跟踪和难以消除的 Bug。多态的强大性是因为插件式架构在面向对象语言中可以在任何地方被安全的使用。多态的高级特性-依赖反转


图中实线代表源代码依赖关系,虚线代表控制流。

A 图中系统行为决定了控制流,而控制流决定了源码依赖关系。如果我们利用多态将 method 1 进行扩展,这里的调用通过源码接口来实现的。当然程序在运行时,接口的概念是不存在的。B 图中的源码依赖关系的方向与控制流正好相反。使用这一编程方式所有源代码依赖再也不会受到系统控制流的限制。

函数式编程

函数式编程是对程序中的赋值进行了限制和规范。

可变性的隔离(没有变量,就没有伤害)。一切并发应用遇到的问题,一切由于使用了多线程,多处理器而引起的问题,如果没有变量的都不可能发生。


三个编程范式都是 1958 年到 1968 年这 10 年间被提出来的,后续再也没有新的编程范式出现过。


用户头像

Arvin

关注

生活黑客35 2019.06.11 加入

向自己发问:“当下我应该做那些事情来增加自己的决心,强化自己的人格,找到继续前行的勇气?”

评论 (2 条评论)

发布
用户头像
元编程呢?
2021 年 01 月 21 日 16:53
回复
感谢提醒
2021 年 01 月 21 日 17:16
回复
没有更多了
四,编程范式