现代计算机真正的鼻祖——超越时代的伟大思想

96
逸之 48d31e61 a03c 4506 81a2 d224ac0a2d8b
18.0 2015.12.14 09:40* 字数 6366

现今但凡对计算机历史有所了解的朋友,总能在第一时间想起一台叫ENIAC的电子计算机,总多少听闻过图灵、冯·诺依曼这样响当当的名字,却鲜有人知早在他们一个世纪之前,就独自开辟了现代计算机之路的传奇人物——巴贝奇。

查尔斯·巴贝奇(Charles Babbage 1792-1871),英国数学家、哲学家、发明家、机械工程师。

巴贝奇出生于英国一个富裕的家庭,父亲是银行家,所以他不愁吃不愁穿,一门心思钻研各种感兴趣的事物。他兴趣广泛,几乎无所不能,他首先是位卓越的数学家,担任过11年的剑桥大学卢卡斯数学教授席位(这是一项极高的荣誉,前后都是由牛顿、霍金这样的大神担任),是皇家天文学会的领导成员、皇家统计学会的创始人,在光学、大气观测、电学、磁学、密码学、地质学、运筹学等诸多领域都有建树,他甚至编写过世界语辞典、研究过哺乳动物的呼吸和脉搏、提高过蒸汽火车的速度、还在家里安装了世界上第一台空调系统……他仿佛已经干完了别人好几辈子才能干完的事,然而在其为计算机发展做出的贡献面前,这些五花八门的成就甚至还显得不值一提。

18世纪末,法国政府在开创米制之后,决定在数学中统一采用十进制,竟奇葩地想把原本90度的直角划分成100度、把原本60秒的1分钟划分成100秒,尽管从现在看来这样的想法绝逼是一种倒退,但他们在当时真就实施了。这一改制带来的不光是人们在使用时直观上的别扭,原本制作好的数学用表(如三角函数表)都需要全部重制。在上篇文章中,我们知道那个年代数学用表的计算全靠人力完成,所能用到的计算设备也相当简陋,只能做四则运算。法国政府将这项丧心病狂的工程交给了数学家普罗尼(Gaspard de Prony),普罗尼正头疼着要如何才能完成这项艰巨的任务,突然想起著名经济学家亚当·斯密(Adam Smith)的那本《富国论》,他决定采用书中提出的劳动分工的做法,将制表的工作人员分成三组:第一组由五六名牛逼的数学家组成,他们负责制定运算中所需的公式;第二组由九到十个擅长数学的人组成,他们负责计算出一些关键数据,并把第一组制定好的公式进行简化;第三组由约一百名计算人员组成,他们利用第二组提供的关键数据和公式,做最简单的加减操作就能得出最终结果。第三组的工作简单到什么程度,就是他们甚至都不知道自己正在算什么玩意儿,事实上他们的文化程度大部分都不高,里头好多都是理发师、失业人员什么的。可见即便文盲都能完成的计算,在那个时代还是得依靠人力去做。

而为了保证用表的正确性,普罗尼要求每个数至少算两遍,并且要在法国的不同地点用不同的方法计算。这项劳民伤财的工程整整进行了十年才完成,然而不幸的是,最终的表里仍然有错。说到这一点,可以说,那个时代基本没有一版数学用表是完全正确的,有些版本甚至错误百出,要知道数学用表出错有时后果会很严重,比如航海表一出错就可能直接导致船毁人亡。

巴贝奇在了解到普罗尼的事迹后泪流满面,决心要做一套完全正确的数学用表,为达目的,他尝试了各种减少错误的手段,比如调整纸张和墨水的颜色以提高数字的识别度,直接拿现有的多个版本的表进行誊抄、比对、让不同人员反复校对,在1827年出版了一个版本,结果里头还是有错。只要是人为的就没有完美的,巴贝奇彻底跪了,他发誓要造一台机器,让机器去生产数学表。

那就是史上著名的差分机。

差分机(Difference Engine)

其实早在巴贝奇出生前,有个叫米勒(Johann Helfrich von Müller)的德国工程师就提出了差分机的思想,但仅仅是提了一下,并没有进行具体设计和制造,他最终还是把研制差分机的历史重任让给了巴贝奇。

之所以叫差分机这个名字,是因为它计算所使用的是帕斯卡在1654年提出的差分思想:n次多项式的n次数值差分为同一常数。举个简单的例子(以笔者撰写该部分时的日期——12月12日——为例),对于函数F(x) = 12x+12,x取自然数:

一次差分定义为∆F(x) = F(x+1)-F(x)

对于一次多项式,每个相邻的x所对应的F(x)之差都是一个常数,这个常数很明显就是x的系数。那么二次多项式呢?依然以今天的日期(15年12月12日为例),对于函数F(X) = 15x^2+12x+12,x取自然数:

二次差分定义为∆F2(x) = ∆F1(x+1)-∆F1(x)

对于二次多项式,每个相邻的x所对应的一次差分之差都是常数,我们可以导出这一常数的通用公式:

怎么有种回到中学时代的赶脚……

在上述的例子中,a=15,确实二次差分常数为2a。三次、四次、乃至任意多次的多项式都遵守这样的差分规律。

差分规律是一项伟大的发现,有了差分,在计算多项式时就可以用加法代替乘法,我们只需要算出几个初始值,后头任意x所对应的F(x)值均可通过加法得出。仍以上面的二次多项式为例,根据x=0所对应的第一列中的数据,第二列(x=1时)的函数值可由第一列的函数值和一次差相加所得、一次差可由第一列的一次差和二次差相加所得,第三列(x=2)的函数值和一次差又可由第二列的相应数据相加所得,以此类推,我们能得到x任意取值时的F(x)。

学过高数的朋友应该知道,一个函数在满足一定条件的情况下可以用多项式逼近(幂级数展开),于是常用的三角函数、对数函数都可以通过多项式来计算的,而机械时期的计算设备最擅长的就是做加法,有了差分思想,巴贝奇看到差分机的前途一片光明。

即便是现今的看似功能强大的计算机也需要这样展开之后计算

从1812年到1822年,巴贝奇克服重重困难完成了一台可以计算六位数二次多项式的模型机,他给皇家学会的主席写信,希望政府可以出资,赞助他建造真正可用的大型差分机。政府也觉得这事儿很有意义,尤其对海军很有价值,于是在1823年拨款1500英镑,巴贝奇如鱼得水,号称只要两三年时间就能完工。谁知实行起来要比想象中困难得多,那个时代的机械制造水平实在落后,差分机是十分精密的仪器,巴贝奇跑遍了欧洲都没找到多少能用的零件,于是在制造差分机之前,他还要先想着怎么制造各类零件。在英国当时一个牛逼的机械师克莱门特(Joseph Clement)的帮助下,他们真的在提高机械制造方面下足了功夫,不但做出了差分机能用的零件,还培养出大批优秀的技师。本来这两人强强联合势必能把差分机做好,但是巴贝奇是个精益求精的人,经常改动设计方案,导致工程时常要返工,工作量大大增加,外加亲人的相继去世,后来又和克莱门特闹掰,到了1833年,十年都过去了,巴贝奇只做出了机器的一小部分,却已经花费了3万英镑(远超最初预算)。政府对巴贝奇大失所望,终于在1842年正式宣布不再出资,到头来巴贝奇给后世留下的就只有一个半成品,以及在1839年修订好的一大堆设计图纸,现存于伦敦科学博物馆。

伦敦科学博物馆·差分机设计图纸&半成品

值得一提的是,巴贝奇做不出差分机实在不是客观原因所致,与他同时代的瑞典人乔治·舒茨(Per Georg Scheutz)就根据他的设计在1843年做出了切实能用的差分机,巴贝奇倒是提供了不少指导和帮助,也算是了却了自己一桩心愿吧。

乔治·舒茨和他的差分机

150年后,为了纪念巴贝奇200年诞辰,从1989到1991年人们根据巴贝奇的设计图纸建造了第一台真正的巴贝奇差分机,机器完美运行,工程师们惊奇地发现,巴贝奇的图纸里只有极少的错误,而且这些错误八成是当时为防止图纸被盗用而刻意为之的。这台差分机被保护在伦敦科学博物馆的玻璃柜里,后来又造了一台,放在美国硅谷的计算机历史博物馆,每天由导游给参观者讲解和演示,人们得以近距离膜拜。

伦敦科学博物馆·史上第一台巴贝奇差分机

实景地图展示平台xRez为计算机历史博物馆的差分机做了超高清摄像,机器的各个部位都能看得非常清楚。

计算机历史博物馆·史上第二台巴贝奇差分机
逮到一张气势恢宏的……背面高清图

我们接着来了解一下差分机最简单的工作原理。在巴贝奇1839年的设计中,差分机可以支持七次多项式的计算。以F(x) = x^7+x为例,其7次差分值为常数5040。

数据来自《Babbage's Difference Engine No. 2, Part 1: The method of finite differences》

由前文可知,表中任意一列的数据均可根据其前一列的数据计算得到,为此需要的初始数据就是第一列,计算下一列函数值的过程分7步:

F(x)+∆F1(x) = F(x+1) 下一列的函数值

F1(x)+∆F2(x) = ∆F1(x+1) 下一列的一次差分值

……

F6(x)+∆F7(x) = ∆F6(x+1) 下一列的六次差分值

巴贝奇优化了算法过程,让每列数据成对成对地并行相加,把7步压缩成两步,可以更快地得到结果,但为此付出的代价是,需要事先计算更多初始数据:

在本例中需要的初始数据是这些

背景色相同的四对数据分别相加,所得结果分别为下一列对应的值:

这四对数据分别是函数值+一次差、二次差+三次差、四次差+五次差、六次差+七次差,这一步得到了函数值F(5)

而后是另外组合的三对数据分别相加:

这三对数据分别是一次差+二次差、三次差+四次差、五次差+六次差,这一步没有得到新的函数值

以此类推,无穷尽也:

这一步得到了函数值F(6)
按照这种方式,每两步产生一个新的函数值,而原本的差分算法需要7步。

由于每次参与计算的都是函数值和1~7次差分值的最新值,于是仅需相应的8个计数器。巴贝奇设计的计数器由31个计数轮垂直叠加而成,即支持31位十进制数:

图片来自《Babbage's Difference Engine No. 2, Part 2: The Calculation Section》

加上传动装置和进位装置,就成了这样一副丧病的模样:

图片来自《Babbage's Difference Engine No. 2, Part 2: The Calculation Section》

巴贝奇使用梯形的传动轮实现两个计数轮之间的相加,由于有梯形齿,传动轮可以同时带动两个计数轮,也可以只带动一个。于是在进行两数相加时,传动轮先顺时针旋转,将右侧计数轮上的数字加到左侧轮上,而后上升一段距离,逆时针旋转相同度数,将右侧计数轮的示数还原到原来的位置。

图中以3+4为例,加完之后右侧计数轮数字归零了,需要靠传动轮将其还原为4。(原图来自《Babbage's Difference Engine No. 2, Part 2: The Calculation Section》,S7技术支持)

仔细观察可以发现,这两个轮子上的数字排列顺序是相反的。在两轮相加的过程中,左侧轮作为累加轮朝数值增大的方向旋转,而右侧轮作为加数轮则朝数值减少方向旋转。在巴贝奇改进的并行差分算法中,两个步骤交替进行,同一个计数轮需要交替充当累加轮和加数轮的角色,于是当机器运行起来,这些齿轮需要正反方向交替旋转。

图片来自《Babbage's Difference Engine No. 2, Part 2: The Calculation Section》

差分机的进位机构比较复杂,简单地说,每个计数轮都有一个针对高位的“进位提示器”,当计数轮从9转到0,其对应的“进位提示器”就被拨到“需要进位”的状态,每次计算,计数轮都要转动两次,第一次是每位数相加,第二次是按照“进位提示器”进行进位。我们直观地感受一下连续进位是什么样子:

图片来自《Babbage's Difference Engine No. 2, Part 2: The Calculation Section》

最后让我们来欣赏一下差分机整个运行起来的样子:

图片来自《Babbage Difference Engine in Motion》
居然还有人用乐高积木做了差分机模型,而且居然还能运行。(图片来自《Babbage Difference Engine made with LEGO》)

分析机(Analytical Engine)

尽管没能亲手实现差分机,但巴贝奇并不会气馁,或者说他本来就是根本停不下来的那种人。明知实现不了,巴贝奇仍在一刻不停地改进着自己的设计,直到有一天,他构思出了一种空前的机器——分析机,正式成为现代计算机史上的第一位伟大先驱。

1834年,分析机概念诞生之际,巴贝奇自己都为之感到无比震惊。在此之前,任何一台计算机器都只能完成其被预定赋予的计算任务,要么是简单的加减乘除,要么像差分机那样只能做差分运算,它们都属于calculator,而分析机才是真正的computer,它不局限于特定功能,而竟然是可编程的,可以用来计算任意函数——现代人无论如何也无法想象在一坨齿轮上写程序是怎样一种体验吧!

巴贝奇设计的分析机主要包括三大部分:

1、用于存储数据的计数装置,巴贝奇称之为“仓库”(store),相当于现在CPU中的存储器,这部分是从差分机上的计数装置改进而来的,我们很容易想象它的模样;

2、专门负责四则运算的装置,巴贝奇称之为“工厂”(mill),相当于现在CPU中的运算器,这部分的结构相对复杂,巴贝奇针对乘除法还做了一些优化;

3、控制操作顺序、选择所需处理的数据和输出结果的装置,巴贝奇没有起名字,由于其呈桶状,我们可以叫它“控制桶”,控制桶显然相当于现在CPU中的控制器。

以上三部分,加上巴贝奇并没有疏漏的输入输出设备,我们惊讶地发现,分析机的组成部分和现在冯·诺依曼架构所要求的五大部件一模一样!

巴贝奇另一大了不起的创举就是将穿孔卡片(punched card)引入了计算机器领域,用于控制数据输入和计算,从那时起,到第一台电子计算机诞生为止,期间几乎所有的数字计算机都使用了穿孔卡片。穿孔卡片本身并不是巴贝奇的发明,而是来自提花机。

提花机是我国古代用以制造丝锦的一种织机,最迟在殷商时期就已出现,后经丝绸之路传入阿拉伯国家,再传到意大利和法国。以其中功能最强的大花楼提花机为例,长约一丈六尺,高约一丈五尺,高起的部分就叫花楼,织锦过程需要上下两人配合完成。

《天工开物》中的花机图,在南京云锦研究所可以看到实物。

织锦的原理其实十分简单,就是通过一排排、一列列纵横的丝线相互交织而成,纵向的叫经线,横向的叫纬线,要织出花纹,就需要将部分经线提起,让纬线通过梭口,没有被经线压住的纬线部分就可以形成花纹。坐在花楼上的提花工就专门负责提起这些经线,花楼下的织花工则负责抛梭引线。

(图片来自《霞蔚天成 上》)图中黄色的就是经线,部分经线被提起,梭口一目了然。

由于每织一行花纹,所要提起的经线都不尽相同,那么问题就来了,经线那么多,织完一片锦前后要提那么多次,提花工怎么记得住每次提哪些经线呢?传统的方式是根据想要织出的花纹预先编织花本,就是把“每次需要提哪些经线”这一信息编织到到一块松松的网兜里,提花工根据花本提花。

花本上记录了每一纬需要提起哪些经线(图片来自《中国丝绸通史》)

提花机传到西方后,十九世纪初,一个叫贾卡(Joseph Marie Jacquard)的法国人开始使用穿孔卡片来保存花本,将卡片置于经线上方,其上方密密麻麻的针尝试穿过卡片,卡片上没有孔的地方针就被挡住,卡片上有孔的地方针就可以下探勾起经线,原本提花工的任务就可以完全交给机器自动完成,从此提花机就只需要一个工人操作了。

穿孔卡片的提花原理

巴贝奇在一次巴黎展览会上看到了贾卡的提花机,对其印象十分深刻,由于一直在研究计算机器,自然想到可以把穿孔卡片也应用到分析机上。于是分析机中的输入数据、存储地址、运算类型都使用穿孔卡片来表示。在机器运行时,卡片上有孔和无孔的地方会导致对应的金属杆执行不同操作,可编程性由此体现。下图可以直观地展现这一原理:

无孔的地方会顶住探针(图片来自《Punchcard and rod controller》)

整个分析机就是在类似这样的齿轮和拉杆作用下实现可编程运算的:先从数据卡片读入数据到存储器,再将存储器中的数据传输到运算器,运算器算完后又将数据传回存储器。过程有点复杂,感兴趣的朋友可以欣赏一下Youtube上Sydney Padua的视频。

可惜的是,巴贝奇穷其一生也没能真正把分析机做出来,留给后世的又是一台模型机和两千多张图纸,以及这样一段遗言:

如果一个人不因我一生的借鉴而却步,仍然一往直前制成一台本身具有全部数学分析能力的机器……那么我愿将我的声誉毫不吝啬地让给他,因为只有他能够完全理解我的种种努力以及这些努力所得成果的真正价值。

伦敦科学博物馆·分析机设计图纸&模型机

和差分机不同的是,分析机现存的图纸并不完整,因此至今也没能建造出来。不过好消息是,有两个英国专家在前几年发起了建造分析机的计划——Plan 28(名称来源于巴贝奇的第28套设计方案),宣称要在2020年前做出来,让人们看看CPU究竟是怎样工作的,就让我们拭目以待。

可以说,巴贝奇一生的奋斗都是孤独的,在那个年代,人们看不到分析机的巨大价值和意义,有了先前差分机的失败,政府也不再愿理会分析机的想法。巴贝奇的思想超前了整整一个世纪,但庆幸的是在有生之年,依然有着三位难能可贵的支持者:

首先是他的儿子亨利·巴贝奇(Henry Prevost Babbage),直到巴贝奇过世后,亨利也继续着分析机的建造工作,但终究也力不从心未能完成;

而后是后来成为了意大利总理的数学家闵那布利(Luigi Federico Menabrea),他在巴贝奇1840年演讲时详细记录下了分析机的思想;

最后就是著名诗人拜伦的女儿,史上大名鼎鼎的女程序员艾达(Ada Lovelace),她将闵那布利记录分析机的文章翻译成英文,巴贝奇建议她在翻译时增添一些自己的理解,结果艾达注解的长度是原文的两倍,其中针对计算伯努利数的算法被视为史上第一个计算机程序,这篇名为《关于巴贝奇先生发明的分析机简讯》的译文被视为程序设计方面的第一篇著作,而艾达本人则成了世界上第一位程序员。

艾达和她的伯努利数程序(程序猿们快来跪拜祖先啊~~)

艾达几乎是那个时候唯一一个真正理解分析机的人,她不仅编写了许多可以在分析机上运行的程序,甚至还看到了巴贝奇自己都没有看到的事情——她说:分析机不光能用来计算,它应该还能用来表示其他东西,比如音乐。这是多么远大的目光啊!后来美国国防部将一种编程语言命名为Ada,就是为了纪念这位与巴贝奇同样具有超前思想的伟大女性。

参考文献

胡守仁. 计算机技术发展史(一)[M]. 长沙: 国防科技大学出版社, 2004.

N.A.阿波京, JI.E.梅斯特洛夫. 计算机发展史[M]. 上海: 上海科学技术出版社, 1984.

吴为平, 严万宗. 从算盘到电脑[M]. 长沙: 湖南教育出版社, 1986.

陈厚云, 王行刚. 计算机发展简史[M]. 北京: 科学出版社, 1985.

Wikipedia. Charles Babbage[EB/OL]. https://en.wikipedia.org/wiki/Charles_Babbage, 2015-12-10.

Wikipedia. Per Georg Scheutz[EB/OL]. https://en.wikipedia.org/wiki/Per_Georg_Scheutz, 2015-05-14.

Wikipedia. Difference engine[EB/OL]. https://en.wikipedia.org/wiki/Difference_engine, 2015-12-10.

xRez Studio. Babbage Difference Engine in Gigapixel[EB/OL]. http://www.xrez.com/case-studies/exhibition/babbage-gigapixel-difference-engine, 2010-11-27.

MechanicalComputing. Babbage's Difference Engine No. 2, Part 1: The method of finite differences[EB/OL]. https://www.youtube.com/watch?v=PFMBU17eo_4, 2015-04-10.

MechanicalComputing. Babbage's Difference Engine No. 2, Part 2: The Calculation Section[EB/OL]. https://www.youtube.com/watch?v=vdra5Ms__9s, 2015-04-10.

eriklanigan. Babbage Difference Engine in Motion[EB/OL]. https://www.youtube.com/watch?v=jiRgdaknJCg, 2011-07-06.

Andrew Carol. Babbage Difference Engine made with LEGO[EB/OL]. https://www.youtube.com/watch?v=i_u3hpYMySk, 2010-07-08.

夏鼐. 我国古代蚕、桑、絲、绸的历史[J]. 考古, 1972, (02):12-27.

探索·发现. 年轮·霞蔚天成(上)[EB/OL]. http://tv.cntv.cn/video/C14092/880134fb98fe4c55d1cb728d0e4556df, 2009-05-21.

赵丰. 中国丝绸通史[M]. 苏州大学出版社, 2005.

Sydney Padua. Punchcard and rod controller[EB/OL]. https://www.youtube.com/watch?v=-FSJ7YnARwE, 2013-11-01.

Sydney Padua. Babbage's Analytical Engine: Overview[EB/OL]. https://www.youtube.com/watch?v=_fyUtU6LVNY, 2015-05-30.

John Graham-Cumming. The greatest machine that never was[EB/OL]. http://www.ted.com/talks/john_graham_cumming_the_greatest_machine_that_never_was, 2012-03.

Wikipedia. Ada Lovelace[EB/OL]. https://en.wikipedia.org/wiki/Ada_Lovelace, 2015-12-13.


相关阅读(《01改变世界》第一稿)

前言

没有计算器的日子怎么过——手动时期的计算工具

机械之美——机械时期的计算设备

现代计算机真正的鼻祖——超越时代的伟大思想

让电代替人工去计算——机电时期的权宜之计

01改变世界(第一版)
Web note ad 1