
1.4.2 自动计算机
有一句玩笑话是“懒惰使人进步”,是说为了做事情能够更省力气,人类总会发明出更加高效、便捷的工具。在低效率的状态下,过分努力并不可取,下面通过计算简单数学问题的范例来加以说明。
1个问题:问题很简单,我只要动笔算算,很快就算出来了。
10个问题:问题很简单,数量也不多,动笔算算也不难。
100个问题:问题很简单,但是数量有点多,需要花些时间。
1000个问题:问题很简单,但是数量太多了,我可能需要花一整天的时间去计算这些问题,而且可能会因为精力下降而出错。
10000个问题:天啊!能不能找别人帮我算啊?
对于简单的数学运算,人类使用竖式计算法可以应付的规模有限,如果运算的规模继续扩大,则是时候考虑开发一套更加高效的计算方法了,而利用机器解决大量简单、重复的计算是我们常用的手段。
通过了解历史可以知道,社会发展对大量简单、重复的计算的需求巨大,伴随着机械技术的不断发展,有人开始考虑能不能制造出一种机器,可以代替人类完成简单运算,这样不但运算速度会更快,而且出错的概率会更小。
17世纪,齿轮连杆等机械零件已经普及,法国人帕斯卡(Pascal)在19岁的时候,利用一些零件为他的父亲设计了一部机器,只要转动拨盘输入待运算的数,并且转动一旁的摇杆,里面的齿轮就会完成加法运算,将答案显示在拨盘上。这就是自动计算机的雏形。图1-12给出了帕斯卡的肖像,以及基于他的想法所发明的Pascaline机械计算机的照片。为了纪念帕斯卡的贡献,有一种比较古老的计算机程序语言是以他的名字命名的。
相比于之前的计算辅助工具,帕斯卡发明的计算机已经有了本质上的改变,这种计算机不仅可以存储数据,而且将计算法固化在了计算机内部。这样一来,人类就不需要再记忆各种口诀或者心法,只要提供需要计算的原始数据和相应的计算要求,计算机就会自动给出对应的计算结果。这是质的飞跃,但这种计算机只能完成固定的工作,不能改变程序,即not programmable。因此,我们也称这种计算机为不可变程序的机械计算机。

图1-12 帕斯卡和Pascaline机械计算机
17世纪,数学也获得了很大的发展。牛顿和莱布尼兹发明了微积分计算法,很多原本很复杂的问题都可以转化为简单问题的组合,这使得自动计算机的实用价值更加突显。巴贝奇在22岁时从剑桥大学获得数学博士学位,为满足社会对大量计算的需求,他毕生都在为制造出高效的计算机而努力。大约在1832年,他领悟到,一台理想的计算机必须能够依据指令改变其执行的程序,这就是可变程序的概念。他一生为此做了大量的工作,留下了300多张详细的设计图、6000多页笔记,以及很多半成品,但因为当时的机械技术还不成熟,所以他生前未能如愿。基于巴贝奇的工作,后人利用摩擦的轮盘制造出了类比型计算机。到了20世纪,则出现了电机计算机,即利用由电力驱动的零件制造了可变程序的机械计算机。
可变程序的机械计算机可以存储数据,也可以改变指令,计算机根据指令进行不同的运算程序,即programmable。这又是一次质的飞跃,但这些指令必须由外部依次输入到计算机内部进行运算,计算机本身还不能存储这些指令。ENIAC继承了巴贝奇的基本设计理念,莫希利和埃克特利用电子管代替机械零件来表示数字并进行运算,这在介质上有了进步,使计算机的计算速度大幅提高,但在设计理念上还停留在机械计算机的时代。
最终,冯·诺依曼给出了计算机设计的基本框架,而他的设计理念被沿用至今。首先,他建议改用二进制(Binary),电子元件的通电与断电状态刚好可以对应数字1和0,这样建立起来的表述法会最大限度地发挥电路[1]的优势;其次,程序(Program)和数据(Data)一样,都应该都存放在计算机内部,由此催生了我们现在熟知的存储器(Memory)。
自1945年年末到1951年,冯·诺依曼按照自己对计算机的理解制造出了IAS计算机。这台机器因其所在的研发单位而得名,即普林斯顿大学高等研究院(Institute for Advanced Study)的首字母缩写,有时它也被称为冯·诺依曼计算机,IAS计算机所使用的设计框架也被称为冯·诺依曼架构。如果说帕斯卡是“机械计算机之父”,那么冯·诺依曼则当之无愧地是“现代计算机之父”,直到如今(这个所谓的人工智能时代)所使用的计算机依然沿用冯·诺依曼架构。