电子时代
# 电子时代
# 图灵机:计算机世界的理论基石
有个古老而经典的逻辑游戏:如果一个人说“我正在说谎”,那么他到底在不在说谎呢?如果他不在说谎,那么“我正在说谎”这句话就是真的;如果他在说谎,那么“我正在说谎”这句话就是假的。无论从哪个方向推演,得到的都是自相矛盾的结论,我们无从判定他在不在说谎。
这就是公元前4世纪,由哲学家欧布里德(Eubulides)提出的著名的说谎者悖论。 与之类似的,还有伯特兰·罗素(Bertrand Russell)在1901年提出的罗素悖论,它的通俗化版本是流传更广的理发师悖论:如果一位理发师只给不为自己理发的人理发,那他给不给自己理发呢?
罗素悖论直接动摇了整个数学大厦的根基——集合论。为使命题合理,当那位理发师圈定服务对象的范围时,必须把自己排除在外。这也就意味着,没有包罗万象的集合——至少它不能轻易包含自己。
这些悖论都源自“罪恶”的自指——当一套理论开始描述自身,就难免要出现悖论。 即使再不情愿,人们也不得不承认数学是不完美的,至少它没有自圆其说的能力。 尽管如此,仍有数学家想在限定的范围内负隅顽抗,他们找到一个完备的系统 ^[1]^ ,寻求能够判定命题真假的通用算法。这就是德国数学家大卫·希尔伯特(David Hilbert)和威廉·阿克曼(Wilhelm Ackermann)在1928年提出的判定问题(Entscheidungsproblem/decision problem)。
只可惜没过几年,这种可能性也被否定了。
1936年,两位年轻的数学家分别用不同的方法给出了判定问题的解答。一位是来自美国的阿隆佐·邱奇(Alonzo Church),他引入了一种叫λ演算的方法,并最终证明没有任何通用算法可以判定任意两个λ表达式是否相等;另一位就是来自英国的艾伦·图灵(Alan Turing),和枯燥的数学推理不同,他使用了一种更有趣、更形象的模型,邱奇给了它一个响亮的名字——图灵机(Turing machine)。
1912年6月23日,图灵出生于英国帕丁顿一个没落的贵族家庭,由于父母常年在印度工作,他和年长4岁的哥哥一起被寄养在一对军人夫妇的家中。图灵的童年十分平凡,和普通男孩一样,经历过调皮捣蛋和孤僻寡言的的阶段,他天性聪敏却有着严重偏科的倾向,许多教过他的老师对他的评价并不高。
10岁那年,图灵接触到一本改变了他一生的童书——《儿童必读的自然奇迹》,这本科普读物打开了一扇新世界的大门,图灵发现门的那边堆满了一种对他来说最有吸引力的知识——科学。他开始疯狂地寻找和自学有关科学的一切知识,并用日用品做一些简单的化学实验。他很快意识到手头的科普读物过于浅显,妨碍了他了解事物背后更深层的原理。他甚至写信给父母讨要真正的科学书籍,而不是儿童百科。他写到:“《儿童必读的自然奇迹》中说,二氧化碳在血液里变成苏打,又在肺里变回二氧化碳。如果可以,请把苏打的化学名称,最好是化学式寄给我,好让我看看这个过程到底是怎么进行的。”13岁时,他已经对酒精等有机物的分子式和结构式了如指掌。
1926年,聪明好学而又对科学知识近乎偏执的图灵考入了舍尔伯尼中学。开学当天正赶上英国大罢工,公共交通瘫痪,图灵竟用两天时间靠自行车征服了到学校的60英里(近100公里)路程。这不是一次冲动之举,而是精心策划之下的行动,当地报纸还专门刊载了这一令人吃惊的事迹。
图灵很有才,也很有执行力,却在与人沟通上遇到了大麻烦。知子莫若母,图灵的母亲在为他寻找合适的中学时就一度担心他没法适应公学 ^[2]^ 生活,成长为高智商、低情商的怪人。在讲究教条与制度而不重视理性和科学的舍尔伯尼,图灵显得格格不入,被多数同学孤立和欺负,连老师也经常拿他的小习惯开涮,这对一个心智尚未成熟的男孩来说非常可怕。他们的校长倒看得十分透彻,曾警告图灵的父母:“我希望他不要两头都落空。如果他要留在公学,就必须以好好接受我们的教育为目标;如果他只是想做科学家,那么呆在公学就是浪费时间。”
舍尔伯尼是当时英国社会的一个缩影,中学的经历也预示着图灵不被理解的一生。
1931~1934年,成年后的图灵在剑桥大学国王学院攻读数学专业。尽管这里的制度依旧古板,像个放大版的舍尔伯尼,图灵依旧孤僻,但接触到了世界顶级的数学家和一流的学术专著,他可以更专注于自己喜欢的领域,并包揽了许多数学方面的奖项。毕业后,图灵以优异的成绩成为国王学院研究员。他在希尔伯特的问题上花费了整整一年的时间,最终在1936年的《伦敦数学协会会刊》上发表了那篇改变世界的论文——《论可计算数及其在判定问题中的应用》,提出了使其成为“计算机科学之父”的图灵机。
后话
论文正式发表之前,图灵只身前往美国普林斯顿,在那里找到了领先一步发表成果的邱奇,并师从他继续深造。1937年,图灵嗅到了纳粹德国引战的可能,开始把业余时间花在密码学的研究上。1938年,图灵在取得博士学位后返回了正在紧张备战的英国,不多久,他便参与到政府的密码破译 ^[3]^ 项目中,和全国各地顶尖的数学家们一起,在白金汉郡的布莱切利公馆(Bletchley Park)中深居简出,左右世界战争的格局。
二战时期,各国已经使用无线电进行作战指挥,由于信号可以轻易被敌国接收,需要对无线电内容进行加密,比如将“ABCD”改成“BCDE”发出去,当然军用的加密方式不会如此简单。当时的德国使用一种叫谜机(Enigma machine)的加密机器,按下某个字母的按键,其加密后对应的字母小灯就会亮起。内部的转轮和接插线板将这种对应关系随意打乱,每按一次按键,转轮就会转动一次,组合成新的对应关系,比如第一次按下A,D灯亮起,再按一次A,亮起的可能是Z灯,毫无规律可循。更棘手的是,德军几乎每天都会变更其中的接线。
# 电子管:电子时代的到来
19世纪下半叶,先后有几位科学家发现了通电的金属导体在加热后会出现电量损失的现象。1883年,正在改进灯泡的托马斯·阿尔瓦·爱迪生(Thomas Alva Edison)也发现了这一现象,为了减缓灯丝在高温下过快“蒸发”,他在灯泡中加入了不与灯丝接触的金属片,虽然并没有解决灯丝的“蒸发”问题,却意外地用电流表检测出了金属片中的微弱电流。这在当时是匪夷所思的,难不成电流从空中飞渡了吗?
他进一步实验,发现只有当金属片与电源的正极相连时才会产生电流,反之则不会。爱迪生不明白这是什么原理,也没想过可以怎样应用,但依然申请了专利,这种现象因而被称为爱迪生效应(Edison effect)。爱迪生并没有料到,自己的无意之举打开了电子学的大门。
1897年,英国物理学家约瑟夫·约翰·汤姆生(Joseph John Thomson)发现了电子,人们才明白爱迪生效应是电子从加热的灯丝表面逃逸,被金属片捕获的结果,当金属片连接电源负极,同极相斥,也便不会接收来自灯丝的电子。爱迪生效应因此有了一个更专业的名字——热电子发射(Thermionic emission)。
1904年,英国物理学家约翰·安布罗斯·弗莱明(John Ambrose Fleming)利用爱迪生效应发明了电子管(或真空管),结构和爱迪生的灯泡类似,因为有两个电极(涌出电子的灯丝为阴极,接收电子的金属片为阳极)而被称为电子二极管(或真空二极管)。当阴极与电源负极相连、阳极与电源正极相连时,二极管导通,表现为没有电阻的导线;反之,二极管不通,表现为一个没有合上的开关。由于这样单向导通的特性,电子二极管主要用作交流电整流器和收音机里的检波器。
二极管中,与电源正负极的相连本质上造就了阴极与阳极之间的电压差,与电源正极相连总能获得更高的电压。水往低处流,电流也一样,从高压的地方流向低压,可电子却不是,它总爱从低压的地方挪向高压,因为它带负电荷,所以要跟我们的常识反着来。那么,有么有可能通过增加电源和电极,以产生更多不同的电压差,从而实现更复杂的功能呢?还真有。
1906年,美国发明家李·德福雷斯特(Lee de Forest)通过在二极管的灯丝和金属片阴阳两极之间增加一个电极——一根波浪形的金属丝,发明了电子三极管。后来金属丝被改成金属网,故称栅极。
栅极的表现与阳极十分类似,其作用取决于它和阴极之间的电压差。当施加在栅极上的电压比阴极低时,从阴极发射的部分电子将受到阻碍而无法到达阳极,栅极上的电压比阴极低得越多,这种阻碍效应就越大,直至完全阻隔;反之,当栅极上的电压比阴极高时,它反而开始吸引电子,助阴极一臂之力将更多电子传到阳极。结果是,稍微改变一下栅极上的电压,就可以对阳极上的电压产生很大影响,因而三极管常用作无线电通信中的信号放大器。
# 电子管逻辑门
具有通断两种状态的电子管令人不禁和电磁继电器联系到一起,继电器中衔铁的摆动是机械的,而电子管的通断几近光速,如果使用电子管组成开关电路,进而实现逻辑门,以此为基础元件建造的计算机不就可以拥有空前的运算速度了吗?
下图给出了一种用电子二极管和三极管构建的与、或、非门电路,为了便于分析,这里引入一个专业术语——电平,它用来表示电压的相对高低,我们把相对的高压称为高电平,相对的低压称为低电平,通常对应到二进制中,高电平代表1,低电平代表0。
- 与门由两个二极管组成,两者的阴极作为输入端X和Y,阳极作为输出端Z,对Z施加高电平。当给X和Y任意一者施加低电平时,对应的二极管导通,Z处的电平便被拉低;给X和Y同时施加高电平时,两个二极管都不通,Z便保留高电平。
- 或门也由两个二极管组成,两者的阳极作为输入端X和Y,阴极作为输出端Z,对Z施加低电平。当给X和Y任意一者施加高电平时,对应的二极管导通,Z处的电平便被拉高;给X和Y同时施加低电平时,两个二极管都不通,Z便保留低电平。
- 非门由单个三极管实现,栅极作为输入端X,阳极作为输入端Z,对Z施加高电平。当给X施加高电平时,三极管导通,Z处的电平便被拉低;给X施加低电平时,三极管不通,Z便保留高电平。
显然,用电子管建造计算机在理论上是完全可行的。不过这样的想法在早期被多数人视为天方夜谭,因为那时的电子管不但体积大、能耗高、价格昂贵,可靠性还差,常以极少的数量应用在无线电设备中,用成千上万的电子管建造计算机几乎是不可能完成的任务。然而,还是有一批不惧困难的极客在历史的关键时刻接下了这个任务,用一根根灯丝的微弱之光,点亮了电子计算的前途。
# ABC:第一台电子计算机
大约是1934年的某一天,美国爱荷华州立大学数学和物理专业的一位助理教授正摩拳擦掌,誓要改造学校租用的一台IBM制表机,使它成为更强大的计算机器,并立刻动起手来。这一举动令IBM的售货员大为紧张,毕竟学校只是租赁,并没有把机器买下来,赶紧写信叫停了他的“鲁莽”行为,并要求把已经改动的地方恢复原样。
这位助理教授名叫约翰·阿塔纳索夫(John Vincent Atanasoff),他拥有佛罗里达大学电气工程学士学位、爱荷华州立大学数学硕士学位和威斯康星大学理论物理博士学位。专业上繁重的计算令他苦恼已久,在制表机的改造计划落空之后,他决定自己建造一台计算机。扎实的数学功底使他在设计机器时游刃有余,电气和物理方面的专业知识也使他看到使用电子管的可行性。1939年春天,他成功获得了学校的经费,此时还差个助手帮他一起完成这一项目。一位同事将自己优秀的学生克利福德·贝里(Clifford Berry)推荐给了他,当时贝里刚从电气工程专业本科毕业,便顺势成为了阿塔纳索夫的研究生。
不到3年时间,机器便基本完工,它包含了数百个电子管,以及1600米左右的电线。因为是阿塔纳索夫设计的,人们便理所当然地称之为阿塔纳索夫机,其实贝里的贡献也不容忽视,在1963年贝里去世之后,阿塔纳索夫为了纪念这位出色的学生、自己的得力助手,正式将机器命名为阿塔纳索夫-贝里计算机(Atanasoff–Berry computer),简称ABC。巧合的是,这个在英文中代表“入门”和“基础”的单词,也正是第一台电子计算机的名字。
# 组成结构与工作原理
可惜的是,这台划时代的计算机没有保留下来,我们现在所能见到的是爱荷华州立大学在1997年重建的复制品。它借用IBM的80列穿孔卡片输入十进制数据,读卡器在读入后将它们转换为二进制形式存入两个滚筒状的存储器(图中另一个滚筒存储器被右侧控制台遮挡),计算单元由电子三极管逻辑电路构成,计算结果被转换回十进制后通过示数齿轮显示。对于规模稍大的问题,ABC还提供了读写二进制中间结果的装置。
这是一台专用的电子计算机,用于求解线性方程组,最多支持29个方程。我们知道,单个线性方程要有解,只能含有1个未知数,但需要2个已知数——未知数的系数和常数,比如下例方程的已知数为(1,2):
由两个线性方程构成的方程组则可以含有2个未知数,但每个方程都需要3个已知数,比如下例中2个方程的已知数分别为(1,2,4)和(1,-2,-4):
以此类推,由29个线性方程构成的方程组,每个方程需要30个已知数,分别为29个未知数的系数和1个常数。对于这种极限情况,ABC共需处理29组(每组30个)已知数,但阿塔纳索夫考虑到每联立两个方程就能消去一个未知数,可以让ABC每次只处理2组已知数。于是他为ABC装配了2个(而不是29个)滚筒存储器,每个滚筒存储30个50位二进制定点数。
滚筒的筒壁上整整齐齐排布着32圈、每圈50个电容,其中30圈用于存储数据,多余的2圈作为备份。电容具有两个电极,可分别施加高电压和低电压,故而可用“一高一低”和“一低一高”两种状态表示0和1。并且,带电的电容可以提供导通电子管的电压,反之,电子管也可以为电容充电——两者天生具备着二进制数据的传递能力。
由于电容比较“健忘”(离开电源后在一定时间内会自行失电),滚筒每秒旋转一周,固定在台面上的电刷就对电容进行一次充电。对此,阿塔纳索夫打过一个生动的比方:一位家长让孩子去小店里买东西,孩子怕自己忘了,便在去的路上一遍又一遍地提醒自己“一打鸡蛋、一磅黄油”。滚筒存储器的学名叫做再生式电容存储器(regenerative capacitor memory),阿塔纳索夫首次将“memory”这个原本表示人类记忆的单词用在了机器身上。
在滚筒旋转一周的短短1秒内,计算单元便完成了30对二进制数的加减运算,机械和机电时期的人们估计很难想象这种魔鬼般计算速度。事实上,电容只占据了滚筒柱面的5/6,计算是在5/6秒内做完的。ABC的电源是美国标准的60Hz交流电,50位二进制数的处理只用了其中的50Hz。
ABC使用了4.1节中提到的二进制加法器(减法通过二进制补码转换为加法),每个单数位加法器由14个三极管(7个双三极管)组成。机器工作时,站在一旁的操作人员能明显感觉到它们的热量。
常规思路中,我们需要50个串联的单数位加法器,以实现2个50位二进制数的相加,并通过30次运算完成30对数的相加。但ABC只用了30个单数位加法器,每次相加的不是2个完整的二进制数,而是将30对数的某个数位两两相加,并通过50次运算完成50个数位的两两相加。下图给出了两种方案的示意,为便于理解,图中将数据规模简化为每个滚筒包含3个5位二进制数。
# 后话
ABC是在爱荷华州立大学物理大楼的地下室建造的,整体不大,形似一张桌子,约1.5m长,宽、高都是0.91米。但后来,大学统一安装了一批仅0.84m宽的门,ABC所在的地下室也不例外。1948年,当学校准备将这里改造成教室时,发现这台机器已经运不出去了。由于ABC整体是用钢条焊死的,他们只得把它锯成小块,更糟糕的是,除了一个滚筒存储器,这些小块都被无情丢弃。
所以世界上第一台电子计算机被毁的起因,竟是一段区区7厘米的尺寸差异。想必当时爱荷华州立大学的领导并没有意识到ABC的历史价值,不然他们一定会毫不犹豫地将锯子挥向那扇“该死的”门。复制品的造价高达35万美元(相当于如今的50~60万美元),足够他们买一大堆门了。
ABC的许多部件是机电的,比如读卡器、示数齿轮和指令开关,这一特点催生了有关它是机电计算机还是电子计算机的争议。其实,一台计算机是否为电子计算机,主要取决于它的计算部件。即使是现今的计算机,也照样用到了许多机电部件,比如鼠标、键盘和电源开关,这类人机交互层面的部件不应作为机器类型的判据。
ABC有着许多现代计算机的特点,比如二进制数据、电子计算、并行处理和计算-存储分离结构,但它是专用的,不可编程的,更达不到图灵完备,因此还不属于现代计算机的范畴,这为后来ABC与ENIAC的第一之争埋下了伏笔。
# 巨人机:第一台可编程电子计算机
1941年6月,意识到谜机可能已被破解的德军启用了一种复杂度更高的加密系统,并且这一次英国没能拿到相应的机器,布莱切利的密码学们要和一个完全未知的强大敌人抗争。在听闻德国人用一种海鱼的名字称呼这套系统后,布莱切利也给它起了个绰号——“金枪鱼”。
1941年8月,“金枪鱼”的操作员由于一时疏忽将同一条信息发送了两遍,尽管两条密文并不一样,但经验丰富的布莱切利在截获之后立马意识到它们指向同一条明文。这个小小的马脚,被这里绝顶聪明的密码学家们牢牢抓住,真可谓一叶知秋,他们据此精准地推测出“金枪鱼”的组成结构和工作原理。它包括12个谜机那样的转轮,每个转轮的旋转模式各不相同,每个转轮上导电触点的数量也不一样,导电触点可以在接通和断开两个状态之间切换,使用前可改变各触点的状态和转轮的起始位置。
破解“金枪鱼”,不仅要猜出转轮上所有导电触点的通断状态,还要猜出各转轮的起始位置,其组合数量之巨,不仅远远超出了人力处理的能力范围,也令炸弹机这类机电设备束手无策。布莱切利急需一种更高速的解密机器,电子管方案成为不二之选。
研制电子计算机的重任落在了位于伦敦西北角的邮局研究站身上,该研究站有着丰富的电子通信经验,在布莱切利的部分密码学家对电子管的可靠性还抱有疑虑的时候,邮局研究站的工程师早已对电子管的大规模应用驾轻就熟。1943年2月,在图灵的推荐下,来自研究站的托马斯·弗劳尔斯(Thomas Harold Flowers)扛起这面大旗,在布莱切利一部分人“等机器造好战争怕是早就结束了”的冷嘲热讽中,带领50人的团队仅用了11个月就完成了第一台原型。1944年1月,当这台包含了1500~1600个电子管的“庞然大物”来到布莱切利,密码学家们被深深震撼了,它比他们之前使用过的任何计算设备都庞大得多,因而被形象地称为巨人机(Colossus)。
巨人机有二型,1943年的一型为Mark 1,其建造过程中,弗劳尔斯就已经开始了第二型Mark 2的设计。Mark 2包含2400个电子管,速度更快,功能更强,截止欧洲胜利日(1945年5月8日)共建有10台之多。可惜的是,出于保密考虑,这11台机器连同其图纸都在60年代被下令焚毁,如今我们在布莱切利的英国国家计算博物馆所能见到的,是后人在1992~2008年耗时16年重建的复制品。
巨人机使用穿孔纸带输入密文,纸带每行有5个孔位,对应ITA2中的5位二进制。纸带长约61米,穿孔25000行。共设有两个纸带支架,在一条纸带工作的时候,操作人员可以准备好下一条纸带,交替使用,节省纸带更换时间。由于机器内部没有数据存储模块,纸带的头尾相接,形成环状,以便循环读取。纸带的读取速度十分惊人——每秒5000行 ^[1]^ ,工作时发出湍急的流水声,纸带上的孔洞以近44公里的时速飞驰。这得益于光电技术的应用,在纸带的一侧安装一个灯,另一侧安装5个并排的光电探测器 ^[2]^ ,一个探测器负责盯住一个孔位。当灯光穿过某个孔洞,其对应的光电探测器就能迅速发出电流脉冲,产生二进制信号1;当灯光被未穿孔的孔位遮挡,对应的探测器就产生二进制信号0。
巨人机基于图灵方法 ^[3]^ ,用电路模拟“金枪鱼”的转轮位置及其导电触点的通断状态。密文流入机器后,经过一系列以异或为主,与、或、非为辅的逻辑运算,最终由电动打字机输出结果。这个结果当然不可能就是明文,而是各种统计数据,比如某个字符出现的次数,或者某些数值满足某种逻辑条件的次数,有点像现在的数据挖掘。机器内有5个电子计数器,可同时统计5项数据。密码学家根据统计结果找到密文中暗藏的线索,调整机器程序,得到新的统计结果后继续分析,如此往复,一步步逼近最终的正确答案。
巨人机的可编程性是靠开关、旋钮和接插线板实现的。其开关可以上下拨动,分别接通两个不同的功能线路,多数开关还可以被拨到中间,使两个线路都断开;其旋钮用于置数,10个位置依次对应0~9,10条数值线路像10位英俊的绅士围绕着旋钮女士,一齐向她伸出求舞之手,而旋钮总会牵手他们中的一位。
巨人机的编程本质上是一组选择,选择每个开关和旋钮的位置,选择接插线板上每个导电孔的通断。这些选择对象分布于多块操控面板之上,下面按从右至左的顺序简单介绍一下它们的功能。
# ENIAC:第一台通用电子计算机
一颗看似做着简单的自由落体运动的炮弹,其实在出发前就被设定好了精确的飞行轨道。弹道的计算十分复杂,发射速度和角度的确定不仅要考虑炮弹本身的类型和炸药特性,还要考虑风向、风速、气压、气温、湿度和当地重力加速度等环境因素,作战时在瞬间完成这些因子的综合分析显然不是人力所能及的。因此,科学家会在使用前为炮手准备好一份弹道表,炮手对照表中参数操作火炮,炮弹便基本能落到指定的目标点。
于是二战期间,军方遇到了和当年人口调查一样的难题,每种型号的炮弹都需要计算2000~4000条弹道,每条弹道都涉及复杂的微积分运算,转换成四则运算平均涉及750次乘法和更多次加减,普通计算员使用机械计算器平均需要20个小时才能算完。多型新型火炮的投入使用给美国陆军的弹道研究实验室带来了很大的制表压力,他们雇佣了100多名女计算员,以满足阿伯丁试验场每天6张弹道表的需求。苦劳是做足了,一旦出错却没了功劳。实验室很快意识到,磨刀不误砍柴工,他们急需一台强大的计算机器。
这个创造历史的项目,交给了与弹道研究实验室相距仅120公里的位于费城的宾夕法尼亚大学莫尔电气工程学院。其实论起资历与声望,600公里开外的麻省理工学院会是更好的选择,但莫尔学院“近水楼台先得月”,早与弹道研究实验室建立了友好的合作关系,那些计算弹道的计算员就是由莫尔学院负责培训的。
1937年,费城一位名为普雷斯伯·埃克特(J. Presper Eckert)的天才少年收到了梦寐以求的麻省理工学院录取通知书,但他的母亲不希望自己唯一的儿子离家太远,他的父亲则不希望他学理工,还骗他说麻省理工的学费高昂,支付不起,百般无奈之下,埃克特只好“屈就”宾夕法尼亚大学的金融学院。不多久,对金融实在提不起兴趣的埃克特寻求转专业的机会,可是他最想去的物理系已经招满了,再一次的无奈之下,他来到了莫尔学院。那时的埃克特并不会料到,正是这个他“屈就”了再“屈就”的地方,给了他名垂青史的机会。
1943年4月9日,恰好是埃克特24岁生日的这一天,莫尔学院和弹道研究实验室所属的陆军军械部签订了6.17万美元的研制合同,年轻的埃克特虽然还是一名在读研究生,但由于杰出的专业能力被任命为项目总工程师。
这台计算机就是大名鼎鼎的电子数字积分器与计算机(Electronic Numerical Integrator and Computer),简称ENIAC。由于是为了处理弹道计算中的微积分而设计的,起初,它的名字是电子数字积分器(Electronic Numerical Integrator),但由于它的通用性,后来被用于各种其他计算,才有了追加的“and Computer”。
和埃克特搭档的,是年龄大他一轮的约翰·莫奇利(John Mauchly),时年36岁的莫奇利已是乌尔辛纳斯学院(同在宾夕法尼亚州)的物理系主任,拥有约翰·霍普金斯大学物理学博士学位。他被委任为ENIAC项目顾问,由于教学工作不能投入全部精力,但只要一有时间就会钻进项目里,最终出色地完成了ENIAC的总体设计,与主要负责工程实现的埃克特并称“ENIAC之父”。他们共同领导莫尔学院50人的兼职团队,一个主理论、一个主工程的黄金搭档模式像极了实现ABC的阿塔纳索夫和贝里。
ENIAC于1945年底竣工,在1946年2月14日晚正式亮相,并于日次交付。它的最终造价是48.7万美元,相当于今天的700多万美元。
# 组成结构与工作原理
ENIAC比巨人机更加庞大,总长约30米,高约4米,厚约0.9米,占地约167平米,需要布置在一个很大的房间。这台重达27吨的电子巨兽体内大约包含着18000个电子管、70000个电阻、10000个电容和1500个继电器,以及500万个焊接点,每小时吞掉150kW电量。功耗之大,一度传出夸张的谣言:ENIAC一启动,整个费城的灯光都要暗下一截。
初始化模块顾名思义,负责完成整台机器在开始使用前的所有准备工作,比如机器上下电和累加器清零,等等。
时钟周期模块是同步机器所有模块的关键,以每10μs一个电脉冲的频率指挥着各元器件的等周期工作,就像军训时喊着“121”口令的教官,有了统一的节奏,整个队伍的步伐才不至于乱套。
主编程模块占据2块面板,其上分布着密密麻麻的旋钮,使用者可以在此编程,设置各个电信号的走向和先后顺序。如果把匆忙的电信号比作车辆,主编程模块就好比十字路口的交警,引导着车流,车驶到不同模块就完成不同的使命。同时,将这些车流按段划分,以车流段为单位指挥交通,安排它们的执行次序,就实现了所谓的结构化编程,即程序不再只能从头到尾顺序执行,它可以有条件分支和循环分支等复杂结构。
两位程序员之间的4块面板即初始化模块、时钟周期模块和主编程模块。
函数表有3个,每个占据2块面板,通过其上的旋钮可以预置一些供其他模块反复使用的常数,这样的常数可不少,因此又添置了3台可移动的函数表(上图右侧即一台可移动函数表),每台有1456个旋钮。可移动函数表除了用于扩充3个固定的函数表,还可以直接与其他模块相连,供其查表。一次查表耗时5个加法时间。
累加器有20个,每个累加器可存放1个10位长度的十进制数(包括负数),供其他模块使用,两个累加器连接可组成一个支持20位十进制数的大累加器。累加器的线路设计为,每当从其他模块接收到数据,即将其累加到当前的存储值之上,故名累加器。累加器之间可互相传递自己的存储值,以此实现加法,也可传递存储值的补码,以此实现减法,因此ENIAC没有加减法的功能面板。一次数据传输或加减运算耗时200μs,这个时间被称为“加法时间”,是我们讨论ENIAC运算速度的基准时间。
比起诸多早已使用二进制或混合编码的前辈,仍然使用十进制的ENIAC就显得有些原始了。埃克特和莫奇利从机械计算器中的十齿齿轮获得灵感,用10个电子管电路存储1个数位,分别表示0~9,同一时间只有1个电路导通,以表示该数位上的值。这意味着,每个累加器需要100个这样的电路,并且,事实上每个电路平均要用到3.6个电子管。虽然比较浪费,但至少降低了设计难度。
高速乘法器占据3块面板,一次n位数(n≤10)乘法的耗时是n+4个加法时间。之所以强调“高速”,是因为它不是靠重复加法实现乘法的,而是直接查找预置在函数表里的部分积,然后将它们加起来。
除法和开平方运算支持20位数,它们都是靠重复减法实现的,因此它们共用一块功能面板。一次除法或开平方运算的耗时取决于计算结果,结果为n位时,耗时平均为13n个加法时间。
数据的输入输出设备是现成的IBM读卡器和穿孔机,分别受控于输入模块和输出模块。每张穿孔卡片可存8个10位十进制数,读取一张卡片需要0.48秒,穿孔一张卡片需要0.6秒。输入、输出模块分别占据3块面板,均使用继电器临时存储数据,它们是连接机器外部和内部的数据缓存池,比起内部的运算速度,读卡和制卡动作是如此之慢,所以没有必要使用电子管,毕竟继电器要便宜得多。
# 冯·诺依曼结构:现代计算机的诞生
机电时期,人们使用穿孔卡片或穿孔带编制程序,由于计算机的运算速度受限于机械动作,输入模块有充分的时间读取穿孔介质上的指令信息。而到了电子时期,使用穿孔输入就远远跟不上电子运算的节奏了,因此,人们便利用旋钮、开关和接插线的不同位置来表示程序,虽然消除了控制与运算之间的速度差距,却使编程成为一件非常复杂的难事。在ENIAC上设置一个实用程序,往往需要几个星期的时间,如非必要,使用者很少愿意修改它。因此,尽管ENIAC是通用的,却总在一段时间内只专用于某个问题(比如弹道计算),它的通用价值被大大削弱。而如果频繁地设置不同程序,机器在很大一部分时间里将无法运行,它的高速性能又被大大浪费。
聪明的读者或许已经想到:程序能不能像数据一样,通过穿孔介质输入之后长期驻存在机器内部的存储器中呢?这样一来,读取指令就和读取数据一样快了。
埃克特和莫奇利也想到了这一点,1944年,在ENIAC还未建成之际,研制一台可以存储程序的新机器的申请就提交到了导弹实验室。导弹实验室同意了这个项目,并提供10万美元的预算。这台新机器名叫电子离散变量自动计算机(Electronic Discrete Variable Automatic Computer),简称EDVAC。
原本,EDVAC会和前辈ENIAC一样,悄悄地建成,风光地亮相,它将成为世界上第一台存储程序电子计算机,埃克特和莫奇利将为它申请一份专利,而这次不会再有谁质疑他们的原创性。然而故事并没有朝着这条既定路线展开,一位不期而至的“程咬金”使他们的原创变得不再纯粹,甚至,遮盖了他们应有的名气。他就是大名鼎鼎的约翰·冯·诺依曼(John von Neumann)。
在所有计算机先驱中,冯·诺依曼和图灵一齐拥有着最高的知名度,但其实他的主要成就分布在其他领域。他首先是位伟大的数学家,在集合论、逻辑学、博弈论、代数学、几何学和拓扑学等各大分支都有卓越贡献,一生发表的150多篇论文中,120多篇都是数学论文;而后是一位物理学家,在量子力学和流体动力学中颇有建树;同时还是化学家和经济学家,是位令多数同行都只能望其项背的博学者。
他天赋异禀,6岁就能心算8位数除法,8岁便熟稔微积分,22岁获得布达佩斯大学数学博士学位。他能一字不差地背诵出曾经看过的名著,甚至电话本,他所知的历史知识甚至令普林斯顿大学的历史学教授都自愧不如。其心算能力和记忆力之强,曾令某位ENIAC小组的数学家感叹:还造什么计算机,他本身就是台计算机!
在与冯·诺依曼接触过的人中,越是高学识者越惊叹于他的超群智力。苏黎世联邦理工学院的教授乔治·波伊亚用“害怕”来形容自己对冯·诺依曼的感受,因为只要他在课堂上提到某个数学界的未解难题,冯·诺依曼很可能一下课就拿着完美的解答去和他讨论了。“原子能之父”恩利克·费米曾向曼哈顿计划的同事这样形容冯·诺依曼的心算能力:“他的心算速度是我的十倍,而我的心算速度已经是你的十倍了。”加拿大数学家海尔·比林则感叹:“想赶上冯·诺依曼是不可能,那种感觉就好像你骑着三轮车妄图追上汽车一样。”诺贝尔物理学奖获得者汉斯·贝特则不止一次半开玩笑地揣测:冯·诺依曼的大脑暗示着有比人类更先进的物种存在。
二战期间,冯·诺依曼加入曼哈顿计划,此时的他已经拥有极高的学术地位。原子弹的研制涉及大量运算,洛斯·阿拉莫斯国家实验室在体验过机电计算机Harvard Mark I之后,对ENIAC寄予了更高的期望。1944年的夏天,冯·诺依曼作为顾问加入ENIAC项目,提出了许多建设性意见,并深度参与到EDVAC的讨论中。
这期间,冯·诺依曼在EDVAC上投入了许多思考,他愈发觉得,EDVAC不单是一个平凡的计算机项目,它潜藏着更深的理论意义。他想起图灵的论文,通用图灵机能够根据纸带上的策略信息模拟任意图灵机的行为,纸带是它是存储器 ^[1]^ ,策略信息就是程序,这正是存储程序最早的思想萌芽。而他们现在所尝试的,正是用电子管将它变成现实!1945年6月,在一趟返回洛斯·阿拉莫斯国家实验室的列车上,完整的EDVAC已在冯·诺依曼脑中清晰可见,他奋笔疾书,写出了那篇长达101页,影响计算机历史走向的《EDVAC报告书的第一份草案》。
草案不仅详述了EDVAC的设计,还为现代计算机的发展指明了道路: 1. 机器内部使用二进制表示数据; 2. 像存储数据一样存储程序; 3. 计算机由运算器、控制器、存储器、输入模块和输出模块5部分组成。
这些在现在看来似乎是理所应当的原则,在当时却是一次划时代的总结。这份草案与其说是冯·诺依曼对EDVAC的设计描述,不如说是他对当时全世界计算机建造经验集大成式的高度提炼。
冯·诺依曼将计算机与神经细胞类比,运算器、控制器和存储器相当于联络神经元,输入模块和输出模块相当于感觉神经元和运动神经元。通俗地讲,就好比人拥有可以思考(处理信息)的大脑,并通过“感觉”获取来自世界的信息,通过“运动”去改变世界。计算机同样需要这样一个世界,那就是当时的穿孔介质、开关、旋钮、接插件,等等,统称外部记录媒体。
这种基于存储程序思想的计算机结构,后来被称为冯·诺依曼结构。冯诺依曼结构奠定了现代计算机的基调,放到今天,运算器和控制器就是CPU的主要组成部分,存储器主要对应为内存,输入和输出模块也被芯片化后集成到主板,外部记录媒体变得丰富多样,比如鼠标、键盘、显示器、触屏、手柄、硬盘、U盘、音箱、话筒,等等。
这份草案很快流传开来,并轰动了整个计算机界,但作为ENIAC团队的共同成果,却只署了冯·诺依曼一个人的名字。命运又一次给埃克特和莫奇利开了个大玩笑,这不仅让EDVAC失去了巨大的专利价值,还让ENIAC团队失去了应得的声誉。尽管冯·诺依曼并非有意为之,埃克特和莫奇利也一再强调即使没有冯·诺依曼,他们也能给出同样的成果,但“冯·诺依曼结构”实在太过经典,这个名词早已深入人心。
而EDVAC的设计思想中,有多少属于埃克特和莫奇利,有多少又属于冯·诺依曼,这是个永远也解不开的谜。但至少,如果没有冯·诺依曼将设计方案抽象至理论层面,计算机世界的“大一统时代”可能还要推迟到来。
如果说图灵描绘了计算机的灵魂,那么冯·诺依曼则框定了计算机的骨架,后人所做的只是不断丰富计算机的血肉罢了。
1948年4月,ENIAC团队通过线路改造使ENIAC的函数表有了存储指令的能力,但其容量对于程序来说还是太小了。实现存储程序的关键是建造容量足够大的内部存储器,要既有不拖累电子运算的访问速度,也要有相对低廉的成本。一时间,计算机界百花齐放,涌现出各种不同的存储器。
# 晶体管:现代计算机的细胞
尽管,真空电子管将计算机的发展带入了一个崭新时代,此时机器的运算速度已经远远超出了此前任何时期人们的想象,但电子管本身有着体积大、寿命短、能耗高、不稳定、无法标准化生产等诸多缺点,世界各地的计算机科学家们都清晰地意识到:即使计算机的发展有终点,那也一定不是电子管计算机。
人们为计算机寻求一种更适合的新细胞,很快就迎来了神奇的晶体管。
# 从半导体到晶体管
我们知道,任何物质都有或高或低的电导率。电导率高到一定程度的是导体,比如金属和电解质溶液;电导率低到一定程度的是绝缘体,比如塑料和橡胶;电导率介于导体和绝缘体之间的就是半导体,比如硅、锗和砷化镓,它们的处境十分尴尬,用于导电效率太低,用于绝缘又不够安全。但从19世纪30年代开始,科学家们陆续发现半导体在通电、加热和光照条件下的一些特殊性质,逐渐开发出其在整流和光电转换方面的能力。然而,这些只是半导体应用的开胃小菜,后厨的科学家们在半导体中掺入一些杂质,意外地发现它变成了导体,效果就像往不导电的纯水中撒一把食盐一样,他们很快调制出一种名为晶体管的秘方,惊艳世界的满汉全席即将开桌。
主厨是贝尔实验室的三位物理学家——约翰·巴丁(John Bardeen)、沃尔特·布拉顿(Walter Brattain)和威廉·肖克利(William Shockley)。1947年末,他们基于半导体锗组装出第一个具有信号放大功能的点接触型晶体管(point-contact transistor)。不过在审批专利时,美国专利局认为肖克利的研究方向与点接触型晶体管关系不大,便去掉了他的名字。肖克利身为组长却没有得到应有的回报,但他并没有因此而气馁,坚持在半导体领域继续攻坚克难,并在1949年发明出更实用的双极结型晶体管(bipolar junction transistor),简称BJT,真正打开了半导体计算的大门。有人戏说,是坚持者(persistor)发明了晶体管(transistor)。1956年,三人作为晶体管的先驱共同获得了诺贝尔物理学奖。
BJT的工艺十分精细、复杂,但它的原理并不难理解。晶体管的名称源自制作它的半导体材料是晶体,与非晶体不同,晶体在微观层面有着规则的几何结构。以锗为例,它的晶体结构是经典的金刚石立方结构,原子在立方体的中央,4个外层电子各占一个角,每个外层电子都可以和其他原子的某个外层电子结合成对,形成稳定的共价键,从而组成更大的立方体。
想象一下,每个原子都向外伸出4只手,每只手都握着一个电子,但是手太大,电子又太小,两个电子才能撑满它的一只手。为了寻求满足,它分别和4位友邻牵手,共享手里的电子,这样,每个原子的每只手上就都有了两个电子。这是一个十分稳定的结构,不但原子心满意足,成对的电子也因有了伙伴而乐不思蜀,哪儿都不想去了,因此锗的电导率不高。
# 晶体二极管
N型半导体中,接触面附近的部分自由电子会去填充P型半导体中接触面附近的空穴,从而在接触面上形成一个P侧带负电、N侧带正电的电场,这个电场又阻碍了电子的进一步扩散,两个半导体中的电子与空穴达到了一种动态平衡的状态。这个接触面附近的电场区域就是我们常有耳闻的PN结。
# 集成电路:芯片时代的到来
1952年,实用的晶体管问世不久,电子行业还盛行电子管之时,一家为石油行业提供地震勘探服务的公司以极其长远的眼光向贝尔实验室买下了专利许可,并斥资数百万美元押注晶体管市场,而它当时的年利润仅有90万,这无疑是一场没有后路的跨界豪赌。它就是如今的半导体巨头——德州仪器。
就在人们还对晶体管抱有迟疑态度时,德州仪器早已建成强大的晶体管生产线。1954年10月,其首款晶体管收音机上市。当时美国普通家庭中的电子管收音机都像餐柜一样庞大,而晶体管收音机则袖珍到足以放进口袋里,这种革命性的差距在社会上引起了巨大轰动,晶体管的优越性从此深入人心。
世界范围内,包括贝尔实验室在内的各大高校和计算机公司纷纷开始研制晶体管计算机,这些计算机被称为第二代电子计算机(电子管计算机是第一代电子计算机)。
与此同时,晶体管本身也在实验室中不断进化。
先是成分上,从锗改换为硅,比起锗晶体管,硅晶体管可以承受更高的温度和电压。而且硅元素极其常见,广泛存在于岩石和沙砾中,如果地壳总重100斤,那么其中28斤都是硅,可谓取之不尽用之不竭。
再是体积上,由于PN结的实现与晶体管的大小无关,晶体管被越做越小。1952年,一位名叫杰弗里·杜默(Geoffrey Dummer)的英国人更是提出了取消导线,将电子元件紧凑在一块板上的想法,集成电路的概念横空出世。但这对制作工艺的要求很高,整个电子界翘首以盼,等了6年多时间,世界上第一块集成电路终于在1958年9月由德州仪器新聘的工程师杰克·基尔比(Jack Kilby)完成。这是一块长11.1mm、宽1.6mm的锗半导体,上面集成了晶体管、电阻和电容等多种元件。在全人类的共同见证下,这项划时代的伟大发明被时间沉淀出不可估量的价值,基尔比因此获得了2000年的诺贝尔物理学奖。
除了德州仪器,还有一家实力雄厚的半导体公司在集成电路的早期发展中扮演着举足轻重的角色,那就是史上大名鼎鼎的仙童半导体公司。这家公司在1959年发明了关键性的平面工艺,随后,它的创始人之一罗伯特·诺伊斯(Robert Noyce)在1960年用硅发明了更实用的集成电路。从上图可以看出,基尔比的集成电路并不完善,仍然用到了导线,诺伊斯的集成电路才是真正意义上的现代集成电路。结果是,两家公司在整个60年代都为集成电路的发明专利吵得不可开交,最终法院判定,两者的实现技术不同,基尔比和诺伊斯分别独立发明了集成电路,共享了“集成电路之父”的称号。
说到仙童半导体,这家公司的来历很有意思。当时,肖克利眼看着德州仪器靠自己发明的晶体管赚得盆满钵满,内心很不是滋味,于是在1956年,他回到家乡加州圣克拉拉山谷,创办起自己的公司。他招揽了八位能人(其中一位就是诺伊斯),对攻占市场充满信心。
起初,八位员工对他们的老板十分敬仰,可经过一段时间的相处却发现,这位技术上的巨人却是管理上的矮子,他那专横和偏执的作风令他们忍无可忍。更糟糕的是,在硅材料已经成趋势的大背景下,他仍死守着自己发明的锗半导体。八人终于在1957年选择集体离职,并成立了仙童半导体公司。肖克利痛骂他们是“八个叛徒”,他的发财梦破灭了,只好转卖公司,回归学术,受斯坦福大学之邀当了电气工程专业的教授。
虽然肖克利没能实现自己的宏图伟业,却无意间在圣克拉拉山谷播下了半导体的种子。“八个叛徒”在仙童之后又兵分几路创办了其他公司(比如Intel),这些公司的雇员又很快创办自己的公司(比如AMD)。短短几十年间,这些种子像蒲公英般飘散,繁衍出一片引领世界的茂密森林。这片森林,就是如今的电子王国——硅谷。
1959年,就在集成电路和平面工艺相继问世的同时,贝尔实验室仿佛偷看了历史的剧本,正好研制出一种比BJT更适合集成新型晶体管,它的名字很长,叫金属氧化物半导体场效应晶体管(metal–oxide–semiconductor field-effect transistor),简称MOSFET或MOS管。
和BJT一样,MOS管在结构上也分为PNP和NPN两种类型,分别唤作P型MOS管和N型MOS管,简称PMOS和NMOS,两者原理类似,只是极性相反。
下图为N型MOS管,在一大块P型半导体衬底上,嵌着两块N型半导体(P型MOS管则是在N型半导体衬底上嵌入两块P型半导体),它们的表面覆盖着一层绝缘的氧化物(如二氧化硅),氧化物在正对N型半导体的位置被腐蚀出两个孔洞,以金属填充,各引电极曰源极和漏极,两块金属之间的氧化物上另外再镀一块独立的金属,引电极曰栅极。