浅谈冯诺依曼结构

我第一次接触冯诺依曼结构大概是在学《计算机组成原理》这门课的时候,当时老师在讲解计算机硬件组成时,直接就提到了现代计算机基本结构形式是冯诺依曼结构,先说明了它的先进性,例如:第一次采用二进制作为数制基础、提出了存储程序和程序控制的概念等等,并且对其五大组成部件进行了简要分析。后续这门课的讲解也主要围绕这五大部分进行。此后的很长一段时间里,我对冯诺依曼结构的理解止步于课本,没有更深入的了解。直到昨天,我脑袋里突然闪过两个问题:“在冯诺依曼结构提出之前的计算机都是什么样的?”,“冯诺依曼结构的先进性体现在什么地方?”。今天这篇博客将从这两个问题入手,认真分析冯诺依曼结构的前世今生。

早期的计算设备

关于“现代计算机”概念的提出,最早要追溯到1834年。在英国有个发明家叫做查尔斯·巴贝奇,他在1822年用机械装置完成了第一台用于数字计算的差分机,运算精度达到了小数点后六位。后来他继续潜心研究,在1834年提出了更为先进的“分析机”概念,在分析机的设计中,就已经有了现代计算机的基本结构。可惜因为当时的制作工艺水平不够,分析机的设计没有最终成型。

差分机复原图

第一台电子计算机

1937年,实体计算机有了更新的发展,美国的约翰·温森特·阿塔纳索夫教授和克里夫特·贝瑞设计了一台用于求解线性方程组的计算机,以设计者的名字命名,叫做阿塔纳索夫-贝瑞计算机(Atanasoff–Berry Computer),简称ABC机,于1942年成功进行了测试。这是世界上第一台电子计算机

冷门知识:最早的计算机长什么样,究竟是谁发明了第一台计算机?

其主要特点如下:

  • 采用电能与电子元件,在当时就是电子真空管
  • 采用二进制位, 而非当时常用的十进制位
  • 使用电容作为存储器,可再生
  • 不可编程,仅用于求解线性方程组
    • 正因如此, ABC机只能称为第一台电子计算机,而不能称为第一台通用计算机
    • 细心的家人可能已经发现,ABC机于1937年出现,远早于ENIAC的1946年。但是人们都倾向于将ENIAC认为是第一台现代意义上的计算机。我认为大概率是因为ABC机不够通用吧。
    • 但不可否认的是,ENIAC以及后续的EDVAC在ABC机上借鉴了很多东西,例如:基于二进制运算、可重复使用的内存、逻辑电路等等。

第一台通用计算机

随着二战爆发,大批科学家开始被召集起来做军事科技研发(战争推动科技进步的典型例子)。1942年,为了进行弹道研究,能够更快更准确的得到计算结果,以莫西利和埃克特为首的研制小组,在军方的支持下开始研发可以重复编程并且适用于多种场景的通用计算机。经过四年研发时间,终于在1946年2月14日年正式诞生,这台计算机被命名为ENIAC计算机。

这台机器相信大家都很熟悉了,它作为世界上第一台通用计算机,是一台图灵完全的电子计算机,能够重复编程、解决各种计算问题。能够编程是ENIAC与ABC机相比最大的进步,但需要注意的是:此编程非彼编程。现在我们眼里的编程可能是敲敲键盘、点点鼠标,最后一键编译执行。但在当时,ENIAC必须通过使用跳线接线进行编程。在编程时,程序的特定逻辑必须要直接连接到机器中。这意味着程序员需要通过人工移动插板上的电缆并更改控制输入响应的开关来执行编程。然后,ENIAC 在解决完这个特定的问题后,在执行另一个问题时还需要更改程序,再次手动连接机器的数据路径。这是一个相当费力的过程,需要几天时间进行必要的物理更改,此外,设计和编写新程序还需要数周时间。

小结一下,ENIAC虽然实现了可重复编程,但是它的程序还是体现在电路连接上的(数据则体现在纸带上),通用但费力。

冯诺依曼结构

扯了这么久,终于聊到冯诺依曼结构了。我们先看看这个结构是什么时间,在哪里提出来的:

“1945年,曾参与过ENIAC研发的冯·诺依曼和他的研发小组在经过一系列的讨论后,发表了一个全新的带有存储装置的计算机设计方案——EDVAC。”

“冯·诺伊曼结构这个词出自美籍犹太数学家约翰·冯·诺伊曼(John von Neumann)的论文:《EDVAC报告书的第一份草案》”

也就是说,冯诺依曼在研制ENIAC的过程中,意识到了这种结构的不足,并提出了自己的改进思路,应用到了EDVAC中。因此,深入了解ENIAC的优缺点对于理解冯诺依曼结构的先进性有着巨大的帮助。

提到冯诺依曼结构,想必各位家人的脑袋里会不由自主的浮现出两个知识点“计算机五大组成部分”“存储程序 + 程序控制”。没错,这正是它最最最大的亮点。那什么是存储程序 + 程序控制呢?即事先将编写好的程序和原始数据送入主存后再执行程序,一旦程序被启动执行,计算机不需要操作人员干预,自动完成逐条指令的取出和执行任务。此前的各种电子计算机,无论是ENIAC还是ABC机,它们的程序和数据都是分离的,且以不同形式呈现给计算机。其中,程序通过硬件电路连接体现,而数据通过纸带输入。很显然,这种架构存在非常严重的弊端,即不同的程序对应不同的硬件连接,给编程带来巨大困难。因此,冯诺依曼改变了程序的表现形式,由n种不同的电路连接 = n种不同的程序变为1种固定的电路连接 + n种不同的指令序列 = n种不同的程序,指令序列给出了程序的执行逻辑,想要让计算机执行不同的程序,只需更改存储的指令序列的内容即可。那不同的指令序列怎么映射到不同的电路逻辑呢?这就不得不提到计算机五大组成部件之一的控制器了,它会解析指令序列中的每条指令,根据其内容发出控制信号,通知其他各个部件分别执行什么样的逻辑,从而实现同一硬件 + 不同指令能够得到不一样的结果。这一针对程序表现形式的改变也使得程序能够和数据一样进行存储和传输。这就是所谓的存储程序 + 程序控制理解到这里,计算机五大组成部分的概念就呼之欲出啦,其中,存储器顾名思义就是存储程序和数据的部件,指导了计算机的执行逻辑;控制器解析代码,发出控制信号;运算器负责执行各种类型的逻辑运算,具体由控制信号决定;输入设备和输出设备则提供了人们与机器交互的渠道。

最后,我们再总结一下冯诺依曼结构的特点:

  • 提出了计算机的5大组成部件
  • 存储程序 + 程序控制的概念
  • 以运算器为核心的结构
  • 指令与数据同等地位存放在存储器中
  • 指令与数据都以二进制表示