故事要从十九世纪的英国讲起。工业革命带来了蒸汽机和各种机械装置,将人们从各种劳动中解放了出来。
这一天,在剑桥大学的办公室里,年轻的数学家查尔斯·巴贝奇(Charles Babbage)对着一张错误百出的对数表,气得七窍生烟。旁边,他的好友,天文学家约翰·赫歇尔(John Herschel)充满同情地看着他。巴贝奇嘟囔着,“上帝啊,我真希望可以用蒸汽机产生对数表,这样就不会有这么多人为的错误了”,赫歇尔愣了一下,随口答道,“嗯,有意思,这个想法是完全有可能实现的。”
于是在1821年,巴贝奇开始着手设计一台可以自动生成对数,指数,三角函数的机器,这就是差分机(Difference Engine)的原型。巴贝奇把这些复杂的数学计算,分解成若干步骤,而每个步骤都可以通过简单的加减运算来实现。譬如,要生成指数函数 f(x)=x²,最终的结果是这样一个数列:1,4,9,16,25,36,49 ...... , 它们之间的差值是:3,5,7,9,11,13,......,而这个新的数列的差值是:2,2,2,2,2 ......,所以如果要产生下一个指数,8的平方,我们可以把最后得到的等差2,加到上个数列的最后一个数值13上,就得到15;然后再把15加到最先的那个数列的最后一个数值49上,这样就可以得到8的平方(49+15=64)。通过这个原理,巴贝奇甚至可以用差分机算出一到一千万之间的所有质数(a table of prime numbers up to 10 million),这在当时简直是个奇迹。
英国政府对差分机表现出异常浓厚的兴趣,在后面的十年里慷慨解囊,为巴贝奇的神器投下了17000英镑,这是一笔可以用来制造两艘战舰的巨资。可在这十年中,巴贝奇不停地修改他的设计,试图精益求精,但最终却因为严重超支,只完成了差分机的1/7,而此时巴贝奇却又有了新的想法。他要造一台可以编程的计算机!
这台被称为“分析机”(Analytical Engine)的机器,在巴贝奇的构想中,可以根据外部的指令执行不同的数值运算。那么如何给机器提供指令呢?巴贝奇最先的想法是使用一种类似齿轮的装置,但后来他从法国人Jacquard发明的自动织布机中获得了灵感。
Jacquard 使用的是打孔卡(punch cards)。通过打孔卡小孔的不同位置来控制织布机的主轴,从而织出不同的花样图案,巴贝奇见此设计之后,茅塞顿开。打孔卡可以一张接一张无限制地提供指令给分析机,而且一套不同的打孔卡可以对机器重新编程,执行不同的运算,现代计算机最主要的两个特征: “通用”(general-purpose)和“编程”(programmable)已经呼之欲出了。
可是,也许是因为吃够了差分机的苦头,当时的英国政府和科学界对“分析机”反应冷淡。也难怪他们,要是今天中国政府给了你两艘航母的经费,十年的时间,你交出个1/7的半成品,然后你说你要搞个更伟大的项目,任凭你说得天花乱坠,估计也没人再愿意上当了。于是巴贝奇磨破了嘴皮子,大家还是无动于衷,只有一个人除外,一个女人。
爱塔(Ada Lovelace)是英国大诗人拜伦的独生女儿,但父母在她满月之日就离异了,爱塔的母亲痛恨她父亲拜伦的失德行为,并将此归咎于他的诗人气质,于是从小就让爱塔远离文青,专攻数理,为她打下了坚实的数学基础,这也让她在英国的科学界有了许多朋友。早年爱塔曾一度试图说服巴贝奇做她的数学私教,不过被巴贝奇婉言谢绝了。当她了解到巴贝奇“分析机”的构想时,我们年轻的伯爵夫人被深深地迷住了,她甚至梦想成为巴贝奇的合伙人和公关主任,游说世人出资建造“分析机”。
1843年,爱塔写下了阐述分析机原理的《注记》(Notes),在爱塔的注记中,她认为分析机不但可以处理数学问题,而且应该可以处理任何能够转化成数字符号的东西,包括音乐和艺术,她笔下的“分析机”简直就成了多媒体电脑的化身。而且更加神奇的是,爱塔在注记里写下了世界上第一段软件程序 -- 计算伯努利数。爱塔设计的整段程序一共需要75张打孔卡,里面不但有子程序(subroutine),甚至还有递归循环(recursive loop)。
1983年美国国防部将内部使用的计算机编程语言命名为Ada,用来纪念这世界上第一位的程序猿。下面这段就是来自Ada的问候:
with Ada.Text_IO; use Ada.Text_IO; procedure Hello is begin Put_Line ("Hello, world!"); end Hello;
不过,巴贝奇也好,爱塔也好,他们实在是太超越他们的时代了,超越了整整一百年!
巴贝奇差分机、恩尼格玛密码机、(赌博用机械式)老虎机等等都是机械时代的杰作。