在数学的发展史上,有多次数学危机。 这些数学危机既是对数学的挑战,也是对数学发展的推动。如可比数与不可比数(无理数)问题(实数和连续性理论)、无穷小问题(极限)、集合论与罗素悖论,最后哥德尔提出不完备定理,认为把数学彻底形式化的愿望本身, 它就是不能够实现的,不存在这样一个完美的系统。(参考:数学史上的三次危机及与无穷的关系)
怎么去判定到底一个未解的问题是否真的有解?也就是可计算问题。后来数学逻辑学家给出了一个研究思路,这个研究思路是这样的,为这个计算建立一个数学模型,用这个模型来模拟这个计算,这个模型当然被称为计算模型,然后我们来证明凡是这个计算模型能够完成的任务都是能够计算的任务,凡是这个计算模型不能够完成的任务那么都是不可计算的任务。图灵就提出了一个这样的模型,这个模型就是图灵机。
概括一下图灵机的工作过程。 读出当前方格里面的信息, 根据这个信息和自身的状态,确定一套程序。 根据这个程序做三件事情。第一件事情,往方格上写什么。 第二个,当前的这个状态应变换到下一个什么状态。 第三个,往右或者往左移动一步。反复的执行这个动作。图灵机就工作起来了。
图灵机首先给出了一个可以实现的通用计算的一个模型。这就意味着,按照这个模型,我们有可能,制造出一台能够进行通用计算的机器。第二点,它引入了通过”读写符号“和”状态改变“来进行运算的这种思想。第三个,实现了基于简单字母表完成复杂运算的能力。它直接给你展现出来了,你看基于一个简单的字母表,或者只用1和空白,我们就实现了加法运算。第四个,引入了存储区、程序以及控制器等等概念的原型。
1 数字电路的单步运算
万物数字化,二进制化,布尔代数(逻辑学和代数的结合)可以完成二进制运算,高低电压可以表示二进制,电路可以实现布尔运算,称为数字电路。
所有参与运算的数都可以转换成二进制数,二进制数之间的运算都可以通过基本的布尔代数来实现,所有基本的布尔运算都可以用电路来实现,所以我们得到一个结论:电路是能算数的,也就是说计算机是能够进行计算的。
2 多步运算的手工硬连线阶段
2.1 计算机操作手册
2.2 编写操作清单
2.3 接线员按操作清单手工硬连线
3 数据的电存储、磁存储、光存储
二进制的两种状态不仅可以用电存储,还可以用光或磁存储,如光盘、磁盘。
4 CPU与指令集4.1 CPU的计算模块(组合电路)可以抽象为指令,指令可以用组合的逻辑电路去实现(物理实现)
4.2 CPU可以抽象为指令集,指令集可以用CPU来实现
4.3 解决问题的程序(操作步骤)可以用指令集去描述
5 多步运算的自动软连接(计算模块组合与连接)
5.1 “存储程序控制”概念及硬件实现(内存 控制器)
程序和数据加载到内存,控制器从内存取指(逐条取出指令)、译指、产生控制信号,由控制信号控制其它部件的操作(所谓的软连接),整个过程自动完成(当然中间也可以与用户交互)。
6 怎样编写程序?
用二进制对照指令集直接编写;
指令集用汇编代码描述,用汇编代码编写,用汇编器翻译;
汇编代码进一步抽象为高级语言,再用编译器或解释器翻译;
高级程序设计语言,千差万别,但是,一般说来,基本的成分,不外四种:
第一种,数据成分,用以描述程序中涉及到的数据,有哪些数据类型,如何使用;
第二种,运算成分,用以描述程序中包含的运算,有哪些运算符号,如何使用;
第三种,控制成分,用以表达程序中控制结构,三种类型的控制结构如何写;
第四种,传输成分,用以表达程序中的数据传输,如何输入输出数据;
编程语言编程涉及到问题描述和求解步骤的表达,问题描述也就是数据表示,涉及到数据成分(数据类型及其操作集合)以及数据的输入输出,数据如何存储和和组织(数据结构)。求解步骤的表达涉及到语句如何组织(控制结构),代码如何组织(面向过程的函数、面向对象的类与对象)等。
程序的结构:程序由若干个模块组成,模块内部要高内聚,模块之间要低耦合。
写程序的过程:由上到下,按大到小,由粗到精,由抽象到具体。或者由下到上,逐步抽象。
7 总结一下
ref
https://www.toutiao.com/article/7081521392562340384/
李戈 《计算概论与程序设计基础_北京大学课件》
-End-