1
一次偶遇
1944年春天,戈德斯坦上校在阿伯丁火车站台上偶遇大神冯·诺依曼。
戈德斯坦壮起胆子,拘谨地和冯·诺依曼聊起来。
幸运的是,冯·诺依曼热情而友善,让戈德斯坦很放松。
当冯·诺依曼得知戈德斯坦正在宾夕法尼亚大学研制电子计算机,每秒可以进行333次乘法运算的时候,谈话的气氛骤然改变:
不再是轻松幽默的闲谈,更像是数学博士论文的口头答辩。
冯·诺伊曼参与了绝密的曼哈顿工程,原子弹内爆所需的大量计算让人望而生畏,所以他对电子计算机机感兴趣。
戈德斯坦顺水推舟,邀请冯·诺伊曼担任世界上第一台电子计算机ENIAC研制顾问。
此时ENIAC的研制已经进行了18个月,但是天才的冯诺依曼一上来就注意到了ENIAC逻辑设计有个大缺陷:需要手工调整电路线路,才能指挥近2万个电子管干活。
在和艾克特、莫奇利等人的讨论中,冯·诺伊曼等人找到了电子计算机关键的想法:存储程序。
2
存储程序
我在上学的时候一直不理解为什么叫存储程序,其实一个例子可以轻松说明它的概念。
假设我们要计算3*2+5,人脑是这么计算的:
3*2 = 6 , 把中间结果暂时记在脑子中,然后 6+5 = 11。
计算机会把3、2、5这三个数字保存在内存中,把计算过程的描述(指令)也保存在内存中,然后取出指令一条条运算:
简单来说,就是:
(1)指令也用数字的方式来表示
(2)和数字一样,指令也保存在存储器中
在我们现在看来,存储程序的概念非常自然,它就如同轮子的发明,一旦想到就不在困难。
但是,存储程序的伟大之处在于,它释放了计算机的巨大潜力,计算机不再是为了某一目的而构建的专有计算机。
各类“存储的”程序可以瞬间将一台用于文字编辑的计算机变成一台可以上网的计算机。
3
绝密程序
1946年4月,他们决定建造一个新的计算机EDVAC来实现这个想法。
受到二战结束和工人专业的影响,EDVAC直到1952年才建造完成,并投入弹道研究实验室使用。
EDVAC不但有架构和逻辑的改进(存储程序),还包含了高速串行存取存储器,存储容量高达“5.6KB”。
这样的计算机用来做数值运算肯定没问题,但是能不能成为一个通用的机器呢?它的指令集是否提供了让人满意的逻辑控制?
如果可以的话,存储程序计算机就可以进入更广阔的天地,比如商业处理。
冯·诺伊曼决定写一个程序,对EDVAC的能力做一个“测试”。
当时IBM有一个叫做IBM Collators的机器, 可以将两叠已排序好的卡片合并成一叠,当然最终的结果也是排序好的。
熟悉算法的同学立刻就会意识到,这就是“合并排序”中的一个步骤嘛!
IBM的这台机器给冯·诺伊曼提供了一个标准,他也选择了这个主题,写一个“合并”的程序,衡量下EDVAC逻辑控制和计算速度。
这个时候,计算机的研究涉及到军方和军事问题,都被列为机密。
所以在冯·诺伊曼留下的手稿中,依稀还能看到之前用铅笔写下的“绝密”字样。
基于当时 IBM 专用排序机器的工作方式,手稿中制定了以下合并方法:
假设我们有两个列表 x 和 y,每个列表包含已排序的记录。
n' 和 m' 分别是当前正在考虑合并的 x 和 y 列表中的记录的位置指针。
手稿中根据合并过程的状态分为四种情况:
情况 (a) 两个列表都有剩余记录 (n' < n, m' < m), 这种情况有两个子情况:
-
(a1) key(x_n') ≤ key(y_m'):如果 x 的当前记录小于等于 y 的当前记录:选取 x 的这条记录,然后 x 的位置指标 n' 增加 1。
(a2) key(x_n') > key(y_m'):如果 x 的当前记录大于 y 的当前记录:选取 y 的这条记录,然后 y 的位置指标 m' 增加 1。
情况 (b) 只有 x 列表有剩余记录 (n' < n, m' = m):操作与子情况 (a1) 相同,继续选取 x 的记录,n' 增加 1。
情况 (c) 只有 y 列表有剩余记录 (n' = n, m' < m):操作与子情况 (a2) 相同,继续选取 y 的记录,m' 增加 1。
情况 (d) 两个列表都没有剩余记录 (n' = n, m' = m):这标志着合并过程的完成。
这段描述看起来很复杂,其实就是一个合并排序中“合并”的过程,这个动图解释得很清楚:
冯·诺伊曼后来说到:“EDVAC上的合并程序,确实比IBM专用排序机要快,它的控制逻辑让人满意......根据现有的证据可以得出结论,EDVAC 几乎是一台‘通用’机器。”
4
尾声
1957年,冯·诺伊曼因癌症不幸去世,年仅53岁。
十年后,EDVAC早已不在是军事机密,写下《计算机程序设计艺术》的算法之神高德纳在整理合并排序起源的时候,发现了冯·诺伊曼的手稿(一直被戈德斯坦保存者)。
高德纳特别写了一篇论文《Von Neumann's First Computer Program 》(冯·诺伊曼的第一个计算程序)来介绍冯·诺伊曼的贡献。
由于冯·诺伊曼的程序看起来特别像数学公式,像这样:
高德纳非常“贴心”地把它转换成了“容易理解”的汇编:
如今,合并排序已经成为算法教科书必备的内容(就是似乎不怎么受待见)。
最后,再次向伟大的冯·诺伊曼致敬,他为计算机确定了“存储程序”的思想,并且亲自用一个算法验证了它,从而开启了电子计算机产业,让我们能够在这里混碗饭吃。
后记:这篇文章来自于dingtingli的投稿,我做了修改,结果改着改着完全偏离了原文的重点,想看原文的可以关注dingtingli 的公众号。