1、 图灵(Alan Turing)和图灵奖的诞生
正如美国电脑界有冯·诺依曼一样,在英国电脑的进展中,也有一个有巨大影响力的天才,他就是阿伦·图灵。此人对于电脑技术的发展,有着无可替代的影响。
英国现代计算机的起步的是从纳粹德国的“谜”开始的。“谜”(Enigma)是一种密码电报机,由德国人在一战和二战之间研制成功。“谜”能把日常语言变为代码,通过无线电或电话线路秘密传送。它是一个木箱子,配有一台打字机,箱上有26个闪烁不停的小灯泡,与打字机键盘的26个字母相对应。“谜”的设计无懈可击,有一套极精密的解码设置,非一般的电报密码所能比拟。在内行人看来,平白如话,但在旁人,又是无从索解的天书。因此,这台看似平常的机器,有了“谜”的称号。这样,德国的“谜”引起了英国情报部门高度的兴趣。常规的解码方式奈何不了“谜”,怎么办?
这时,天才的数学家图灵出现了。1931年图灵进入剑桥大学国王学院,开始了他的数学天涯。一到那里,图灵开始崭露头角,毕业后去美国普林斯顿大学攻读博士学位,在那里就发明过一个解码器(Encipher),二战爆发后回到剑桥。
在剑桥,图灵是一个妇孺皆知的怪才,常有出人意表的举动。他每天骑自行车到离公寓3公里的一个叫布雷奇莱公园(Bletchley Park)的地方上班,因常患过敏性鼻炎,一遇花粉,鼻涕不止,图灵就常戴防毒面具骑车上班,招摇过市,成为剑桥的一大奇观。
他的自行车链条经常在半道上掉落,要是换了别人,早就去车铺修理了。而图灵偏不,他在琢磨,发现这链条总是踏到一定的圈数时下滑,图灵在骑车时就特别留心计算,于是能做到在链条下滑前一刹那戛然停车!让旁人叹服不已,以为是在玩杂耍。后来他居然在踏脚旁装了一个小巧的机械计数器,到圈数时就停,好换换脑筋想些别的问题。图灵的脑袋转得比自行车飞轮还快。
用图灵的脑袋来破译德国的“谜”看来不是什么难事。二战爆发后,图灵成为英国外交部通信部门战时公务员,主要负责解码。他果然不负众望,成功破译了“谜”。而德国人还蒙在鼓里,还以为他们的“谜”能一直迷下去,照用不误,泄露了大量的核心机密,在战事上屡屡遭挫,战后,图灵被授予帝国勋章。至于图灵如何破译“谜”的,由于英国政府严格的保密法令,一直没有公之于世。所以图灵破译“谜”也成为一个“谜”。
早在30年代初,图灵就发表了一篇著名的论文《论数字计算在决断难题中的应用》,他提出了一种十分简单但运算能力极强的理想计算装置,用它来计算所有能想象得到的可计算函数。它由一个控制器和一根假设两端无界的工作带组成,工作带起着存储器的作用,它被划分为大小相同的方格,每一格上可书写一个给定字母表上的符号。控制器可以在带上左右移动,控制带有一个读写头,读写头可以读出控制器访问的格子上的符号,也能改写和抹去这一符号。
这一装置只是一种理想的计算模型,或者说是一种理想中的计算机。正如飞机的真正成功得力于空气动力学一样,图灵的这一思想奠定了整个现代计算机的理论基础。这就是电脑史上与“冯·诺依曼机器”齐名的“图灵机”。
图灵机被公认为现代计算机的原型,这台机器可以读入一系列的零和一,这些数字代表了解决某一问题所需要的步骤,按这个步骤走下去,就可以解决某一特定的问题。这种观念在当时是具有革命性意义的,因为即使在50年代的时候,大部分的计算机还只能解决某一特定问题,不是通用的,而图灵机从理论上却是通用机。在图灵看来,这台机器只用保留一些最简单的指令,一个复杂的工作只用把它分解为这几个最简单的操作就可以实现了,在当时他能够具有这样的思想确实是很了不起的。他相信有一个算法可以解决大部分问题,而困难的部分则是如何确定最简单的指令集,怎么样的指令集才是最少的,而且又能顶用,还有一个难点是如何将复杂问题分解为这些指令的问题。
此后图灵在国家物理学实验室(NPL)工作,并继续为数字式计算机努力,在那里人发明了自动计算机(Automatic Computing Engine,ACE),在这一时期他开始探索计算机与自然的关系。他写了一篇名为《智能机》的文章于1969发表,这时便开始有了人工智能的雏形。
图灵相信机器可以模拟人的智力,他也深知让人们接受这一想法的困难,今天仍然有许多人认为人的大脑是不可能用机器模仿的。而在图灵认为,这样的机器一定是存在的。图灵经常和其它科学家发生争论,争论的问题就是机器实现人类智能的问题,在今天我们看来这没有什么,但是在当时这可不太容易被人接受。他经常问他的同事,你们能不能找到一个计算机不能回答的问题,当时计算机处理多选问题已经可以了,可是对于文章的处理还根本不可能,但今天的发展证明了图灵的远见,今天的计算机已经可以读写一些简单的文章了。
图灵相信如果模拟人类大脑的思维就可以做出一台可以思考的机器,它于1950写文章提出了著名的“图灵测试”,测试是让人类考官通过键盘向一个人和一个机器发问,这个考官不知道他现在问的是人还是机器。如果在经过一定时间的提问以后,这位人类考官不能确定谁是人谁是机器,那这个机器就有智力了。这个测试在我们想起来十分简单,可是伟大的思想就源于这种简单的事物之中。
现在已经有软件可以通过图灵测试的子测试,软件这个人类智慧的机器反映应该可以解决一些人类智力的问题。在完成ACE之前,图灵离开了NPL,它在曼彻斯特大学开发曼彻斯特自动计算机(Manchester Automatic Digital Machine,MADAM)。他相信在2000年前一定可以制造出可以模拟人类智力的机器,图灵开始创立算法,并使用MADAM继续他的工作。
图灵对生物也十分感兴趣,他希望了解生物的各个器官为什么是这个样子而不是那个样子,他不相信达尔文的进化论,他觉得生物的发展与进化没什么关系。对于生物学,他也用它钟爱的数学进行研究,它的研究对他进行计算机的研究有促进作用。它把生物的变化也看做是一种程序,也就是图灵机的基本概念,按程序进行。最后,这位伟大的计算机先驱于1954年6月7日去世,他终生未娶。
后人为纪念这位“计算机科学之父”,在英国曼彻斯特的Sackville公园为他建造了一尊真人大小的青铜坐像,这尊塑像是2001年6月23日,也就是图灵89岁诞辰那天揭幕的。
图灵去世后的12年,即1966年,美国的计算机协会ACM (Association for Computing Machinery) 确定设立图灵奖。ACM是于1947年9月15日在纽约的哥伦比亚大学成立的。成立的目的旨在推动计算机科学技术的发展和学术交流。ACM建立以来,积极开展各种活动,目前已成为计算机界最有影响的两大国际性学术组织之一(另一为IEEE的计算机协会,即IEEE Computer Society)。图灵奖是ACM于1966年第一个设立的奖项,专门奖励那些在计算机科学研究中作出创造性贡献、推动计算机科学技术发展的杰出科学家。奖金金额不算太高,设奖初期为2万美元,1989年起增至2万5千美元(注:目前为25万美元)。图灵奖对获奖条件要求极高,评奖程序极严,一般每年只奖励一名计算机科学家,只有极少数年度有两名合作者或在同一方向作出贡献的科学家共享此荣。它是计算机界最负盛名、最崇高的一个奖项,有“计算机界的诺贝尔奖”之称。
2、 艾伦 · 佩利(Alan J. Perlis)
程序设计语言的先驱开拓者——艾伦 · 佩利,由于在ALGOL语言定义和扩充上所作出的重大贡献,以及在创始计算机科学教育,使计算机科学成为一门独立的学科上所发挥的巨大作用而成为1966年首届图灵奖获得者。
佩利1922年4月1日生于美国宾夕法尼亚州的匹兹堡。在卡内基理工学院(现卡内基—梅隆大学)学的专业是化学,1942年毕业取得学士学位。因当时还处于二次世界大战期间,而且在珍珠港事件后美国已宣布正式参战,因此佩利被应征入伍,在空军服役。战后他进入加州理工学院研究生院继续深造,改学数学,于1947年取得硕士学位,然后又到麻省理工学院(MIT)攻读博士学位,于1950年取得该学位。1951年他在美国陆军军械部设在马里兰州的阿伯丁试验基地内的“弹道研究实验室”(冯·诺伊曼曾在该研究实验室当顾问)干了一年,然后回到母校MIT参加“旋风”(Whirlwind)计算机计划,为“旋风”编制程序。为了说明佩利参与的“旋风”计划的意义,我们先简要回顾一下计算机诞生初期的发展历史。
大家知道,世界上第一台电子计算机叫“ENIAC”(这是Electronic Numerical Integrator and Computer的词头缩写,意为“电子数字积分器和计算机”),是宾夕法尼亚大学莫尔学院(Moore School)根据上述阿伯丁弹道研究实验室为各种火炮计算弹道、编制射击表的需要于1943年6月与联邦政府签订10万美元的合同而研制的。项目由约翰·莫奇利(John William Mauchly,1907—1980)负责逻辑设计,伊克特(John Presper Eckert,Jr,1919—1995)负责电路设计。ENIAC是一台十进制并行计算机,能同时处理10个十进制数,采用电子管电路,时钟频率100000 Hz,加法时间0.2 ms,乘法时间2.8 ms,是一个占地1500ft2(约139 m2),重30t,功耗150kw的庞然大物,于1946年2月完成,未能参加第二次世界大战,但被洛斯阿拉莫斯(Los Alamos)国家实验室用于计算原子弹爆炸的突变问题,后来又曾用于阿伯丁的空军试验场,一直运行到1955年10月才停止工作。世人一直公认莫奇利和伊克特是ENIAC的发明者,但后来在两家计算机公司的诉讼中,法院判定他们剽窃了约翰·阿塔那索夫(John Vincent Atana-soff,1903—1995)的构思和设计。这个涉及世界上第一台电子计算机的发明权案件曾经轰动美国。但有趣的是,虽然阿塔那索夫确实曾在1941年把自己关于构思计算机的设想告诉过莫奇利,后者也确实因此受到启发而写出了有关论证报告并设计出了ENIAC,但社会舆论似乎并不支持法院的判决,现在一提到ENIAC,几乎众口一词地仍然说是莫奇利和伊克特发明的,没有人说是阿塔那索夫发明的,这对美国法院的判决真是一种讽刺。
ENIAC虽然是世界上第一台电子计算机而被载人史册,但它不具备存储程序的能力,程序要通过外接电路板输入。要改变程序必须改接相应的电路板,对于每种类型的题目,都要设计相应的外接插板。这不是理想的结构,不符合冯·诺伊曼早就提出的存储程序的设想。那么世界上第一台存储程序式计算机是哪一台呢?有些资料认为是前面曾经提到过的曼彻斯特大学的MARK I,但现在一般说法是英国剑桥大学威尔克斯(M.V.Wilkes,1967年图灵奖获得者)设计和完成于1949年5月的EDSAC。实际上,最早开始设计与实施存储程序式计算机的还是莫尔学院的EDVAC(Electronic Discrete VariableAutomatic Computer的词头缩写,意为“电子分离变量自动计算机”)。这是1945年3月(当时ENIAC正在安装调试阶段),由冯·诺伊曼本人与莫奇利、伊克特等人经过两天会谈、讨论后制定的设计方案,采用电子管和半导体二极管,用水银延迟线作存储器,时钟频率1MHz,字长32bit。由于ENIAC的原因,EDVAC的研制从1947年才开始,加上莫奇利和伊克特两人后来因故离开了莫尔学院,使工程遇到困难,1952年(有的资料说1951年)才完成,这才使威尔克斯的ED—SAC“后来居上”(详见后面关于威尔克斯的介绍)。
但不管EDSAC也好,EDVAC也好,都是串行计算机(serial com—Duter),即数据的传送和运算是按位逐一进行的,这样的计算机运算部件少,运算也简单,但速度慢,不能满足某些应用的需要。那么世界上第一台存储程序式的并行计算机是哪一台呢?这就是前述“旋风”计算机。“旋风”的主要设计者和研制者是MIT的弗里斯特(JayWright Forrest)。弗里斯特也是受军方委托,用风洞来研究飞机稳定性时根据数据处理的需要而设计“旋风”的。“旋风”受EDSAC的影响采用存储程序方式,但鉴于处理飞机稳定性需要2000条以上指令,必须改串行为并行,但又要照顾机器体积不宜过大,因此设计成16位字长的并行计算机。“旋风”的另一项创新是采用英国曼彻斯特大学威廉斯(FrederiC calland Williams,1911—1977)发明不久的阴极射线管作内存储器。“旋风”的研制工作从1946年开始,1950年试运行成功。20世纪50年代冷战加剧的形势下,美国军方对“旋风”寄予极大希望,空军每年投资100万美元(试比较一下,ENIAC的总经费才10万美元),MIT也专门成立了著名的“林肯实验室”,以弗里斯特原先的实验室为核心,研究“旋风”的军事应用。1951年,“旋风”与当时著名的SAGE(Semi-Automatic Ground Environment,即半自动地面防空系统,包括全美17个防区)首次实现连接,把位于卡德角的防空警戒雷达所截获的信息送到MIT,由“旋风”计算机进行处理、分析和存储。这是历史上计算机与通信相结合的先驱。弗里斯特还在20世纪40年代末和美籍华人科学家兼企业家王安(Wang An,1920—1990)几乎同时分别独立地发明了磁心存储器,并把它用在“旋风”中以代替阴极射线管存储器,从而进一步大大提高了“旋风”的性能。
佩利在“旋风”上工作到1952年9月。之后他来到普渡大学,在那里他创建了全美大学中的第一个计算中心,开创了在大学中建立计算中心的先河。他出任普渡大学计算中心的第一任主任。在他的努力下,计算中心先安装了一台IBM的CPC计算机(Card ProgrammedCalculator),以后更新为Datatron 205。佩利为之设计了称为IT(Inter-hal Translator)的语言,并开发了IT的编译器。1956年佩利转到卡内基理工学院,“故伎重演”,又推动该校成立了计算中心并出任主任,配置了IBM 650计算机。佩利把他在普渡大学开发的IT及其编译器移植到IBM 650上,曾经在美国许多大学的IBM 650上被广泛采用;在IT的基础上,佩利和史密斯(J.Smith)、佐轮(H.Zoren)、伊万斯(A.Evans)等人一起为IBM 650设计与开发了新的代数语言和汇编语言。这些工作奠定了佩利作为计算机程序设计语言的先行者的地位。因此,当ACM于1957年成立程序设计语言委员会以便与欧洲的同行合作,设计通用的代数语言的时候,佩利被理所当然地看作是最佳人选而被任命为这个委员会的主席。1958年,在苏黎世举行的ACM小组和以当时联邦德国的应用数学和力学协会GAMM为主的欧洲小组的联合会议上,两个小组把他们关于算法表示法的建议综合为一,形成了Algol 58(开始时的名称叫做“国际代数语言”,即International Algebraic Language,简称IAL。后来改叫Algol 58)。在Algol 58的基础上,1960年1月在巴黎举行的有全世界一流软件专家参加的讨论会上,确定了程序设计语言Algol 60,发表了“算法语言Algol 60报告”。1962年又发表了“算法语言Algol 60的修改报告”。Algol 60是程序设计语言发展史上的一个里程碑,它标志着程序设计语言由一种“技艺”转而成为一门“科学”,开拓了程序设计语言的研究领域,又为后来软件自动化的工作以及软件可靠性问题的发展奠定了基础。而后像1967年出现的首次引进“类型”的概念,把数据和被允许施行于这些数据之上的运算结合为一个统一体,因而成为现代抽象数据类型的开端以及第一个面向对象的语言SIMULA67,1971年出现的著名的PASCAL等语言,也都是在Algol 60的基础上加以扩充而形成的。Algol60的主要特点有:
1.局部性首次引进局部性概念,既扩充了语言的表达能力,又可节省内存空间,提高程序的紧凑性。
2.动态性语言含有动态成分,从而明显提高了语言的表达能力(当然也相应增加了实现中的开销)。
3.递归性递归性的引进开拓了软件的研究领域,促进了软件的发展。
4.严谨性它的语法和语义均有严格的描述,特别是语法,采用了著名的巴克斯范式BNF,结构清晰,理论严谨。
在Algol 58和Algol 60的形成和修改过程中,佩利都起了核心和关键的作用。佩利之所以荣获首届图灵奖,主要就是因为他在这方面的重大贡献。
与此同时,在佩利的积极组织下,卡内基理工学院率先在大学生中开设程序设计课程。在此之前,有关程序设计的知识是作为“数值分析”课程内容的一部分予以介绍的。程序设计课的开设是计算机科学教育的开端。这引起了计算机的最大用户——美国国防部的重视,由它的高级研究计划署ARPA出面,出资资助对计算机科学及其教育立项研究,其结果是20世纪60年代中期首先在卡内基理工学院、斯坦福大学、MIT等少数几个大学建立起了计算机科学系和计算机科学研究生院,使计算机科学脱离电气工程、数学等学科而成为一门独立的学科。鉴于佩利在其中所起的巨大作用,佩利被称为“使计算机科学成为独立学科的奠基人”——A founding father of Computer Science as a separate discipline。而在卡内基理工学院(现卡内基—梅隆大学),佩利和西蒙(H.A.Simon)、纽厄尔(A.Newell),后二人是1975年图灵奖获得者,三人被称为“计算机系的三驾马车”。
1971年,佩利离开卡内基—梅隆大学,加盟新成立的耶鲁大学计算机系,曾数度出任系主任,为耶鲁大学计算机系的建设和发展作出了重大贡献。其间,1977—1978年,他曾在加州理工学院执教。因此,佩利可谓“桃李满天下”,尤其是美国的第一批计算机科学博士生,绝大部分都是佩利的弟子。
佩利也是计算机学术组织和学术交流活动的积极倡导者和组织者。1962—1964年他出任ACM主席。著名的杂志Communications of ACM也是由他倡议创办的,并在1958—1962年担任第一任主编。作为知名学者,他经常到世界各国讲学或作报告,足迹遍及前苏联、丹麦、意大利、以色列、墨西哥、秘鲁、英国、荷兰、委内瑞拉……其中也曾两次到中国讲学。他也是“乒乓外交”后,最早(1972年7月)到中国访问的美国计算机科学家代表团的成员之一。
佩利说过这样一句话:“任何名词都可以变为动词”(any noun canbe verbed)。他的意思是说,任何远大的理想、志向、抱负和对新事物的追求,通过努力和不懈的实践,都是可以实现的。这是佩利总结自己的一生所形成的至理名言。
佩利1973年当选为美国艺术和科学院院士,1976年当选为美国工程院院士。除了获得图灵奖外,他还在1984年获得AFIPS的教育奖,曾被普渡大学、滑铁卢大学等多所大学授予名誉博士学位。1990年2月7日,佩利因心脏病在康涅狄格州的纽哈芬去世,享年68岁。
3、 埃德斯加 · 狄克斯特拉(Edsgar Wybe Dijkstra)
1972年的图灵奖授予荷兰的计算机科学家埃德斯加 · 狄克斯特拉。
狄克斯特拉因最早指出“goto是有害的”以及首创结构化程序设计而闻名于世。事实上,他对计算机科学的贡献并不仅仅限于程序设计技术。在算法和算法理论、编译器、操作系统诸多方面,狄克斯特拉都有许多创造,作出了杰出贡献。1983年,ACM为纪念Communications of ACM创刊25周年,评选出从1958—1982年的四分之一个世纪中在该杂志上发表的25篇有里程碑意义的论文,每年一篇,狄克斯特拉一人就有两篇入选,是仅有的这样的两位学者之一(另一位是英国学者C.A.R.Hoare,也是计算机先驱奖获得者)。
狄克斯特拉1930年5月11日生于荷兰鹿特丹的一个知识分子家庭,在兄弟姊妹4人中排行第三。他的父亲是一名化学家和发明家,曾担任荷兰化学会主席。他母亲则是一位数学家。狄克斯特拉的少年时代是在德国法西斯占领军的铁蹄下度过的。由于食物短缺,他被送到乡下他父亲的一个朋友那里去。纳粹德国投降后,1945年7月,十分虚弱的狄克斯特拉才和家人重新团聚。狄克斯特拉原打算学法律,毕业后到联合国工作,为维护世界和平服务。但他中学毕业时,数理化成绩都特别好,因此他父亲说服了他,1948年进莱顿大学学习数学与物理。在学习理论物理的过程中,狄克斯特拉发现这个领域中的许多问题都需要进行大量复杂的计算,于是决定学习计算机编程。1951年,他自费赴英国参加了剑桥大学举办的一个程序设计培训班,学习在EDSAC(Electronic Delay Storage Automatic Calculator,这是由另一位首届计算机先驱奖获得者威尔克斯主持设计与开发的世界上第一台存储程序式电子计算机)上的编程方法,这使他成为世界上第一批程序员之一。第二年,阿姆斯特丹数学中心了解到这一情况,拟聘他为兼职程序员。狄克斯特拉开始时有些犹豫,因为世界上当时还没有“程序员”这一职业。数学中心的计算部主任、Algol语言的设计者之一、荷兰的计算技术先驱维京格尔藤(A.van Wijingaarden,1916—1987,因在设计Algol 68时,为解决上下文有关性这一难题而提出了一种具有很强描述能力的新的文法,称做二级文法又称W文法而闻名。他是1986年计算机先驱奖获得者之一,也曾对另一位首届计算机先驱奖获得者N.Wirth的研究产生过影响)对他说,目前程序设计虽然还没有成为学科,不被重视,但既然计算机已经有了,正处于开创阶段,你未来就有可能使程序设计成为一个受人尊敬的学科。这段话说动了狄克斯特拉,使他接受了这个职位,而且越干越有兴趣,这样,他在第二年就结束了在莱顿大学的学业,成为数学中心全日制的工作人员,从此进入计算机领域,并且正如维京格尔藤所预言的那样,逐渐成为该领域的知名专家,创造出了许许多多的“第一”。
1956年,他成功地设计并实现了在有障碍物的两个地点之间找出一条最短路径的高效算法,这个算法被命名为“狄克斯特拉算法”,解决了机器人学中的一个十分关键的问题,即运动路径规划问题,至今仍被广泛应用,被认为是利用“贪心法”(greedy method)设计算法的一个成功范例。
1959年,在数学中心将他们原先的ARMAC计算机进行升级的过程中,狄克斯特拉设计了一种处理程序,成功地解决了“实时中断”(real-time interrupt)问题。狄克斯特拉的博士论文就是以此为课题完成的,并在阿姆斯特丹大学通过论文答辩而获得博士学位。
1960年8月,Algol 60文本推出刚刚半年多,狄克斯特拉和他在数学中心的同事仲纳凡尔特(J.A.Zonneveld)一起就率先实现了世界上第一个Algol 60编译器,比欧美其他各国学者实现Algol 60早一年还多。这一成就引起各国计算机学者的惊叹,并因此奠定了狄克斯特拉作为世界一流计算机学者在科学界的地位。
1962年,狄克斯特拉离开数学中心进入位于荷兰南部的艾恩德大学(Eindhoven Technical University)任数学教授。在这里,X8计算机的开发,设计与实现了具有多道程序运行能力统——THE Multiprogramming System。THE是艾恩德霍芬技荷兰文Technische Hoogeschool Eindhoven的词头缩写。狄克THE这个系统中所提出的一系列方法和技术奠定了计算作系统的基础,尤其是关于多层体系结构、顺序进程之间的斥机制这样一些重要的思想和概念都是狄克斯特拉在THE中首先提出并为以后的操作系统如UNIX等所采用的。为了在单处理机的情况下确定进程(process)能否占有处理机,狄克斯特拉将每个进程分为“就绪”(ready)、“运行”(running)和“阻塞”(blocking)三个工作状态。由于在任一时刻最多只有一个进程可以使用处理机,正占用着处理机的进程称为“运行”进程。当某进程已具备了使用处理机的条件,而当前又没有处理机供其使用,则使该进程处于“就绪”状态,当运行进程由于某种原因无法继续运行下去时,就停止其占用处理机,使之进入“阻塞’’状态,待造成其退出运行的条件解除,再进入“就绪”状态。而对系统中所有同时运行的进程之间所存在的相互制约的同步(synchronization,指为了避免错误,在一个进程访问共享数据时,另一个进程不访问该数据)和互斥(mutually-exclusive,指两个进程不能同时在一个临界区中使用同一个可重复使用的资源,诸如读写缓冲区)两个关系,狄克斯特拉巧妙地利用火车运行控制系统中的“信号灯”(semaphore,或叫“信号量”)概念加以解决。所谓信号灯,实际上就是用来控制进程状态的一个代表某一资源的存储单元。例如,P1和P2是分别将数据送入缓冲B和从缓冲B读出数据的两个进程,为了防止这两个进程并发时产生错误,狄克斯特拉设计了一种同步机制叫"PV操作”,P操作和V操作是执行时不被打断的两个操作系统原语。执行P操作P(S)时信号量S的值减1,若结果不为负则P(S)执行完毕,否则执行P操作的进程暂停以等待释放。执行V操作V(S)时,S的值加1,若结果不大于0则释放一个因执行P(S)而等待的进程。对P1和凹可定义两个信号量S1和S2,初值分别为1和0。进程P1在向缓冲B送人数据前执行P操作P(S1),在送人数据后执行V操作V(S2)。进程P2在从缓冲B读取数据前先执行P操作P(S2),在读出数据后执行V操作V(S1)。当P1往缓冲B送入一数据后信号量S1之值变为0,在该数据读出后S1之值才又变为1,因此在前驱数未读出前后续数不会送入,从而保证了P1和P2之间的同步。我国读者常常不明白这一同步机制为什么称做PV操作,原来这是狄克斯特拉用荷兰文定义的,因为在荷兰文中,通过叫passeren,释放叫,VRIJGEVEN,PV操作因此得名。这是在计算机术语中不用英语表达的极少数的例子之一。
4、 唐纳徳 · 克努特(Donad Ervin Knuth)
1974年的图灵奖授予了当时年青的唐纳徳 · 克努特。
克努特1938年1月10日生于威斯康辛州。他因为洋洋数百万言的多卷本《计算机程序设计艺术》( The Art of Computer Programming)而荣获此殊荣。该多卷本堪称计算机科学理论与技术的经典巨作,有评论认为其作用与地位可与数学史上殴几里得的《几何学原理》相比。
克努特从小喜欢学习和音乐,并表现出与众不同的才能。在数学上,也很早就表现出天才。1956年进入俄亥俄州克利夫兰的开思理工学院攻读物理。大学一年级结束以后的暑假,克努特在学校打工,负责把统计数字画成图表。碰巧他工作室的隔壁就是计算机房,新到了一台IBM650。当时的计算机体积都很庞大,有控制台及其上面的指示灯等,计算机工作时指示灯快速闪烁变化出不同的图案,这引起克努特极大的好奇与兴趣,他接连好几天彻夜不眠地呆在计算机房,观察它的工作,钻研使用手册,探究计算机的奥秘。一年以后,他终于改学数学,并与计算机结缘。1960年,克努特在开思理工学院毕业,同时获学士和硕士学位。之后他进入加州理工学院研究生院,1963年获博士学位。后转入斯坦福大学任教。
克努特至今进行了两大工程,第一个大工程就是《计算机程序设计艺术》系列,计划出七卷,第一卷《基本算法》于1968年出版,第二卷《半数字化算法》于1969年出版,第三卷《排序与搜索》于1973年出版,后面尚在写作之中。在出版过程中,克努特根据自己在校对清样时的感受,决心对排版技术进行彻底改造,因此终止了第一期工程,而开始其第二期工程。为此,克努特花费了整整九年的时间和精力,结果就是对整个西文印刷业带来了革命性变革的TEX排版软件和METAFONT字型设计软件。这两个软件为克努特赢得了ACM的另一个奖项:1986年度的软件系统奖。克努特的两大工程都取得了很大的成功。《计算机程序设计艺术》一书以其内容的丰富和深刻喻为经典,有人甚至称之为“计算机的圣经”,被译成多国文字在世界各国广为传播。
5、 约翰 · 巴克斯(John Warner Backus)
1977年的图灵奖授予了世界上第一个高级程序设计语言FORTRAN和最广泛流行的元语言BNF的发明人约翰 · 巴克斯。
Backus 1924年生于美国费城,家庭富裕。因为家庭条件优越,小Backus无忧无虑,在人生的最初岁月,大有玩世不恭的意思,成了一个纨绔子弟。在宾夕法尼亚州著名的Hill中学,他经常考试不及格,而且常常旷课。据他自己回忆:“那时我讨厌学习,功课老不及格,只是晃来晃去地消耗时间。一心想着暑假去新罕布什尔州的夏令营,划船,玩耍。”“学校里有趣的地方就是有那么多规矩你可以去违反。”(The delight of that place was all the rules you could break)
直到18岁时(1942年)才进入弗吉尼亚大学。化学家出身的父亲让他子承父业,他喜欢化学理论,但对摆弄瓶瓶罐罐做试验可不感冒,因此到第二学期的时候,每周就只上一堂课(据说还是音乐欣赏课)了,最终被学校开除,结束了短暂的第一次大学生涯。
很快Backus就参军入伍,在佐治亚州Stewart军事基地担任防空任务。但在能力测试中,他表现出色,被美国军方送到匹兹堡大学学习工程预科,在另一次能力测试中,他显示出医学才能,于是又被送到了哈弗福德学院(Haverford College)医学预科学医。期间他被诊断出脑瘤(一说骨瘤),手术植入了一块金属板。1945年他进入纽约一家医学院,但是他发现学校里“不鼓励思考,只是死记硬背”,9个月后就退学了。
他后来回忆说:“我真不知道自己这一辈子到底该干什么。我想弄一套好的高保真音响,可那时候这种东西还不存在。于是,我进入了一家无线电技师学校。在那里我遇到了一位好老师——这可是我人生的第一次,他让我和他一起为一个杂志计算某些电路的特性。计算很繁琐,但是它让我对数学发生了兴趣。我发现,原来数学是有实际用途的。”
他从头再来,进入哥伦比亚大学学习数学。在1950年毕业前,他偶然地参观了IBM公司麦迪逊大街计算机中心,被宏伟的SSEC大型电子管计算机迷住了。其间他告诉讲解员自己在找工作,这位女讲解员建议他去找主管谈谈。Backus觉得自己蓬头垢面邋邋遢遢的,不想去,但架不住讲解员一个劲儿的鼓励。没想到,只是被不那么正式地口头提问了一些数学题,他就当场通过,这样进入了IBM。
1950年,他成为IBM的程序员。他的工作除了编程(使用打孔带)之外,就是维护那台1948年建成、由一万多个真空管和两万多个继电器组成、还为1969年阿波罗登月计划立下汗马功劳的SSEC。三年中,除了一个复杂的计算月亮位置的程序外,他还开发了一个名为Speedcoding的程序,第一次实现了用诺伊曼提出的比例因子存储和计算浮点数。
二进制层次编程的艰辛和困难,使Backus意识到高级语言的必要性。1953年,他向IBM高层提交了一份备忘录,提出为新型的704计算机开发一种高级编程语言,降低开发成本。他论证说,当时程序员的薪水已经赶上硬件成本。负责应用科学部的Cuthbert Hurd很快就批准了这一计划。Backus后来称赞:“他真的很懂行。”
这其中还有一个小插曲,当时冯诺伊曼正在担任IBM公司顾问,每周一次“升堂”审查公司的各种新科研计划。他当时看到了FORTRAN的想法,丝毫没有兴奋之感,反而这样问Backus:“为什么除了机器语言之外,你还想弄点别的呢?” 当时也在场的Frank Beckman回忆到,冯诺伊曼将这一计划斥为“图灵short code概念的一种应用”。有趣的是,冯诺伊曼此后还一直坚持这种观点,他在普林斯顿的学生Donald Gillies回忆说,为了不像大家那样手工将程序汇编为二进制代码,他曾经开发了一个汇编程序,冯诺伊曼发现后非常生气,说:“这是在浪费宝贵的科学计算设备来干琐碎的杂事!”
1954年,Backus很快招募到了Irving Ziller和Harlan Herrick,开始了项目的开发。项目小组最后有10个人,都是二三十岁的年轻人,背景出处各不相同,Backus注重的只有一点:解决问题的能力。Backus的管理非常灵活,没有太正式的工作时间,虽然可能会很长,冬天工作后大家都出去打雪仗,对于公司一套严格的考评制度,Backus认为不适合程序员,将其束之高阁。
设计一种语言并不难,描述FORTRAN语言草案的论文Preliminary Report, Specifications for the IBM Mathematical FORmula TRANslating System, FORTRAN于当年年中发表。难的是编译器的设计,Backus本来希望在六个月内完成,最后却花了两年多。1956年,语言手册完成,1957年4月,有25000行代码存储在磁带上的第一个FORTRAN编译器发布。一个新的时代开始了。
受FORTRAN影响,ACM和德国应用数学与力学学会(GaMM)共同提议开发一种标准化的高级语言。1958年5月于苏黎世举行的国际性会议群贤毕集,有Backus、Bauer、Perlis等等大师。这个国际协作的结果,就是ALGOL语言。
开发FORTRAN之后,Backus开始思考计算机程序设计的其他基础方面,1959年他提出了BNF。后经2005年图灵奖得主Peter Naur改进,又经1984年图灵奖得主N. Wirth扩充为EBNF(Extended BNF)。
此后,Backus在反思FORTRAN设计得失的基础上,全力从事函数级程序设计语言的研究和开发,成果包括FP语言和FL语言。此外,他还提出了非冯诺伊曼结构的规约机。
Backus的一生值得我们思考的地方很多,这里先举出一些:
他不断进取的精神。在功成名就之后,他仍然耗尽心力,开发未必能够成功的函数级语言。
对后来者的引导极为重要,无论你身处什么位置,请用自己的心去引导那些年青人。看看Backus一生中的两个关键人物:无线电技校老师和IBM的讲解员。
教育制度,如何能够给人以更多的机会?Backus显然是个天才,但是为什么那么长时间没有找到方向?为什么他又能在20多岁进入正轨?
权威审查不可全信。各人都有自己的局限。冯诺伊曼这样的大师也不能免。他之所以会对高级语言如此敌视,与他主要从事理论,缺乏程序设计实践的背景密不可分。
《纽约时报》的讣告是这样结尾的:“创新,” Backus先生说,“就是不断地尝试和出错的过程”,“你需要勇于失败,” 他说,“你不得不想出许多想法,然后努力工作,只是为了证明这些想法不可行。如此不断反复,最后你就会发现那个可行的想法了。”
6、 罗伯特 · 弗洛伊德(Robert W.Floyd)
1978的图灵奖授予了美国科学家罗伯特 · 弗洛伊德,他是在程序正确性证明方面,提出前后断言法(pre- and post- assertion method)的创始人,并在算法、程序设计语言的逻辑定义、自动程序综合、自动程序验证、编译理论和实现等方面都作出了创造性的贡献。
历届图灵奖得主基本上都有高学历、高学位,绝大多数有博士头衔。这是可以理解的,因为创新型人才需要有很好的文化素养,丰富的知识底蕴,因而必须接受良好的教育。但事情总有例外,1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德就是一位“自学成才的计算机科学家”(a Self-Taught Computer Scientist)。
弗洛伊德1936年6月8日生于纽约。说他“自学成才”并不是说他没有接受过高等教育,他是芝加哥大学的毕业生,但学的不是数学或电气工程等与计算机密切相关的专业,而是文学,1953年获得文学士学位。20世纪50年代初期美国经济不太景气,找工作比较困难,因学习文学而没有任何专门技能的弗洛伊德在就业上遇到很大麻烦,无奈之中到西屋电气公司当了二名计算机操作员,在IBM650机房值夜班。我们知道,早期的计算机都是以批处理方式工作的,计算机操作员的任务就是把程序员编写好的程序在卡片穿孔机(这是脱机的辅助外部设备)上穿成卡片,然后把卡片叠放在读卡机上输入计算机,以便运行程序。因此,操作员的工作比较简单,同打字员类似,不需要懂计算机,也不需要懂程序设计。但弗洛伊德毕竟是一个受过高等教育的人,又是一个有心人,干了一段操作员,很快对计算机产生了兴趣,决心弄懂它,掌握它,于是他借了有关书籍资料在值班空闲时间刻苦学习钻研,有问题就虚心向程序员请教。白天不值班,他又回母校去听讲有关课程。这样,他不但在1958年又获得了理科学士学位,而且逐渐从计算机的门外汉变成计算机的行家里手。1956年他离开西屋电气公司,到芝加哥的装甲研究基金会(Armour Research Foundation),开始还是当操作员,后来就当了程序员。1962年他被马萨诸塞州的Computer Associates公司聘为分析员。此时与Warsall合作发布Floyed-Warshall算法。1965年他应聘成为卡内基—梅隆大学的副教授,3年后转至斯坦福大学,1970年被聘任为教授。之所以能这样快地步步高升,关键就在于弗洛伊德通过勤奋学习和深入研究,在计算机科学的诸多领域:算法,程序设计语言的逻辑和语义,自动程序综合,自动程序验证,编译器的理论和实现等方面都作出创造性的贡献。其中包括:1962年,弗洛伊德完成了Algol 60编译器的开发,成功投入使用,这是世界上最早的Algol 60编译器之一,而且弗洛伊德在这个编译器的开发中率先融入了优化的思想,使编译所生成的目标代码占用空间少,运行时间短。弗洛伊德优化编译的思想对编译器技术的发展产生了深刻的影响。随后,他又对语法分析进行了系统研究,大家现在熟知的优先文法(precedence grammar),限界上下文文法(bounded context grammar)等都是弗洛伊德在这个时期首先提出来的。优先文法解决了自底向上的语法分析中的首要任务:如何找到“句柄”,也就是当前需要进行归约的符号串。弗洛伊德通过对不同的符号定义不同的优先级,解决了这个问题。
在算法方面,弗洛伊德和威廉姆斯(J.Williams)在1964年共同发明了著名的堆排序算法HEAPSORT,这是与英国学者霍尔 (C.A.R.Hoare,1980年图灵奖获得者)发明的QUICKSORT齐名的高效排序算法之一。此外还有直接以弗洛伊德命名的求最短路的算法,这是弗洛伊德利用动态规划(dynamic programming)的原理设计的一个高效算法。
在程序设计方面,计算机科学家非常关心的一个重要问题是如何表达和描述程序的逻辑,如何验证程序的正确性。1967年,在美国数学会AMS举行的应用数学讨论会上,弗洛伊德发表了那篇引起轰动并产生了深远影响的论文,即“如何确定程序的意义”(Assigning Meanings to Programs)。这篇论文在程序逻辑研究的历史上,是继麦卡锡(J.McCarthy,1971年图灵奖获得者)在1963年提出用递归函数作为程序的模型这一方法以后最重大的一个进展。麦卡锡倡导的方法对于一般程序,包括大型软件确实是行之有效的,但它有一个不足,即对于许多以命令方式编写的软件,其中包括赋值语句,条件语句,用While实现循环的语句……对这样的程序用递归定义的函数去证明其正确性就很不方便了。正是为了解决这个问题,弗洛伊德在上述论文中提出了一种基于流程图的表达程序逻辑的方法。这个方法的主要特点就是在流程图的每一弧线上放置一个“标记”(tag),也就是一个逻辑断言,并且保证只要当控制经过这个弧线时该断言一定成立。弗洛伊德的主要贡献在于解决了基于这种标记的形式系统的细节,证明了这种系统的完备性,解决了如何证明程序终结的问题。弗洛伊德还引入了验证条件的概念,包括流程图的一个组成部分(方框、圆框等)及其人口和出口处的标记。为了证明带标记的流程图的正确性,只要证明其中每一组成部分的验证条件成立就行了。弗洛伊德提出的方法被叫做“归纳断言法”(inductive assertion method),或前后断言法(pre·and post-assertion method)。在框图每个断点i上所加的逻辑断言即标记就叫i点的归纳断言,说明程序执行经过此点时在各输入变量x和各程序变量丁之间应存在的关系,以谓词Pi(x,y)的形式表示。若程序从断点i经过路段。到下一断点j的验证条件以Ra(x,y)表示,丁的值在。上的变化以ha(x,y)表示,则只要能证明下式恒真:
(∨x)(∨y)[pi(x,y)∧Ra(x,y) Pj(x,ha(x,y))]
程序从i到j的部分正确性也就证明了。
虽然用归纳断言法不能证明程序的完全正确性,因为它必须以程序能够终结为前提,但由于弗洛伊德在论文中同时也考虑了如何证明程序终结的问题,因此弗洛伊德的归纳断言法也就有了普遍的意义。
弗洛伊德在同年发表于《ACM学报》(Journal of ACM)10月号上的另一篇论文中,还第一次把“不确定性”概念引入程序。所谓“不确定性程序”(non deterministic program)就是根据操作规则有多种操作可供选择,而只选其中之一搜索下去的程序。这对人工智能问题的研究具有十分重要的意义。
此外,弗洛伊德还和伊万斯(R. 0.Evans,因设计世界上第一个类比推理程序Analogy而闻名于世的学者。Analogy是可以判定几何图形是否类似的人工智能程序)一起设计了一种称为产生式语言的特殊的程序设计语言FPL(Floyd-Evans Production Language),用来编写计算机语言的语法分析程序。之所以称它为产生式语言,是因为用它编写的程序由一系列产生式(或称归约式)组成。实际上,用 FPL编好语法分析程序以后,如果再插入语义子程序,就可以构成一个完整的编译器。用FPL语言编写的程序简称PP程序,由以下5个部分按自左至右顺序组成:
1.标号(可有可无);
2.栈顶符号串;
3.前看符号串(或称窗口符号串);
4.归约符号;
5.语义动作。
执行一个PP程序的方法是:依次检视各PP的第三部分。若某PP的第三部分和输入的前看符号串一致,则进一步检视此PP的第四部分,若非空,表示要进行归约,此时把它的第二部分和当前实际的栈顶符号串相比。如果能匹配上,则实行归约,即删去实际的栈顶符号串,用第四部分代替之,然后执行第五部分的动作。若此PP的第四部分为空,表示当前无归约可做,直接执行第五部分的动作即可。
弗洛伊德是1978年12月4日在华盛顿举行的ACM年会上接受图灵奖的。他发表了题为“程序设计的风范”(The Paradigms of Programming)的演说。演说全文刊于Communications of ACM,1979年8月,455-460页,也可见《前20年的ACM图灵奖演说集》(ACM Turing Award Lectures——The First 20Years:1966—1985,ACM Pr.),131—142页。弗洛伊德在演说中对结构化程序设计,递归协同例程(recursive coroutine),动态程序设计,基于规则的系统,状态变换机制(state-transition mechanism)等各种不同程序设计风范进行了比较,并介绍了自己在研究工作中如何根据具体情况应用不同风范的例子,很给人以启示。时间虽然已过去20多年,他的例子也许有些过时,但他的观点至今仍然是有效的。