当祖思凭一己之力开启德国现代计算机的历史,大西洋彼岸的美国也毫不示弱地完成了本土的设备升级。和前者的孤军奋战不同,后者主体是上世纪叱咤风云的贝尔实验室。
众所周知,贝尔实验室及其所属公司是做电话起家、以通信为主要业务的,虽然也做基础研究,但为什么会涉足计算机领域呢?其实跟他们的老本行不无关系——最早的电话系统是靠模拟量传输信号的,信号随距离衰减,长距离通话需要用到滤波器和放大器以保证信号的纯度和强度,设计这两样设备时需要处理信号的振幅和相位,工程师们用复数表示它们——两个信号的叠加是两者振幅和相位的分别叠加,复数的运算法则正好与之相符。这就是一切的起因,贝尔实验室所面临的大量的复数运算,全是简单的加减乘除,工程师们不堪重负,并开始雇佣文化程度不高的妇女(当时的廉价劳力)全职辅助计算。
从结果来看,贝尔实验室发明计算机,一方面是源于自身需求,另一方面也从自身技术上得到了启发。电话的拨号系统由继电器电路实现,通过一组继电器的开闭决定谁与谁进行通话。当时实验室研究数学的人对继电器并不熟悉,而继电器工程师又对复数运算不尽了解,将两者联系到一起的,是一名叫乔治·斯蒂比茨(George Stibitz)的研究员。
斯蒂比茨毕业于康奈尔大学数学物理专业,1930~1941年就职于贝尔实验室。1937年的某一天,他觉察到继电器的开闭状态与二进制之间的联系。他找来两节电池、两个继电器和两个小灯泡,然后从易拉罐上剪下一个U形触片,用电线把它们连成了一个最简单的二进制加法电路。
实现的效果是:按下触片B,灯泡L2亮;按下触片A,灯泡L2亮;同时按下A和B,灯泡L1亮。所实现的加法逻辑如下:
因为是在厨房(kitchen)里搭建的模型,斯蒂比兹的妻子称之为Model K。Model K看似简单,却为斯蒂比茨验证了制造二进制计算机的可行性。
1939年,斯蒂比茨带领贝尔实验室的团队仅花了6个月就完成了专门用于进行复数运算的复数计算机(Complex Number Computer),后人也称之为Model I。Model I只支持复数的乘除运算,而没有实现最基本的加减,因为贝尔实验室认为加减法足够简单,只需要口算就够了,再不济也可以直接使用现成的机械计算器。不过后来他们惊喜地发现,只要不清空前一个数,在此基础上把新的数和1(或-1)相乘,就相当于与前一个数求和(或求差)。
当时的电话系统中,有一种拥有10个状态的继电器,可以表示数字0~9,鉴于Model I的专用性,其实没有引入二进制的必要,直接利用这种继电器即可。斯蒂比茨实在不愿放弃在数学上极简至美的二进制,便引入了二进制和十进制的“杂种”—— 二-十进制编码(binary-coded decimal),简称BCD码,将十进制数的每个数位都用4位二进制码表示:
十进制数 | BCD码 |
---|---|
0 | 0000 |
1 | 0001 |
2 | 0010 |
3 | 0011 |
4 | 0100 |
5 | 0101 |
6 | 0110 |
7 | 0111 |
8 | 1000 |
9 | 1001 |
10 | 0001 0000 |
23 | 0010 0011 |
45 | 0100 0101 |
可见,0~9的BCD码和二进制码一样,但10的BCD码成了1和0的二进制码的拼接,更大的数亦然。
那么这种编码是如何实现的呢?有了逻辑门,一切好办。输入端的10个开关电路D0~D9分别表示十进制的数字0~9,每次导通其中一个电路,即输入了相应的数字;输出端的4个开关电路BCD0~BCD3分别表示BCD码的4位二进制数字。D0~D9与BCD0~BCD3的对应关系如下:
这一逻辑非常简单,用4组或门就可以实现:
BCD码既拥有二进制的简洁表示,又保留了十进制的运算模式。但至此,斯蒂比兹仍不满足,他完成了一次绝顶聪明的调整——在每个BCD码的基础上+3,成为余3码(Excess-3):
十进制数 | 余3码 |
---|---|
0 | 0011 |
1 | 0100 |
2 | 0101 |
3 | 0110 |
4 | 0111 |
5 | 1000 |
6 | 1001 |
7 | 1010 |
8 | 1011 |
9 | 1100 |
为什么要+3呢?因为4位二进制共有16个编码,原本可以表示数字0~15,在BCD中后6个编码(1010~1111)是多余的,通过+3,斯蒂比茨让前3个(0000~0010)和后3个(1101~1111)成为多余编码:
这么做是为了追求平衡,还是为了满足斯蒂比茨的强迫症心理呢?当然都不是。余3码的智慧有二:
相比BCD,余3码大大简化了线路设计。
除了编码,Model I的另一大亮点是它首次采用了操作终端和后台计算明确分离的架构,用现在的行话讲,就是C/S(客户端/服务器)架构。
斯蒂比茨为Model I配备了3台操作终端,用户在任意一台终端上键入要算的式子,后台将收到相应信号并在解算之后传回结果,由集成在终端上的打字机打印输出。只是这3台终端并不能同时使用,像电话一样,只要有一台“占线”,另两台就会收到忙音提示。
终端集成了数据输入(键盘)和结果输出(打印机),用户使用十进制输入数据,并在打印纸上得到十进制的计算结果,内部线路自动完成十进制与余3码的相互转换。
键盘的按键不多,左侧为一个连接/断开后台的开关,M键和D键分别表示乘法和除法运算,C键表示清零。为了便于电路实现,Model I采用定点运算,要求输入的数据都是纯小数,由使用者自行做好缩放,因此表示加减操作符(包括实数部分和虚数部分)的4个按键上都直接标注了小数点。
举个例子,如计算(10+24i)×(20-48i),按键的顺序如下图所示,在按下等号键之后,机器将在约45后打印出结果。由于机器接收的公式是经过缩放之后的(0.10+0.24i)×(0.20-0.48i),所有数据被缩小了100倍,需人工将机器给出的答案放大10000倍才是正确结果。
Model I不但是第一台多终端的计算机,还是第一台可以远程操控的计算机。贝尔实验室利用自身的技术优势,在达特茅斯学院(Dartmouth College)和400多公里开外的纽约本部之间搭起线路。1940年9月9日,斯蒂比茨带着一台小小的终端来到学院演示,不一会就从纽约传回结果,在与会的数学家中引起了巨大轰动,他们纷纷上台亲自验证,其中有很多计算机史上鼻祖级的人物,包括日后大名鼎鼎的冯·诺依曼、“控制论之父”诺伯特·维纳(Norbert Wiener)、“人工智能之父”约翰·麦卡锡(John McCarthy)和“ENIAC之父”约翰·莫奇利(John Mauchly)等。
斯蒂比兹由此成为远程计算第一人。
然而,Model I只能做复数的四则运算,不可编程,当贝尔的工程师们想将它的功能扩展到多项式计算时,才发现其线路几乎不具备升级的可能性。尽管名为Complex Number Computer,从能力上看,叫Complex Number Calculator似乎更合适。
1941年底美国加入二战之后,贝尔实验室开始为军方研制高科技作战设备,便有了建造可编程计算机的需求。该项目继续交由斯蒂比茨负责,1943年年底,Model II问世。尽管是台通用计算机,但由于主要用于靠插值法计算M9高炮射击前的参数,Model II有个十分“专用”的名字——继电器插值器(Relay Interpolator)。
Model II开始使用穿孔带进行编程,共设计有31种指令,最值得一提的还是编码——二-五编码(bi-quinary coded decimal)。
十进制数 | 二-五编码 |
---|---|
0 | 01 00001 |
1 | 01 00010 |
2 | 01 00100 |
3 | 01 01000 |
4 | 01 10000 |
5 | 10 00001 |
6 | 10 00010 |
7 | 10 00100 |
8 | 10 01000 |
9 | 10 10000 |
不难发现,这种编码和算盘的示数方式极其形似。实现起来很简单,把继电器分成两组:一组5位,表示0~4;另一组2位,表示是否要加上5。
然而比起余3码,二-五编码似乎既缺乏高级感,又浪费位数,斯蒂比茨之所以选择它,是因为它有强大的自校验能力。采用二-五编码时,每一组继电器中,有且仅有一个继电器为1,一旦出现多个1,或者全是0的情况,机器就能立马发现问题,由此大大提高了可靠性。
相比祖思,斯蒂比茨是幸运的,贝尔实验室为他提供了足够大展身手的平台。他拥有出色的技术团队,拥有现成的零件资源(继电器),也拥有更安全稳定的研究环境。Model系列不是斯蒂比茨的个人功劳,而是整个贝尔实验室的集体成就。1941年斯蒂比茨离职后,贝尔实验室依然与他保持着紧密合作,并相继推出了Model III~Model VI,在计算机发展史上盘踞一席之地,同时为美国的军事力量做出了不小的贡献。其中,Model V是战时的最后一型,可处理的数据范围达到了10-64~1064,战后的Model VI则“返璞归真”再度用于复数计算。
所谓反码,就是二进制串中的所有位都取反。 ↩