冯·诺依曼结构:EDVAC 报告
1945 年在宾夕法尼亚大学完成的 ENIAC 是当时世界上最快的电子计算机:它用近一万八千只电子管,每秒做五千次加法。但要换一种计算,就得在面板上重新接线、重新拨动开关,这是一组程序员要干好几天的活。
ENIAC 的工程师 J. 普雷斯珀·埃克特和约翰·莫奇利已经在规划下一台机器 EDVAC,打算把程序存放在存储器里。冯·诺依曼开始参加他们的会议,并在 1945 年 6 月写了一份文本,用一种抽象的、几乎是生物学的语言,谈论“器官”和“神经元”,把小组的想法组织起来。
计算机的组成部分
《EDVAC 报告初稿》描述的计算机包括:
- 运算器,进行计算;
- 控制器,逐条读取指令并让它们得到执行;
- 存储器,同时存放数和指令,全都写成二进制数字串;
- 输入和输出设备。
决定性的新意在第 3 项。由于程序存放在与数据相同的存储器里,换一种计算就是改动存储器里的数,而不是改动导线。程序甚至可以计算并修改自己的指令。这就是 1936 年图灵的通用机的思想,落实到了电子管和水银延迟线上。
四行的程序
设想一个有八个位置的存储器,编号从 0 到 7,再加一个叫累加器的寄存器:
| 位置 | 内容 | 含义 |
|---|---|---|
| 0 | LOAD 5 |
把位置 5 中的数放进累加器 |
| 1 | ADD 6 |
把位置 6 中的数加到累加器上 |
| 2 | STORE 7 |
把累加器存入位置 7 |
| 3 | HALT |
结束 |
| 5 | 40 |
数据 |
| 6 | 2 |
数据 |
| 7 | 0 |
结果 |
控制器从位置 0 开始,执行一条,再转到下一条。三步之后,位置 7 中是 $42$。指令和数据并排存放:没有什么能阻止一条 STORE 1 指令覆盖第二条指令,而这正是一个程序能够生成另一个程序的原因。
是谁发明的?
这份报告本来只在参与者之间传阅,但赫尔曼·戈德斯坦把它广泛分发了出去,封面上只有冯·诺依曼的名字。埃克特和莫奇利在冯·诺依曼到来之前就讨论过存储程序,他们觉得自己的成果被窃取了;而且由于这份文本被视为已经公开发表,他们失去了为这一想法申请专利的机会。这场争执毒化了小组,小组在 1946 年解散。今天的历史学家一致认为,这个想法是集体的成果,冯·诺依曼的功劳在于把它描述得清晰而一般,从而让它传遍了世界。
练习:跟踪程序
把位置 5 和 6 的内容换成 $17$ 和 $25$,把位置 1 的指令换成 SUBTRACT 6。位置 7 最后是什么?
累加器先收到 $17$,然后得到 $17 - 25 = -8$,存入位置 7。同一个电路仅仅因为存储器里的数变了,就做了另一种计算,一根导线都没碰。
练习:修改自己的程序
在 HALT 之前加一条指令,让程序下次运行时也把位置 7 加到自身上。为什么只有存储程序才能做到这一点?
例如,在累加器中存有 ADD 7 的代码时执行 STORE 1,就会改写第二条指令。程序下次运行时,位置 1 上写的就是 ADD 7。这之所以可行,只是因为指令是存放在与数据相同的存储器里的数;在 ENIAC 中,程序在导线里,程序本身无法改写它。
来源: John von Neumann, First Draft of a Report on the EDVAC(1945)· Herman Goldstine, The Computer from Pascal to von Neumann(1972)· George Dyson, Turing’s Cathedral(2012)· John Backus, “Can programming be liberated from the von Neumann style?”, Communications of the ACM(1978)。
约翰·冯·诺依曼的全部主题 · ← 希尔伯特空间中的量子力学 · 归并排序:靠合并来排序 →
图片来源.