1945年,冯·诺依曼首先提出了“存储程序”的概念和二进制原理,后来,人们把利用这种概念和原理设计的电子计算机系统统称为“冯·诺依曼型结构”计算机。
但以上概念是冯·诺依曼凭空想像出来吗,在这之前计算是什么样?如果把1945年记作电子计算机系统元年,公元前是什么样的?
代表工具:算筹、算盘、计算尺。
算筹:按一定规则排列小竹棒或小木棒,每个位置表示一位十进制数,相当于现在人在纸上写下一串串数字。数据就存储在了这些算筹上,而计算过程由人按十进制的计算规则计算。
算盘:可以说就是把算筹中的小木棒换成了一颗颗的算珠,规则只做简单变化。同样需要人来按这些计算规则完成计算。同样也是十进制。
计算尺:算筹和算盘上存储的数据都是确定的,而计算尺上的数据是不确定的,是按刻度来表示的,游标可以指向1,也可以指向2,也可以在1到2之间。同样需要人的操作来完成计算。
整个计算过程,工具充当的是存储的作用,一般存储两个数据(可以是多位数),通过人按一定规则执行,才能得出计算结果。
1642年,帕斯卡发明了人类有史以来第一台机械计算机——帕斯卡加法器。它是一种系列齿轮组成的装置,外形像一个长方盒子,用儿童玩具那种钥匙旋紧发条后才能转动,只能够做加法和减法。然而,即使只做加法,也有个“逢十进一”的进位问题。聪明的帕斯卡采用了一种小爪子式的棘轮装置。当定位齿轮朝9转动时,棘爪便逐渐升高;一旦齿轮转到0,棘爪就“咔嚓”一声跌落下来,推动十位数的齿轮前进一档。
继承于帕斯卡,德国数学家莱布尼茨在1674年制造出了一台更完美的机械计算器。新型计算器约有1米长,内部安装了一系列齿轮机构,他为计算器增添了一种名叫“步进轮”的装置。步进轮是一个有9个齿的长圆柱体,9个齿依次分布于圆柱表面;旁边另有个小齿轮可以沿着轴向移动,以便逐次与步进轮啮合。每当小齿轮转动一圈,步进轮可根据它与小齿轮啮合的齿数,分别转动1/10、2/10圈……,直到9/10圈,这样一来,它就能够连续重复地做加法。连续重复的计算加法是现代计算机做乘除法采用的办法。
随后又发展出了功能更全的机械式计算器,甚至能够进行十几位十进数的加减乘除。使用时需摇动手柄。机械计算器是极端密集和精密的仪器,密度和一块铁差不多,即使是“轻型机”都有整整15公斤。
机械计算器的巅峰:Curta。对比先前机械计算器,首先他提出了新的计算概念:补码。用加法来实现减法,简化了计算规则。极其精巧的设计,使机械计算器可以随身携带。
从15世纪开始,在航海方面,为了确定船只的位置,要求更加精密的天文观测。军事方面,弹道学成为研究的中心课题。准确时计的制造,运河的开凿,堤坝的修筑,行星的椭圆轨道理论等等。都需要复杂的计算来完成。这也促使了机械计算器的发展。
这时计算器具备了存储与执行的功能。存储需要计算的数据;执行加减乘除等计算规则,且可以连续执行。注意这时也只能存储两个数据(可以是多位数)。
巴贝奇从法国人杰卡德发明的提花编织机上获得了灵感,1822年完成了第一台差分机。所谓“差分”的含义,是把函数表的复杂算式转化为差分运算。差分机设计闪烁出了程序控制的灵光──它能够按照设计者的旨意,自动处理不同函数的计算过程。
1834年,巴贝奇提出了一个更新更大胆的设计——通用的数学计算机。巴贝奇称它为“分析机”巴贝奇首先为分析机构思了一种齿轮式的“存贮库”,每一齿轮可贮存10个数,总共能够储存1000个50位数。分析机的第二个部件是所谓“运算室”,其基本原理与帕斯卡的转轮相似,但他改进了进位装置,使得50位数加50位数的运算可完成于一次转轮之中。此外,巴贝奇也构思了送入和取出数据的机构、以及在“存储库”和“运算室”之间运输数据的部件。他甚至还考虑到如何使这台机器处理依条件转移的动作。
阿达为分析机编制了一批函数计算程序。阿达开天辟地第一回为计算机编出了程序,其中包括计算三角函数的程序、级数相乘程序、伯努利函数程序等等。人们公认她是世界上第一位软件工程师。
现代电脑的结构几乎就是巴贝奇分析机的翻版。分析机同时具备了数据存储的概念(存储多个数据),计算的概念(加减乘除),条件执行的概念。从构思中分析,分析机可以完成自动计算,但执行计算还是需要人为的触发,未实现自动执行多个计算的功能。
到目前为止,计算用到的都是十进制。但二进制不是到了电子计算机时代才发明的产物。1679年莱布尼茨发明了一种计算法,用两位数代替原来的十位数,即1和0。并对其转换关系,以及计算规则进行了研究。
插曲:1701年莱布尼茨写信给在北京的神父Grimaldi(中文名字闵明我)和Bouvet(中文名字白晋)告知自己的新发明,希望能引起他心目中的“算术爱好者”康熙皇帝的兴趣。
阿塔纳索夫-贝瑞计算机(Atanasoff–Berry Computer,通常简称ABC计算机)在1937年设计,不可编程,仅仅设计用于求解线性方程组,并在1942年成功进行了测试。然而,这台计算机用纸卡片读写器实现的中间结果存储机制是不可靠的。而且,在发明者约翰·文森特·阿塔纳索夫因为二战任务而离开爱荷华州立大学之后,这台计算机的工作就没有继续进行下去。ABC计算机开创了现代计算机的重要元素,包括二进制算术和电子开关。但是因为缺乏通用性、可变性与存储程序的机制,将其与现代计算机区分开来。这台计算机在1990年被认定为IEEE里程碑之一
1944年马克1号计算机正式运行。
1936年在哈佛攻读物理学博士学位的艾肯,需要计算非常复杂的非线性微分方程。几年后,通过巴贝奇和阿达的论文,并由IBM出资建造马克1号。马克1号最关键的部件采用继电器组成,马克1号上安装了大约3000个继电器。继电器接通电路表示“1”,继电器断开则表示“0”。继电器能在大约1/100秒内接通或断开电路。为马克1号编制计算程序的也是一位女数学家格雷斯·霍波。
马克一号借由打卡纸读取、执行每一道指令。它没有条件分支指令。这表示需要复杂运算的程式码会很长一串。循环的完成需利用打卡纸头尾相接的方式。这种程式码与资料分开放置的架构就是众所周知的“哈佛架构”
1943年,此时正是二战时期,美国为了实验新式火炮,需要计算火炮的弹道表。需要进行大量计算。一张弹道表需要计算近4000条弹道,每条弹道需要计算750此乘法和更多的加减法,工作量巨大。
可以想象这样一个场景:一发炮弹打出去,100多人用一种机械计算器算个不停,还经常出错,费力不讨好。当时任职宾夕法尼亚大学莫尔电机工程学院的莫希利(John Mauchly)于 1942年提出了试制第一台电子计算机的初始设想——“高速电子管计算装置的使用”,期望用电子管代替继电器以提高机器的计算速度。
美国军方得知这一设想后,拨款成立了一个以莫希利、埃克特(John Eckert)为首的研制小组。终于在1946年2月14日,世界上第二台电子计算机,世界上第一台通用计算机 (多个行业都可以使用)埃历阿克”(ENIAC,译成中文是“电子数字积分和计算机”)诞生于美国宾夕法尼亚大学。
在ENIAC尚未投入运行前,冯·诺依曼就已开始着手起草一份新的设计报告,要对这台电子计算机进行脱胎换骨的改造。他把新机器的方案命名为“离散变量自动电子计算机”,英文缩写译音是“埃德瓦克”(EDVAC)。1945年6月,冯·诺依曼与戈德斯坦、勃克斯等人,为埃德瓦克方案联名发表了一篇长达101页纸洋洋万言的报告,即计算机史上著名的“101页报告”。这份报告奠定了现代电脑体系结构坚实的根基,直到今天,仍然被认为是现代电脑科学发展里程碑式的文献。
报告明确规定出计算机的五大部件(输入系统、输出系统、存储器、运算器、控制器),并用二进制替代十进制运算,大大方便了机器的电路设计。埃德瓦克方案的革命意义在于“存储程序”──程序也被当作数据存进了机器内部,以便电脑能自动依次执行指令,再也不必去接通什么线路。