计算机诞生记
2021-03-14
作为业内人士,对这个行业的历史知之甚少,只知道 冯.诺依曼,阿兰.图灵这些名字,和他们的一些事迹。今天网上看了一些资料,对计算机发展史做了个大致了解。
0算盘
人类追求自动计算的梦想很久以前就开始了。
最早辅助计算的工具是算盘,这算不算最早的计算机?我觉得不算,算盘本身没有什么自动化能力,完全靠人一步一步处理。
用专业语言描述就是不可编程,不能将一个新的流程注入,和计算机的思想相去甚远。
1莱布尼兹
莱布尼兹发明二进制,为后来计算机也做出了贡献,但这只是间接贡献。因为电子电路用二进制恰好合适。
后来发展的布尔代数也是计算机的理论基础。
2提花机
中国汉代的提花机,在传入欧洲后,但操作非常复杂,没有几个人会用。
在工业革命中,1801年,法国人雅卡尔发明了雅卡尔织布机,可以根据穿孔卡片自动编制花样。
3数学家巴贝奇
英国数学家皇家学会会员巴贝奇正在研究自动计算,最初目的是编制数学表(比如正弦、余弦表),受雅卡尔织布机启发,在1836年发明了可编程计算机:分析引擎。
支持三种卡片:运算卡片(指令)、变量卡片、常量卡片
当时是机械时代,这个机器在工程上难度很大,机械零件、齿轮精度要求高,靠人力驱动。最终失败,理论可行,工程不可行。
现代有好事者根据巴贝奇图纸做出了分析引擎,因为现代机械工艺已经大幅改进,可以满足要求了。
Ada的贡献
巴贝奇研制计算机的过程中,还找了一位女士给这个机器编程。名字叫Ada(有个编程语言就叫Ada),她的父亲是英国诗人拜伦。在Ada很小的时候抛弃了母女两人。所以母亲不让女儿学习文科,就让Ada跟着巴贝奇学数学,Ada就成了世界上第一位程序员。Ada深入思考了软件问题,提出了通用算法的概念,计算机能够帮助我们做“知道如何让它去做的”任何事情。这个思考很有前瞻性。
Ada在37岁英年早逝,可惜了。
4图灵机
巴贝奇发明计算机100年后,1936年,同在英国,图灵发布了一篇划时代的论文《论可计算数》,描述了一个抽象模型:图灵机
一条长长的纸带穿过一个神奇的机器,机器从指令表读取指令,决定如何操作纸带上的数据(左右移动纸带),这样就可以实现对可计算数的任何计算,这就是一台可编程的万能机器。今天的CPU就是按这个机制来运转的。
今天计算机界的诺贝尔奖就是:图灵奖,用来纪念这位伟人。
5马克一号--实现了巴贝奇的梦想
大约从1940年开始,美国开始新一轮对现代计算机的探索。
马克一号是哈佛大学和IBM联合投入研发,背后的伟大人物就是霍华德·艾肯。在哈佛读书的时候他想到了自动计算,走上了制造计算机的这条路。他曾经自己设计方案自动计算,后来被否决了,没有行通。
巴贝奇去世之后,他的儿子把巴贝奇的一些资料和研究成果送给哈佛大学。当艾肯研究自动计算的时候,有人向他推荐了巴贝奇的资料。 艾肯拿到这些资料如获至宝。我们说现代计算机的发展一定程度上是一脉相承的。1836年巴贝奇做了实质性的突破,巴贝奇去世之后,他那些资料被他儿子带着漂洋过海传到了美国。霍华德·艾肯又接过了这个接力棒来研究马克一号。
接下来,艾肯按巴贝奇的思想设计了马克一号。 时间已经过了大约一百年,电的技术已经比较发达了,制造的能力跟一百年前也完全不同了,而且艾肯又得到了IBM公司的大力赞助,所以霍华德·艾肯在用一百年后的制造技术重新把巴贝奇规划的分析引擎做了一次大规模的实现。
马克一号推出的时候,它是世界上算力最强的计算设备,或者说马克一号的机房是当时全世界上算力最强的超算中心。当时美国在研究原子弹,冯·诺依曼参与了原子弹的研究并且使用马克一号做了很多计算。因此,马克一号对原子弹的研究做出了直接贡献。而原子弹的研究成功,快速的结束了第二次世界大战,所以今天回顾起来,马克一号也是对人类历史做出了突出贡献。
从计算机科学的角度来说,马克一号进一步验证了巴贝奇最初的设计是合理的,基于卡片的这种思路不仅理论上是可行的,而且可以达到比较好的工程上的实用性。
马克一号也是现代计算机的第一次大规模探索,通过这次大规模的探索也为接下来的ENIAC成功奠定了基础。马克一号没有太多理论上的突破,它就是巴贝奇的原始思想。
艾达提出的了怎么调子程序,怎么做循环。马克一号是非常原始上的非常简单的一个实现。在马克一号种, 如果要调一个子程序,那就把子程序的所有卡片直接连进来,如果我们要调用两次,那就把这个函数的卡片复制一份,因为当时IBM已经有非常成熟的各种卡片处理机,做卡片的复制、卡片的自动整理,IBM标准的101卡片,已经非常成熟,或者说在当时的卡片处理技术已经很牛了。
所以马克一号用很原始的方法解决了循环和函数调用问题。用今天的话来说,相当于在编译器做展开,我要调子函数,直接把子函数的卡片连过来、搬过来,物理上连起来。
6ENIAC--速度提升
马克一号的成功很鼓舞人心,后来美国的陆军也开始研发现代计算机,开始新一轮的创新,那就是我们大家都知道的ENIAC。
ENAIC在1945年左右开始投入使用,对氢弹的研发起到了直接贡献。
ENIAC后来搬到了美军的一个陆军基地——艾伯登试验场,为美国的武器研发和冷战时代做了贡献.
ENIAC的可移动机柜
ENIAC在调用子函数方面,也是比较原始的方法,但是它做了一些改进。比如说可移动机柜是专门用来方便做函数调用的,里面存放了经常使用的常量,以及经常使用的一些计算过程。因为这些机柜可以移动,这样就可以把里面的子函数更快的“连接”到主程序。
NIAC和马克一号很大的一个差异就是ENIAC的计算速度有非常大的提升,因为ENIAC不是像马克一号那样直接执行纸带上的指令。读卡片很慢的,因为读穿孔卡片要用机械装置,感知这个孔的位置,所以马克一号它的执行速度相对后来的计算机那肯定是太慢。ENIAC是直接用电信号来读程序或者读数据。
ENIAC的内存
ENIAC用的内存是基于电子管制成的。ENIAC有很多古怪的设计,它不是二进制而是十进制的。一个部件就是用来表达一位十进制数。ENIAC的内存十分昂贵,一位十进制数就要用这样很大的一个硬件来表达。
总内存按今天换算就一百个字节。
ENIAC编程
ENIAC是如何编程的?它的编程过程很有意思,ENIAC有很多累加器,此外还有时钟单元等,对ENIAC编程的基本思想是要用连线把它们连接起来,ENIAC的出资方是美国陆军,美国陆军正是为了计算弹道参数来研发自动计算机器的。ENIAC的编程方式是把各个机柜的各个部件连接起来。
首先要有聪明的大脑,想象出来怎么连线才能完成一段程序,计算出线的连接方案之后,还需要有有人拿着接线图,两个人配合工作,一个人看图,另一个人做连线工作。当时负责ENIAC编程工作的有六位女士,在今天被称为“埃尼亚克六朵玫瑰”。
ENIAC有一个主脉冲单元,也叫发起单元。一旦把ENIAC程序的连线都连接好之后,按下发起单元的开关,电路脉冲就开始跑,一个个脉冲开始激发,每一次脉冲激发到一个累加器,完成一个动作。所谓的“指令”也是靠不同形式的脉冲来表达的。所以这样的不同连线连好之后,脉冲信号就顺着连线跑起来了,当脉冲信号把设计的整个线路全部跑一遍之后,就可以认为程序执行好了。
这是很独特的设计思路,其优点是速度非常快,所以ENIAC比同时代的马克一号快很多倍,它们的速度是不同数量级的。因为马克一号执行的是纸带上的程序,速度很慢,稍后我们会通过一张照片再描述。
7 路在何方?
马克一号把巴贝奇的设计做了一次完全的实现,把指令放在穿孔纸带上,把要处理的数据放在数据卡片上。马克一号代表今天的哈佛架构,霍华德是哈佛大学毕业,所以把马克一号安装在哈佛大学,所以今天把马克一号的架构称为哈佛架构。
哈佛架构的典型特征是保存了巴贝奇最初的设想,代码和数据严格分离。
马克一号的问题是依靠机械来旋转纸带的计算速度太慢,而ENIAC彻底改变了马克一号的思路,直接用电信号(电路连接)来表达程序,脉冲信号在不同机位、不同电路上激发、执行。它可以做循环,循环的实现也很简单,把信号再引回给输入就可以实现循坏。但是程序表达太不直观了,部署程序也太慢了,调试也是大问题。
截止到1944年底到1945年左右,现代计算机就发展到这样的阶段。沿着巴贝奇等人的思路,马克一号和ENIAC已经做了两次大规模的实践。此时就产生了一个问题:未来的发展到底应该像马克一号那样把指令都放在卡片上,还是应该像ENIAC那样把指令部署在电路上?由于ENIAC把所有的东西都依靠电路来实现,脉冲沿着电路遍历完后,整个程序就执行好了,因此ENIAC的这种编程方法叫做电路式编程。ENIAC的编程过程很难,虽然程序执行速度很快,但编程方法过于复杂。所以这两种方法都有很大的缺点。这个问题最终是如何解决?该天才的老冯登场了:
8 冯.诺依曼体系
ENIAC的赞助方是美国陆军,而陆军代表赫尔曼·戈德斯坦(Herman Goldstine)在很长一段时间里都属于艾伯登基地。1944年夏天,戈德斯坦生了一场病,出院后他去艾伯登火车站准备坐火车回到费城的摩尔学院,摩尔学院所属的学校是宾夕法尼亚大学。戈德斯坦在站台上等火车的时候,看到一个熟悉的身影,这个人就是著名的约翰·冯·诺依曼。
戈德斯坦在技术会议上见过冯·诺伊曼,而冯·诺依曼并不认识戈德斯坦,因为戈德斯坦只是军方代表,当时还不是非常出名的人物。但是戈德斯坦还是非常大胆的去跟名人打招呼,他主动走上前寒暄,介绍自己,两人聊的非常投机,相见恨晚。
聊天过程中两人非常自然的聊起双方各自在做的工作,戈德斯坦介绍了自己正在做的ENIAC项目,冯·诺依曼对这个项目非常感兴趣,用今天的话来说,他当时也刚好在为军方的计算问题寻找算力,因为各种武器的研发、包括神秘的“Project Y”,都需要大量的计算。冯·诺依曼曾经和马克一号合作做计算,但是由于马克一号的算力和速度都有问题,存在局限性,所以他一听到ENIAC这个项目就很感兴趣。而戈德斯坦也很想请冯·诺依曼给ENIAC做顾问,尤其是正在计划的ENIAC的下一代出谋划策,所以两个人一拍即合,戈德斯坦请冯·诺依曼到莫尔学院看一看。
于是,1944年7月,冯·诺依曼来到了莫尔学院。这时候ENIAC的只有三个机柜的原型已经建造好并可以工作,它被称为“小ENIAC”,可以用于做一些简单的验证。小ENIAC包含两个累加器、和一个时钟单元,时钟单元可以发起脉冲,驱动电路工作,累加器可以做一些简单的运算。
从此冯·诺依曼就成为莫尔学院的常客,每周都去莫尔学院参与讨论,以顾问身份参与到EDVAC这个项目中。ENIAC从1941年开始设计,到1944年8月份的时候设计已经定稿,用今天软件工程里的话来说就是code freeze了,因此设计人员主要做的是思考ENIAC下一代的设计。ENIAC的下一代叫EDVAC,EDVAC的全称是Electronic Discrete Variable Automatic Computer,即电子离散变量自动计算机。1944年8月到1945年春天的这段时间,冯·诺依曼每周一次和莫尔学院的ENIAC研发者一起讨论下一代的EDVAC应该如何设计。
这场讨论十分重要,它集结了当时最顶级的计算机专家。这些“顶级大脑”有埃克特(左三),他是著名的电子技术专家,也是ENIAC的首席工程师;莫奇利(右二)也是长期思考计算机,是ENIAC的架构师;戈德斯坦(右一)本人是数学家,又是军方代表,从头到尾参与ENIAC项目,非常了解现代计算机; 阿瑟贝克(左一)是ENIAC的另一个工程师,也非常了解现代计算机。冯·诺依曼作为著名逻辑学家和数学家加入进来之后,进一步增强了这个讨论会的实力。
这些人聚在一起,每周“碰撞”一次,思考如何做下一代EDVAC,思考如何将以前的经验和不足用来改进下一代计算机的设计。在这场讨论中,现代计算机的架构逐渐由模糊变得清晰,一幅蓝图开始浮现在众人眼前。在每次的讨论中分为两派,一边是冯·诺依曼、戈德斯坦和阿瑟贝克代表哲学学派做抽象,另一边是埃克特和莫奇利,是ENIAC的实践家,两派进行碰撞,最后达成了比较一致的结论。
第一草稿
到1945年3月,摩尔学院的讨论会进入收尾阶段,需要把讨论的结果写成一篇文档。不知道冯·诺依曼主动请命还是其他人不愿写,总之最后是冯·诺依曼以顾问身份接下了写文档的这项任务。
冯·诺依曼在从费城到新墨西哥州的火车上,开始起草这篇伟大的文档。冯·诺依曼很快就交出了这份伟大的文档,这份文档的名字叫做《关于EDVAC报告的第一份草稿》,简称《第一草稿》。后来这个文档一直使用的是这个“第一草稿”,并没有“非草稿”的正式版本,可以算作世界上最重要的“草稿”态文档。
《第一草稿》的封面就包含了很多有趣的细节。首先,这里的作者写的是John von Neumann,因为此很多其他工程师对冯·诺依曼十分不满,因为EDVAC是大家集体讨论的结晶,但写出的文档却只有冯·诺依曼一个人的名字。
据说这份文档在冯·诺依曼写好后交给秘书打印出来
第一部分是定义,相当于今天的术语“定义”。
第二部分讲系统的主要部件,是整个文档最重要的部分。在系统的主要部件里面,冯·诺依曼定义了现代计算机的核心部件。2.1节介绍CA,CA即中央算数单元;2.2节介绍CC,CC是中央控制单元。我们今天通常把CA和CC做在一起,就是CPU。接下来的2.4和2.5都是关于内存的,2.6把CC、CA和内存放在一起讨论。2.7和2.8介绍输入输出,2.9节特地把内存M(memory)和外存R(outside recording medium,简称R)做了些比较,外存是指磁带、卡片等一些外部设备。
冯·诺依曼在《第一草稿》里没有画总的逻辑图,我们今天看到的冯·诺依曼架构的框图都是后人画的。CC和CA在一起,就是今天的CPU中央单元,右边是内存M,下面是外部设备,即输入输出。冯·诺依曼在《第一草稿》里非常精确的定义了这幅图中的每一个部件,而且明确了它们之间的相互关系。
内存中央化和存储程序
冯·诺依曼架构的第一个伟大意义是把内存中央化,内存中央化是指把内存提到了和CPU非常近的关键位置。在图灵的架构图里,我们是看不出内存和CPU的远近关系的。只知道图灵架构有一个计算单元,可以获取到指令,然后还可以操作一条纸带,至于细节部分图灵都没有写出来。马克一号把数据和指令严格分开,指令也是很慢的从纸带上读取,用今天的话来说是直接执行外设上的指令,速度很慢,因为外设的速度慢。冯·诺依曼的伟大之处在于他明确描述了内存的关键地位,把内存的地位上升到前所未有的高度,把它抽象成独立部件,凸显出它的重要。
《第一草稿》里有很多关键的字句,如“内存一定要速度快,而且一定要有一定的量”,意思是说内存不可以太小。从这些描述可以看出,冯·诺依曼非常深地思考了现代计算机到底应该如何工作的问题,而且设计出的架构是非常合理的,因为内存和外存的速度直到今天仍然是有很大差距的,冯·诺依曼架构解决了这个问题,把要急用的数据放到内存里。中央处理器只能直接访问内存中的代码和数据,如果要执行的代码一开始在外存中,要先转移到内存中去。这样可以让强大的CPU始终能从高速度的内存获取到要计算的指令和数据,如果需要访问外存,就通知外存把数据转到内存中,然后再给CPU用。
这个架构的变化较以前并不是一点,冯·诺依曼把这样的关键思想强调出来,让现代计算机走上了快车道。从此大家集中精力增大内存的量,提高访问内存的速度。直到今天,内存的数量和速度仍直接影响着计算机系统的速度和价格。
冯·诺依曼架构明确了CPU只执行内存里的程序。这样就解放了CPU的设计,不用再考虑如何执行外存的指令,因为处理器只执行已经加载到内存中的指令。
冯·诺依曼架构也明确了内存和外存的分工。外存具有持久的记忆能力,程序在不用的时候存到外存里,用的时候再分批读到内存中,因为这个特征,冯·诺依曼架构也被称为“存储程序”架构。
把程序保存在外存上这个思路和马克一号是一致的,因为马克一号的程序存储在纸带上。但ENIAC就不同了,它不能把程序保存在外存上,也不能从外存来加载程序。因为ENIAC的程序要先写在电路图上,再想办法布线,最后按下开关跑脉冲,程序不停的变化以后才完成一轮计算。所以ENIAC的指令不是以指令序列方式保存在存储里面,而是以电路形式来表达的。如果狡辩说指令流是保存在电路上的,但这种方式也太不直观了。这意味着ENIAC的编程方法难度太大,难以流行。
冯·诺依曼架构借鉴了马克一号存储程序的思想,同时又解决了速度的问题。平时把程序放在外存里,可以是纸带、磁带、磁鼓等各种形式,但用的时候程序一定要被读取到内存中。读到内存中以后,速度就飞快了。这样的计算机仍然有ENIAC的速度,同时又有马克一号的可读性。直到今天我们仍然是这样做的,定义好的程序先存储在外存里,运行的时候由操作系统的loader程序把它load到内存中,处理器始终是在执行内存里的程序。
第一个冯式架构的计算机出自剑桥,回到了图灵的故乡
由此,大家就开始根据《第一草稿》的设计,来实现第一台存储程序计算机。
关于ENIAC的设计思想和冯·诺依曼的这篇文档,到底是应该公开给全世界还是应该申请专利保护起来?ENIAC团队的不同成员有着不同的想法,莫奇利这样一心想创业的企业家的思路是要申请专利,别人不能使用。所以埃克特和莫奇利成立公司后,真的把EDVAC的设计申请了专利,也被批准了。但是这个专利在1970年左右被多家计算机公司联名起诉,又被撤销了。而冯·诺依曼和戈德斯坦这样的人物抱着开放的胸怀,认为解决计算的问题是全人类都需要的,这样的技术应该公开给全人类,大家一起推动这项技术的发展,推动人类文明进步。
冯·诺依曼和戈德斯坦的愿望成为后来的现实,现代计算机尤其是冯·诺依曼《第一草稿》成为人类的公共资产。第一台存储程序计算机在第一草稿发布后很快建成问世也和当时的开放思路有关。《第一草稿》在1945年发布之后,很快就传到英国,剑桥大学和其他机构的计算机研究者看了这个文档后脑洞大开,希望到美国来看一看。所以大约在1946年下半年,莫尔学院开设了计算机的培训学习班,有2个人特意从英国来学习。剑桥大学一位著名教授漂洋过海来莫尔学院参加了这个培训班,把整个冯·诺依曼架构的精华思想全都带回了欧洲。今天公认的第一台存储程序计算机是在英国的曼彻斯特大学最先开始运行的。
回顾整个计算机的现代历史,从欧洲萌芽,在美国经过马克一号、ENIAC实践后,由冯·诺依曼做了一次逻辑抽象,然后又传回到英国,开始了又一轮的实践。同时冯·诺依曼和戈德斯坦也在实现美国版的存储程序计算机,也就是EDVAC,最终也成功了。从此“存储程序”就成为衡量现代计算机的一个标准,计算机的设计到底是否符合存储程序成为一个重要指标,到了60年代存储程序成为事实标准。
这段历史很有意思,很多学者都在探讨,上图是美国UWM大学的一位教授和他发表的论文,探讨冯·诺依曼的“存储程序”定义到底意味着什么,或者说冯·诺依曼心中的存储程序到底是怎样的。但是他认真研读、找遍了《第一草稿》,发现冯·诺依曼当时并没有用到“存储程序”这个术语,这个术语是后来归纳出来的。在冯·诺依曼的《第一草稿》中经常被使用的是“code”这个单词,而不是“program”。冯·诺依曼的草稿里有“remembered code”,意思是计算机能够记住刚才执行的代码,记在内存中,内存就是记忆体。或者说冯·诺依曼是以“remembered code”来表达存储程序思想的,意思是计算机通过内存可以记忆执行(过)的code,这样在反复执行的时候速度就很快。
9 关于《第一草稿》的思考--巴贝奇-图灵-冯诺依曼的联系,这是很重要的传承脉络。
总的来回顾,到冯·诺依曼的《第一草稿》,现代计算机大局已定。到今天仍然是这样的基本架构,那么整个漫长的探索之旅到底有哪些联系呢?
从巴贝奇到图灵的联系是非常明显的,巴贝奇引入卡片来计算,图灵受卡片思想启发的痕迹非常明显,他把整个图灵机定义成一条长长的纸带,穿过一台神秘的机器,就可以完成任何可计算数的处理,也就是万能的一台机器。
图灵之后最重要的一位贡献者就是冯·诺依曼。冯·诺依曼和图灵间有没有关系呢?或者说冯·诺依曼是否是在图灵的基础上发明了冯·诺依曼架构、写出了《第一草稿》呢?
这个联系仍然是比较紧密的。冯·诺依曼比图灵大9岁左右,两人年龄差距不大,但冯·诺依曼成名早,二十几岁就在德国写了有关量子理论的一本著作(我们今天在规划下一代计算机时常提到量子计算),这本书奠定了冯·诺依曼的威望,所以冯·诺依曼到美国普林斯顿大学后很快就成为最年轻的教授。冯·诺依曼二十几岁就世界成名,而图灵虽然也是在1936年24岁的时候发表了《论可计算数》,但他的这篇文章当时没有被重视,很久之后才被世人重视,或者说被普遍重视是后来的事情。但我们并不排除冯·诺依曼是受到图灵的启发,因为图灵留学美国时就认识冯·诺依曼,冯·诺依曼更早到剑桥大学访问时就认识了图灵,两个人很早就相互认识。图灵发表的《论可计算数》和图灵机的概念冯·诺依曼都接触过,今天很多人也找到了证据,冯·诺依曼的演讲稿里就有关于图灵机的插图。
冯·诺依曼亲笔写给图灵的一封信,图灵在美国留学毕业的时候,冯·诺依曼已经是著名教授了,他还盛情邀请图灵留下来做自己的助理,给图灵开了500美金的工资,在当时是不低的收入。不过对冯·诺依曼来说这是比较轻松的一笔开销,因为他在很多机构里做顾问,仅顾问费每年的收入就很多。但图灵并没有留下给冯·诺依曼做助理,他保留着大英帝国的傲慢心理,不愿留在美国,最终图灵回到了英国,但是两个人一直保持通信来往。
从冯·诺依曼这封信可以看出两个人的关系仍然是很亲密的,落款也写了“希望可以再收到你的信”。这句问候大家也很熟悉,“I am sincerely your John von Neumann”。最后还意犹未尽,又写了“你可能需要你的手稿,我把你信中寄来的手稿又还回去了”。
现代计算机经过最后100多年的加速发展,从巴贝奇到图灵,再到冯·诺依曼,还是很有延续性的,他们都是在前一位的基础上,把自动计算再推上一个新的高度。
又过了近100年,计算机已经无处不在,感谢前人聪明的大脑,为后人开创了伟大的信息时代。