计算机到底是什么?

最近迷上了一种学习方法:推导学习法。比如拿到一个名词,但是不知道它是什么。这时候大部分人就会产生疑问:xxx是什么?
而推导学习法。会去从另一个角度去了解它:为什么它会出现?它是用来解决什么问题的?

说的有些玄乎,但是其实在之前OAuth2的一篇博客中,我们就是用这种方法学习OAuth2的。接下来我就用这种方式推导计算机这个词。

基础架构推导

计算机,顾名思义,就是用来计算的机器。这里面核心的词就是:计算。计算的边界在哪里?至今我们还没有人能说得清。 计算能不能解决”智能”的问题?通过”计算”的能力,计算机是否终有一天可以获得和人类一样的智能?

存储

让我们来设想一下:如果让我们从零开始来设计一台”电脑”,用来解决一切可以用计算来解决的问题。

电脑的核心能力是"计算"。什么是计算?计算就是对一个数据(输入)进行变换,变成另外一个数据(输出)。在数学中我们常把它称为函数。如下:

y = F(x)

我想没人不知道这个公式了吧。这里的x、y是数据。数据我们扩展一下,就可以是文本、图片、视频,或者各种我们能想到的东西。 如果用php来表示:

function F(x, y)

那么x,y物理上在哪呢?思路推导到这里。"存储"的概念就来了:存储,就是存放计算所要操作的数据的所在。

中央处理器

下面一个问题:一个具体的计算(也就是 F 函数)怎么表达?

逻辑上来看,无论多复杂的自定义函数,都可以用这几种元素来定义:

内置函数:比如加减乘除等;
循环和条件分支;
子函数(也就是自定义函数)。

这样一来,对于任意一种具体的运算(自定义函数)来说,都可以用一组指令序列来表达。

那么,函数F物理上在哪里呢?以指令序列的形式放在存储里面。所以存储不止要放计算的数据,也要放计算本身。
只是,存储里面存放的只是数据。要理解这些数据背后的行为,才能称得上是真正的”计算”。而这个执行者,就是中央处理器(CPU)。
有了中央处理器+存储,就可以任意的支持计算了。

输入输出设备

只是,如果只有中央处理器+存储。就好比一个人只有大脑没有四肢五官。尽管可以很聪明,但是无法展示出来。这时候就需要与外部做交互。 输入输出的能力也就应运而生了。当然,这个时候就需要”“中央处理器”有数据交互(IO)的能力了。

结论

所以,计算机可以被看做由"中央处理器 + 存储 + 一系列的输入输出设备"构成的。

冯·诺依曼体系

大家都知道,冯·诺依曼被称为”计算机之父”。
为了实现“解决一切可以用‘计算’来解决的问题”这个目标,冯·诺依曼引入了三类基础零部件:

中央处理器;
存储;
输入输出设备。

这正好对应了我们的推导结果。

其他基本元素

有了基础计算机体系之后,我们就可以编写软件了。

当然我们遇到的第一个问题是直接用机器指令编写软件太累,而且这些机器指令像天书一样,让人难以理解和维护。所以编程语言和编译器就出现了。

在编写软件不是问题时,我们遇到第二个问题:多个软件在同一个电脑上怎么共处。多个软件大家往同一个存储地址写数据冲突了怎么办? 有的软件偷偷搞破坏怎么办??? 于是:操作系统就出现了。