程序设计、数据结构、编译相关图灵奖得主简介之二

7、 肯尼思 · 艾弗森(Kenneth Eugene lverson)

    1979年度的图灵奖首次授予一位加拿大学者、时在IBM公司沃森研究中心工作的肯尼思·艾弗森。他是因为在开发交互式程序设计语言APL中作出开创性工作,从而为程序设计语言的理论和实践作出卓越贡献而获此殊荣的。

    艾弗森1920年12月17日生于加拿大艾伯塔省的卡姆罗斯(Camrose,Alberta)。第二次世界大战期间他被应征入伍而中断学业。1946年退伍后艾弗森进入位于安大略湖畔的城市金斯顿(Kingstown)的昆士大学(Queen’s University)学习,兼修数学和物理,1950年大学毕业获得学士学位时艾弗森年已30。但他立志继续深造,进了美国哈佛大学研究生院,先后于1951年和1954年拿下了应用数学的硕士学位和博士学位。他攻读博士学位时的导师是著名的数学家和计算机科学家、在20世纪30年代末40年代初设计了世界上第一台现代的自动计算机Mark I的艾肯教授(Howard Aiken,1900—1973)。当时的IBM总裁托马斯·沃森(Thomas Watson)正是由于支持艾肯的Mark I计划而把IBM从制造商业机器的公司引向计算机产业而发展成为“蓝色巨人”的。艾弗森的博士论文课题是用计算机求解线性微分方程时如何建立经济的I/0模型,这个论文课题诱导他设计与实现了著名的程序设计语言APL(A Programming Language)。APL以现有的成熟的数学符号为基础,加入许多基于数组(array,这是APL中唯一的数据类型)的基本运算符,就可以用极少、极紧凑的语句定义非常复杂的表达式。APL的两大与众不同的特点是:

    1.变量没有显式定义的类型。变量类型是由变量的具体用途确

定的,这就是APL首创的所谓“弹性数据结构”(elastic data structure)。

    2.没有一般语言所常用的控制结构,如while,for,if-then-else等。这类控制结构在APL中被递归函数、数组操作及控制转移符“→”所代替(APL中的“一”相当于其他语言中的goto)。此外,APL中所有的运算符都具有相同的优先级,一律按从右到左的顺序进行计算,这也是同一般语言很不一样的。

    APL从构思到实现经历了一个比较曲折和长期的过程。艾弗森在完成其博土论文的过程中就提出了APL的初稿,最初仅是为了清晰而精确地表达问题以利于书写和教学而提出的。博土论文答辩以后艾弗森留校工作,对APL进行完善与发展,并试图在计算机上实现,但一直缺乏支持和客观条件。因此艾弗森于1960年离开哈佛到IBM的沃森研究中心,在这里他说服了他的一些同事和他一起在IBM的主机上实现了APL,这已经是他提出APL以后约10年的事了。有趣的是,艾弗森实现APL的经历和他的导师艾肯实现Mark I的经历十分相似:艾肯设计出Mark工以后,也是由于在哈佛没有得到足够的支持而转向私人企业寻求支持最后与IBM签订合作协议的。

    最早的APL版本采用解释方式而非编译方式,有人机交互功能,类似于台式的袖珍计算器,用起来很方便,因此在科学与工程计算,统计分析,财会等人员中很受欢迎。

在程序设计语言发展的历史上,曾经出现这样一件轰动一时的大事:1969年,IBM在其总部纽约州阿尔蒙克(Armonk)举行APL大会,出乎组织者意料来了500多人,而且群情激昂,要求IBM分发APL的拷贝,使IBM措手不及。这件事后来被人们称为“进军Armonk'(march to Armonk)。

虽然作为一种通用程序设计语言,总的来说它不像Fortran、Pascal、C等那样获得广泛采用,但它在早期程序设计语言的发展中起了积极的作用;此外,作为具有向量处理能力的一种语言,它也是后来对Fortran语言进行扩充,使之成为具有向量和矩阵处理能力的语言——VECTRAN(VECTORFORTRAN)的重要基础。而Fortran 90则是VECTRAN的进一步发展。由此可见APL在计算机程序设计语言发展史上的地位和功劳。

    在开发APL的过程中,艾弗森还发明了一组特殊的符号以描述计算机语言的形式结构,这组特殊的符号就被叫做“艾弗森记号”(Iverson notation)。艾弗森记号中运算符特别多,能对整个数组直接进行各种各样的运算。

    艾弗森在接受图灵奖后的第二年,即1980年就离开IBM,返回他的祖国,加盟多伦多的I.P.Sharp Associates公司,这家公司主要提供APL的产品和服务。1987年艾弗森从I.P.Sharp公司退休。

    艾弗森是在1979年10月29日于密歇根州的底特律召开的ACM年会上接受图灵奖的。艾弗森发表了题为“作为思维工具的符号”(Notation as a Tool of Thought)的长篇图灵奖演说,详细论述了APL的设计思想与特点,还给出了许多例子。演说全文刊载于Communications of ACM,1980年8月,444-465页,也可见《前20年的ACM图灵奖演说集》(ACM Turing Award Lectures  The First 20 Years:1966—1985,ACM Pr.),339-390页。

8、 查尔斯 · 霍尔(Charles A.R. Hoare)

    1980年的图灵奖授予了英国牛津大学计算机科学家查尔斯 · 霍尔。

    他不仅提出了QUICKSORT、CASE,而且在程序设计语言的定义和设计、数据结构和算法、操作系统许多方面都起了重要作用。由霍尔和他的同事们设计与实现的ALGOL 60 一个子集的版本 Elliott ALGOL 60,在效率、可靠性和方便性等方面都是首屈一指的。

    霍尔是英国人,1934年1月11日生于斯里兰卡的科伦坡。小时候的理想是当个作家,喜欢萧伯纳和罗素的作品。因为勤奋好学、少言寡语,他被同学称为“教授”。中学毕业后,他进入牛津的莫顿学院学习,对数理逻辑产生了兴趣,并首次接触到了计算机。他的第一个程序用Mercury Autocode的语言编写,解决了诺依曼书中的两人博弈问题。

    1960年,霍尔进入Elliott兄弟伦敦公司,成为一名程序员。他接到的第一个任务,就是为Elliott 803计算机编写一个库程序,实现新发明出来的Shell排序算法。在此过程中,霍尔对不断提升代码的效率着了迷,他不仅很好地完成了任务,还发明了一种新算法,比Shell还快,而且不会多耗费太多空间——Quicksort诞生了。

随后,霍尔又接到了新任务——在公司新机型Elliott 503上实现Algol 60语言。Elliott Algol的开发非常顺利,大获成功,霍尔本人也从此受到国际学术界的重视。当然,对他来说,另一件事情更为重要,他和项目中另一位当时比自己更专业的女程序员Jill Pym相识相知,并最后结婚。

    1968年他到北爱尔兰女王大学从事教学和研究,1977年转入牛津大学至今,目前还同时担任微软研究院的研究员。他全身心地投入到计算机科学理论的研究中,作出了许多创造性的重大贡献,尤其是程序设计理论和操作系统设计等方面,目前许多广泛流行与应用着的概念都源于霍尔的工作。

    1969年10月,霍尔在Communications of the ACM上发表了有里程碑意义的论文“计算机程序设计的公理基础”。在这篇论文中,霍尔提出了公理语义学,这是继1963年用递归函数定义程序,以及在1967年基于程序流程图的归纳断言法以后,程序逻辑研究中所取得的又一个重大技术进展。

    20世纪70年代后期,霍尔深入研究并实现了程序设计语言CSP,后来成为著名的并行处理语言Occam的基础。80年代中期,霍尔和S. Brools等人合作,提出了“CSP理论”,开创了用代数方法研究通信并发系统的先河,形成了“进程代数”这一新的研究领域。1995年他还和我国学者、中科院院士何积丰合作,提出了统一程序设计理论。

    霍尔发表过许多高水平的论著。ACM在1983年评选出最近25年中发表在Communications of the ACM上的有里程碑式意义的25篇经典论文,只有2名学者各有2篇论文入选,霍尔就是其中之一。1972年他与O.J. Dahl和E. W. Dijkstra三位图灵奖得主合著的Structured Programming一书,更是难以逾越的高峰。

9、 丹尼斯·里奇(Dennis MacAlistair Ritchie)和肯尼斯· 汤普森(Kenneth Lane Thompson)

    在计算机的发展史上,大概没有哪个程序设计语言像C那样得到如此广泛地流行;也没有哪个操作系统像UNIX那样获得计算机厂家和用户普遍青睐和厚爱。它们对整个软件技术和软件产业都产生了深远的影响。

而C和UNIX两者都是美国贝尔实验室的丹尼斯·里奇和肯尼斯· 汤普森设计、开发的,因此,他们在1983年共同获得图灵奖。

    丹尼斯·麦卡利斯泰尔·里奇(Dennis MacAlistair Ritchie,1941年9月9日生),出生于美国纽约布朗克斯维尔(Bronxville)。著名的美国计算机科学家,对C语言和其他编程语言、Multics和Unix等操作系统的发展做出了巨大贡献。

    里奇在哈佛大学学习物理学和应用数学毕业,1967年他进入贝尔实验室,主管贝尔实验室位于新泽西州的计算机科学研究中心的系统软件研究部门,目前他是朗讯技术公司系统软件研究部门的领导人。

    当有人问里奇为什么使用他使用的方式开发了C语言的时候,里奇回答说“这样做看上去很好”,他说任何人在同一地方、同一时间会像他那样做的。但是其他许多人认为这只不过反映出了里奇的谦虚。C++的开发者和设计师、里奇在贝尔实验室的同事比雅尼·斯特劳斯特鲁普说:“假如里奇决定在那十年里将他的精力花费在稀奇古怪的数学上,那么Unix将胎死腹中。”

    事实上,丹尼斯·里奇与肯·汤普逊两人发展了C语言,同时发展了Unix操作系统,在电脑工业史上占有重要的席位。至今为止C语言在发展软件和操作系统时依然是一个非常常用的电脑语言,它对许多现代的编程语言如C++、C#、Objective-C、Java和JavaScript拥有极大的影响。在操作系统方面Unix也具有极大的影响:今天市场上有许多不同的Unix方言如AIX、Solaris、Mac OS X和BSD等,以及与Unix非常相似的系统如Minix和非常普及的Linux操作系统。甚至其Microsoft Windows操作系统与Unix相竞争的微软为他们的用户和开发者提供了与Unix相容的工具和C语言编译器。

    里奇还参加发展了Unix和C语言的两个后继软件:Plan 9和Inferno操作系统以及Limbo语言。两者均是基于他以前的工作上发展的。

    在技术讨论中,他常被称为dmr,这是他在贝尔实验室的Email地址。值得注意的是,虽然丹尼斯·里奇是C语言的作者,他本人最喜欢的程序语言却是Alef。

 

10、 尼克劳斯 · 沃思 (Niklaus Wirth)

 

    1984年的图灵奖授予了瑞士学者和计算机科学家尼克劳斯 · 沃思,由于他是结构化程序设计语言PASCAL之父及结构话程序设计的首创者,他提出的著名公式“数据结构 + 算法 = 程序,广为人知。

    凡是学过一点计算机知识的人大概都知道“数据结构十算法= 程序”这一著名公式。提出这一公式并以此作为其一本专著的书名的瑞士计算机科学家尼克劳斯·沃思(Niklaus Wirth)由于发明了多种影响深远的程序设计语言,并提出结构化程序设计这一革命性概念而获得了1984年的图灵奖。他是至今惟一获此殊荣的瑞士学者。

沃思1934年2月15日生于瑞士北部离苏黎世不远的温特图尔(Winterthur),其父瓦尔特是一位地理学教授。沃思小时就喜欢动手动脑,组装飞机模型是他的最大爱好。中学毕业以后,沃思进入在欧洲甚至全世界都很有名气的苏黎世工学院(ETH),1958年取得学士学位。之后他远渡大西洋到加拿大的莱维大学深造(Laval是和加拿大名城魁北克隔圣劳伦斯河相望的一座城市),于1960年取得硕士学位。之后他又一次迁移,到美国加利福尼亚,进入加州大学伯克利分校,于1963年获得博士学位。

    学成以后,沃思受聘到斯坦福大学刚刚成立的计算机科学系工作。著名的斯坦福大学门槛极高,怎么会看中了这个来自欧洲小国的毛头小伙子呢?原来在20世纪50年代末、60年代初的情况下,沃思的计算机经验和成就相当引人注目:在苏黎世工学院时,他曾听过瑞士的计算机先驱斯帕塞(A.P.Speiser,他曾出任IFIP的主席)的课,用过由斯帕塞开发的计算机ERMETH(虽然作为学生,机会并不多);在莱维大学时,沃思学了数值分析,用过 Alvac III E计算机(虽然这台计算机经常出故障而不能开机);在伯克利时,沃思先是有一台Bendix G-15计算机可用,后来又参加了为IBM 704开发 NELIAC语言编译程序器的科研小组。 NELIAC的全称是 Navy Electronics Laboratory International Algol Compiler,即美国海军电子学实验室国际 Algol编译程序语言,该语言用于数值计算和一些逻辑处理,其特点是用自己的语言写自己的编译程序,然后进行自编译,是一个类似于 Aled 58但具有开创性意义的语言。沃思在撰写博士论文时,Algol 60报告已经发表。这是第一个清晰定义的语言,其语法是用严格公式化的方法说明的。当时已有一些学者认识到,清晰的规格说明对于可靠而有效的实现是必需的,但是并不充分:Aled 60报告中还存在一些缺陷和不足。

    沃思在和 Algol的设计者之一、荷兰人范·维京格尔藤(Andrian van Wijingaarden,他曾任阿姆斯特丹数学中心计算部主任,在开发Algol 68中提出了二级文法,又叫w文法以解决上下文有关这一难题。他曾启发1972年图灵奖获得者狄克斯特拉走上计算机科学之路)多次接触和讨论以后,决定对 Algol 60作进一步改进,并以此作为自己的博士论文课题。这就诞生了由沃思所设计的第一个语言——Euler。Euler虽然在实用性上考虑并不十分周到,但在学术上却非常优美,为编译器的系统设计创造了一个很好的基础。此外,它还对 Algo l60进行了若干扩充,主要是增加了表处理能力。正是由于以上原因,斯坦福大学看中了沃思。与此同时,IFIP也注意到了Euler语言,决定吸收沃思参加对Algol语言进行完善与扩充的工作小组。当时,这个小组中有两派,一派主张设计一个新语言,以便树立一个新的里程碑;另一派则觉得时间太紧,主张对 Algol 60进行适当扩充。沃思参加进去以后,自称同时属于这两派,并提交了一份建议书。这份建议书经过霍尔(Tony Hoars)等人的修改、完善以后获得通过,这就是Aigol W(W是沃思名字的首字母)。

    第二年,也就是1966年,Algol W在斯坦福大学的第一台 IBM 360上成功实现并正式应用。这中间还有一个小插曲:IBM 360当时只提供汇编语言和 FORTRAN语言,但沃思和他的学生都觉得这两者并不适宜于作为设计编译器的工具。于是,沃思用了两个星期时间写出了一个用来描写Algol编译器的新的语言的定义,然后用了4个月时间在宝来公司的B-5000计算机上完成了交叉编译程序,而沃思的一个学生则把这个交叉编译程序移植到 IBM 360上去。这些额外的工作极大地加快了 Algol W编译器的开发,同时催生了一个新的语言 PL 360。 PL 360虽然是作为辅助工具而设计、开发的,但后来却在许多地方获得应用,取得了意想不到的成功。

    Algol W及 PL 360奠定了沃思作为世界级程序设计语言大师的地位,一举成名。但沃思是一个具有强烈爱国心的人,成名后的他谢绝了斯坦福大学的挽留,于1967年回到祖国,先在苏黎世大学任职,但第二年就回到他的母校苏黎世工学院。在这里,他首先设计与实现了 PASCAL语言(Philips Automatic Sequence CAlculator Language的缩写),这是在 CDC 6600上开发成功的。 PASCAL在数据结构和过程控制结构方面都有很多创造。对于前者,除一般的整型、实型、布尔型数据外,PASCAL还增加了字符型、子域类型、记录结构类型、文件类型、集合类型和指针类型;对于后者,除保留了无条件转移的GOTO语句外,又增加了if-then-else、case、while、repeat和for等多种控制结构,还允许复合语句和处理记录变量的分量使用with语句这种编写形式。可以说,现代程序设计语言中常用的数据结构和控制结构绝大多数都是由PASCAL语言奠定基础的,因此它在程序设计语言的发展史上具有承上启下的重要里程碑意义。

    说来有趣,沃思开发PASCAL的初衷是为了有一个适合于教学的语言,并没有想到商业应用。但一经推出,由于它的简洁明了,它所提供的丰富的数据结构和控制结构为程序员提供了极大的方便与灵活性,也由于它特别适合于由微处理器所组成的计算机系统,竟然大受欢迎,广泛地流传开来。在C语言问世以前,PASCAL是风靡全球、最受欢迎的语言之一,创下了发行拷贝数最多的世界记录。单是沃思的一个学生菲力浦·凯恩(Phillipe Kahn),从 ETH毕业以后,在美国加利福尼亚州办了一个软件公司,就卖出了100多万个PASCAL拷贝,成为百万富翁。

    1971年,沃思基于其开发程序设计语言和编程的实践经验,在4月份的 Communications of ACM上发表了论文“通过逐步求精方式开发程序’(Program Development by Stepwise Refinement),首次提出了“结构化程序设计”(structure programming)的概念。这个概念的要点是:不要求一步就编制成可执行的程序,而是分若干步进行,逐步求精。第一步编出的程序抽象度最高,第二步编出的程序抽象度有所降低…… 最后一步编出的程序即为可执行的程序。用这种方法编程,似乎复杂,实际上优点很多,可使程序易读、易写、易调试、易维护、易保证其正确性及验证其正确性。结构化程序设计方法又称为“自顶向下”或“逐步求精”法,在程序设计领域引发了一场革命,成为程序开发的一个标准方法,尤其是在后来发展起来的软件工程中获得广泛应用。有人评价说沃思的结构化程序设计概念“完全改变了人们对程序设计的思维方式”,这是一点也不夸张的。1983年1月,ACM在纪念 Communications of ACM创刊 25周年时,从其 1/4个世纪发表的大量论文中评选出有“里程碑意义的研究论文” 25篇,每年1篇,沃思的这篇论文就是其中之一。

    PASCAL的成功也罢,结构化程序设计思想的巨大影响也罢,都没有停止沃思继续创造性的研究与开发工作。20世纪70年代中期,为适应并发程序设计的需要,沃思又成功开发了一个获得广泛应用的语言Modula。M0dula除了提供并发程序设计功能之外,另外一个重要特征是引进了模块概念(这也是这个语言叫做Modula的原因)。此外,它还引进了“进程”(process)这一和并发程序相联系而产生的重要概念。Modula语言还特别适合于书写系统程序。但是,比Modula具有更加重大得多意义的却是它的第二个版本Modula.2。这是 1976年,沃思再次赴美国,到 Xerox公司的 Palo Alto研究中心参与Alto计算机的设计与开发工作。Alto是世界上第一个具有图形用户界面的个人计算机系统(可惜Xerox公司没有把它商品化,而由Apple公司学去了它的技术而推出 Macintosh)。

    沃思回到瑞士以后,参考Alto的经验,设计、开发Lilith个人计算机系统。为了和Lilith的体系结构相配合,沃思决定在Modula的基础上开发新版本,作为整个系统的开发语言。Modula-2与Modula相比,语法更加简洁,更加强调界面设计,模块的可重用性更好。它共有3个编译单元,即程序模块、定义模块和实规模块。在定义模块(definition module)中,只给出那些和模块外部交往所必需的信息。例如,对模块内部的子程序说明而言,在定义模块中只给出子程序名、参数名及其类型等,而不给出子程序体本身,也就是说,在定义模块中只给出模块外部可见的信息。在实规模块(implementation module)中,则给出那些在模块外部不可见的信息,例如,在模块内部定义的子程序说明的子程序体。这样的安排既提高了可读性,又有助于分别编译。M0dula-2在优美性(elegance)和简洁性(simplicity)两方面都比Modula更进一步。

    Lilith的操作系统、图形软件包、数据库系统、网络协议套件、文件服务器等基本系统和大量应用模块全都是用M0dula-2开发的。目前世界上已经开发了近百个Modula-2的编译系统,北美和欧洲的许多大学已经用Modula-2代替PASCAL作为计算机系本科生的第一门程序设计课程。Modula-2的标准化工作则早在1984年就已由英国开始进行,ISO则于1987年对它进行标准化,并采用由IBM的维也纳实验室提出的VDM-SL和经过沃思本人加以扩充的BNF(即EBNF,见下)表达语言的语法与语义,在形式化方面达到了一个新的水平。在Lilith项目中,沃思坚持将计算机体系结构、语言、操作环境这三者统一起来考虑,实行集成化、一体化设计的成功经验是具有革命性的创举,从而使这个项目在计算机科学史上占有重要地位。

    近年来沃思致力于一个新的计划,即Oberon计划。Oberon是将程序设计语言和操作系统结合在一起的、面向单用户的个人工作站的一个系统。因为沃思认为,在因特网日益普及的情况下,今后联网的计算机主要将是个人工作站,因此如何使个人工作站功能更加强大、更加方便使用是一个十分重大的课题。沃思把这个计划取名为Oberon是寓意深长的,因为Oberon是希腊神话中的仙境之王和女神Titania的丈夫。沃思的目标是要使Oberon语言超越PASCAL和Modula,设计出的操作系统和编译器功能更加强劲。1992年他写了两本书向读者推荐Oberon,可见其对这个计划的重视。

    除了程序设计语言之外,沃思在其他方面也有许多创造。为了定义和描述语言,沃思对著名的“巴科斯-诺尔范式”BNF进行了扩充,成为EBNF(Extended BNF)。我们目前所看到的许多语言的 BNF实际上是EBNF,不过人们往往忽略掉这个E字。和BNF一起出现的,还常常有一些看上去像铁路图那样的图形,称作“语法图”(syntax chart或 syntax diagram)或“铁路图”(railroad diagram),这也是由沃思所设计与发明的,这种图形标记法的描述能力等价于BNF,但当然更易于阅读与理解,更加直观。在语法图中,用圆圈表示终结符,用方框表示非终结符,用有向弧表示走向,图上一条通路就表示该语法结构的一种正确定义方法。

    在对上下文无关文法的研究中,一个很重要的问题是如何确定两个符号之间的优先关系。现在一般采用的办法也是由沃思和他的同事韦伯提出来的,就叫沃思-韦伯优先关系(Wirth- Weber precedence relation),或叫简单优先关系。

    ACM除了1984年授予沃思图灵奖外,1987年又授予他“计算机科学教育杰出贡献奖”。另一重要的国际学术组织IEEE也授予过沃思两个奖项: 1983年的 Emanual Piore奖和 1988年的计算机先驱奖(Computer Pioneer Award)。1992年,加州大学伯利分校命名沃思为“杰出校友”。

    沃思是在1984年10月于旧金山举行的ACM年会上接受图灵奖的。沃思发表了题为“从程序设计语言设计到计算机建造”(From Programming Language Design to Computer Construction)的图灵奖演说,回顾了自己在计算机领域所做的工作。演说全文刊载于Communications of ACM,1985年 2月,159- 164页,也可见《前 20年的 ACM图灵奖演说集》(ACM Turing Award Lectures——The First 20 Years:1966-1985,ACM Pr.),179-196页。沃思在演说中强调了程序设计语言简结性的重要意义,也讨论了它所需的硬件和软件环境(因为沃思一直很重视语言的实现问题)。他介绍了在设计Modula-2和Lilith中的经验,指出第一手经验和选择良好开发工具的无比价值。

11、 罗宾 · 米尔纳 (Robin Milner)

    1991年的图灵奖授予给了爱丁堡大学计算机科学系教授罗宾·米尔纳(RobinMilner)。

他是继威尔克斯(M.V.Wilkes,1967)、威尔金森(J.H.Wilkinson,1970)和霍尔(C.A.R.Hoare,1980)之后第四位获此殊荣的英国科学家,这也使英国成为除美国之外获得图灵奖的学者最多的国家。米尔纳的主要贡献在计算机程序设计语言方面,他提出了形式化逻辑系统的一个数学模型LCF,又主持开发了元语言ML并使之标准化。米尔纳还利用代数方法为并发与并行计算创建了一种概念框架系统CCS,推动并促进了并发与并行计算的发展。

    米尔纳生于1934年1月13日,先后在埃顿学院(EtonCollege)、国王学院(King’sCollege,图灵也曾在这个学院上学)和剑桥大学接受了高等教育,专业是数学,1957年获得学士学位。他上大学期间曾经接触过由威尔克斯主持研制的世界上第一台存储程序式电子计算机EDSAC,在它上面编写过程序。但当时米尔纳对计算机并没有重视,也没有表现出很大的兴趣。大学毕业以后,米尔纳当了几年中学数学教师,更是把计算机全抛在脑后。直到1960年米尔纳重新规划自己的未来,到伦敦著名的Ferranti公司求职。Ferranti公司当时正需要计算机编程人员,对有过编程经历的米尔纳表示欢迎,但要求他“把一生都献给计算机”。

    20世纪60年代初,计算机还没有十分普及。计算机的深刻含意是什么,从事计算机工作有多大前途和机会,这些问题对于绝大多数人来说都是不甚清楚的。因此,对于Ferranti公司这一要求,米尔纳也深感迷茫和困惑。所幸的是,米尔纳作出了正确的选择,进入Ferranti公司,从而重返计算机领域,并幸运地与计算机科学同步成长起来。

    但米尔纳在Ferranti公司只干了3年,以后就转人大学从事教学与研究。他呆过的大学包括伦敦城市大学,威尔土南部海港城市的斯旺西(Swansea)大学,美国的斯坦福大学,但长期与最后的落脚点则是爱丁堡大学,这是英国最著名、历史最悠久的高等学府之一,有优良的学术传统,在计算机科学,尤其是人工智能领域,其研究工作曾长期处于世界领先水平。

    在计算机程序设计语言方面,米尔纳和戈顿(M.J.Gordon)等人一起提出了形式化逻辑系统的数学模型,实现了他称之为LCF的一个系统——“可计算函数的逻辑”(LogicforComputableFunc-tions)。LCF不但是一种有效的建模工具,还是一种强有力的验证工具,利用它可以方便地验证计算机程序的正确性。由于在利用计算机解决各种各样的具体问题时,建立正确的形式化系统在理论上和实践上都具有重要的意义,因此米尔纳的LCF受到学术界的高度评价。实际上,米尔纳是受斯科特(D.Scott,1976年图灵奖获得者)的影响和启发才从事这一研究的。我们前面已经介绍过,斯科特是研究自动机理论,和拉宾(M.O.Rabin)一起提出了“非确定性”有限状态自动机的著名学者,后来在20世纪60年代又和斯特雷奇(C.Stra-chey,1916—1975)合作,提出了程序设计语言的“标志语义模型”,为“标志语义学”(又称“指称语义学”或“数学语义学”)奠定了基础,对计算机程序设计语言的发展产生了重大的影响。斯科特曾到牛津大学访问、讲学,米尔纳听了他的讲演,看了他的著作,引起了对这个问题的极大兴趣,从而深入进行研究,并获得成果。20世纪70年代初,米尔纳在斯坦福大学的人工智能实验室作访问学者时,曾用LCF证明了那里的一个很复杂的编译器的正确性,受到有“人工智能之父”之称的麦卡锡(J.McCarthy,1971年图灵奖获得者)的高度评价。

    在斯坦福大学期间,米尔纳学习了由麦卡锡主持开发的函数式人工智能程序设计语言LISP,这使他受到很大启发,进一步打开了他的思路和智慧之窗。回到爱丁堡大学以后,他借鉴LISP的经验,在LCF的基础上,花了几年的时间,开发成功了一个更加重要的系统,即ML,也就是元语言(metalanguage),一种用来描述、表达与验证其他语言的语言。ML是一种强多态类型的语言,一个ML程序也就是一个包含变量定义和函数作用的表达式序列,具有比LCF更强的推理能力。ML有时也被称为函数式语言,但与纯函数式语言有所不同,因为它具有引用的概念,即变量是可以赋值的。此外,它的输入/输出系统也引入了副作用。

    ML取得成功以后,米尔纳致力于使它国际化和标准化。在他的努力下,1984年成立了一个包括爱丁堡大学、剑桥大学和贝尔实验室等知名高等学府和研究机构的专家在内的15人工作小组,采取通过电子邮件交换意见进行设计的方式工作。20世纪90年代初标准ML即SML问世。SML具有高阶函数功能、I/0机制、参数化的模块系统和完善的类型系统。

    米尔纳另一方面的贡献是关于并发计算(concurrentcomputing)和并行计算(parallelcomputing)的。由于并发与并行计算与传统的串行计算(sequential computing)有着本质上的不同,其复杂程度大大增加,无法用后者的方法和术语表达前者的意义。严格说来,所谓两个事件是“并发”的,是指一个系统内部发生的这两个事件之间没有因果关系,并非先后关系(当然,有因果关系者必有先后关系,但有先后关系者不一定有因果关系)。并发概念由发明著名的“佩特里网”的C.A.Petri于1962年首先严格定义并建立了模型。至于“并行”,指的是利用多个处理机或其他功能部件同时工作以提高系统性能或可靠性,冯·诺伊曼在20世纪40年代提出细胞自动机可认为是并行计算思想的开端。米尔纳经过深入研究,提出了一种新的观点,把可以按任意次序在系统内发生的两个事件定义为并发事件,称之为“交叠式并发”,而佩特里定义的严格并发则称为“真并发”。在交叠式并发概念的基础上,米尔纳利用代数方法创造了一种用于建立并发与并行计算的概念框架的系统叫“通信系统演算”CCS(Calculusfor,Com- municatingSystems)。CCS与霍尔(C.A.R.Hoare,1980年图灵奖获得者)所创建的“通信顺序进程"CSP(CommunicatingSequentialProcess)是最典型的两个描述性并发模型,即进程代数模型,都以进程及进程间的通信为主要描述对象,系统中的事件就是进程通信,特别适合于描述分布式系统。CCS已经成功地用来解释用于书写通信协议规约的国际标准语言Lotos,而Lotos则已用于面向对象的ROOA方法中,用来描述面向对象需求定义中的抽象数据类型和进程定义。CCS本身虽然只有交叠式语义,但利用一些特殊的方法,如多层佩特里网方法,也可以建立起一个完整的真并发语义,因此具有很重要的价值。

    米尔纳在学术上的一个特点是十分注意打好基础,精益求精。他主持开发和标准化的ML被认为是定义得最完善,最无懈可击,结构最优美、和谐而又最短小、精悍的语言之一。在作风上,米尔纳谦虚谨慎,从善如流,非常注意听取和吸收合作者的意见。例如,标准ML有允许设计“大模块”程序的功能,就是米尔纳根据贝尔实验室的麦克奎因(D.MacQueen)所提出的构思实现的。ML原先是一个专用语言,意大利学者鲁卡·凯德利(Luca Cardelli)实现了ML的一个扩充版本,使之更适合于教学。米尔纳看到以后十分赞赏,在它的基础上把ML进一步发展为一个通用语言。米尔纳的成功与他的这些优秀品格是分不开的。

    此外,1996年,米尔纳和旺德(1.Wand)还合编了一本《明天的计算:计算机科学未来的研究方向》 (Computing Tomorrow:Future Research Directionsin Computer Science,CambridgeUnipr),书中有包括米尔纳自己撰写的一篇文章在内的总共16篇文章,都是计算机科学各方面的专家撰写的,论述了在计算复杂性、软件工程、并行计算、自然语言处理、数据库、知识重用、实时计算、安全、通信、交互计算、人工智能等各分支中未来研究的方向和重要课题,很值得重视。

    米尔纳在接受图灵奖时发表了题为“交互的原理”(Elements of Interaction)的演说,并接受了记者的采访。演说全文以及与记者的对话刊载于1996年1月的CommunicationsofACM,78~97页。在与记者的谈话中,米尔纳表达了这样一个观点,即计算机科学既是理论性很强的科学,又是与应用和实践密切联系着的科学。因此,任何希望在这一领域取得成功的年轻人,必须十分重视把理论与实践结合起来。

    米尔纳在爱丁堡大学任教20多年,并于1986年创建了该校的计算机科学基础实验室(LaboratoryforFoundationsofComputersci-ence),并出任主任,英国科学与工程研究院对该所有长期的支持。最近米尔纳已离开爱丁堡,转至剑桥大学的计算实验室。

12、 约翰 · 戴尔(Ole-Johan Dahl)和克利斯登·奈加特(Kristen Nygaard)

    2001年的图灵奖授予挪威计算机科学家奥尔-约翰·戴尔和克利斯登·奈加特。因为他们在20世纪60年代开发Simula I 和Simula 67时首先引入了类(class)、对象(object)、继承(inheritance)和动态绑定(dynamic binding)等重要概念,为面向对象(Object oriented)这一当前最流行、最重要的程序设计技术奠定了基础。

    挪威是一个北欧小国,而且上世纪中叶的挪威政府对信息技术不太重视,在这种情况下,戴尔和奈加特怎么可能作出这一创造性的重大贡献呢?说来这里有一段曲折而有趣的故事。

    奈加特1926年生于奥斯陆,1948年大学毕业,进入挪威国防研究院NDRE(Norwegian Defence Research Establishment),从事有关计算、程序设计和运筹学方面的工作。1956年他在职完成了硕士学业,以《蒙特卡洛法的若干理论问题》(Theoretical Aspects of Monto Carlo Methods)为题提交了学位论文,并在奥斯陆大学通过答辩,取得数学硕士学位。1959年他创建了挪威运筹学学会NORS(Norwegian Operation Research Society),并出任学会首任主席(1959-1964),1960年他从NDRE转至挪威计算中心NCC(Norwegian Computing Center),1962年出任其研究部主任(Director of Research)。

    当时,奈加特的研究兴趣主要在运筹学方面。所谓运筹学是用数学方法研究军事、经济活动中的计划与管理问题的一个学科,其目的是对系统中涉及的人力、物力进行统筹安排,实现最佳调度,以提高系统的整体效率。它包括线性与非线性规划、整数规划、动态规划、网络优化、对策论、排队论等内容,有十分广泛而重要的应用。运筹学研究中的首要问题是为实际系统建立数学模型,而模型要解决的首要问题是如何描述系统中的不同组成部分及其运行。20世纪50年代时,这种模型通常通过符号标记(Symbol notation)实现,例如用流程图(flow diagram)加上若干系统运行规则,然后用蒙特卡洛法加以分析,使模型逐步修改并完善。这种方法很不方便,效率不高。奈加特不太满意,他要寻求一种新的有效方法。到1961年前后,奈加特经过潜心研究,对如何改进已经形成了一些清晰的概念。但在把这些概念付诸实现上,奈加特遇到了困难:他的计算机知识和经验不足以设计出新的计算机模拟语言去实现他的设想。幸好,他在NDRE时的老朋友戴尔这时也来到了NCC。

    戴尔1931年10月12日生于挪威最南端濒临北海的港口城市曼达尔(Mandal),比奈加特小5岁,其经历几乎和奈加特一模一样:大学毕业后也是进了NDRE(1952年);也是在职完成了硕士学业,1957年以《数值数学》(Numerical Mathematics)为题的论文通过了奥斯陆大学的论文答辩,取得数学硕士学位。但是戴尔的研究方向偏重于计算机,他的硕士论文主要讨论多维矩阵在有二级存储器的计算机上如何表示和处理,因此,戴尔在程序设计语言方面有相当丰富的经验和深厚的根底。这样,奈加特和戴尔这对“最佳搭档”经过深入讨论和紧密合作,终于在1962年推出了基于Algol60的Simula的第一个版本。Simula是Simulation Language即模拟语言的词头缩写。在第二次世界大战中,科学家利用运筹学成功地解决了诸如雷达站的最优选址、反潜炸弹的最佳引爆时间、水雷的最佳布阵、安全程度最高的轰炸机战斗机组合等问题。战后,科学家又正在试图用运筹学解决工业生产和管理中的问题,帮助提高生产率与利润,增强竞争能力。因此,Simula特别适用于研究售票系统、生产线组织、程序开发、神经网络、并发程序处理这类离散事件。

    1964年3月,奈加特和戴尔完成了Simula的最后设计,这个最后设计在两个美国软件工程师琼斯(Ken Jones)和斯派罗尼(Joeseph Speroni)的协助下由戴尔于1964年12月在NCC新购置的UNIVA 1107上完成,从而诞生了世界上第一个Simula I编译器,也就是世界上第一个能对离散事件系统进行模拟的程序设计语言。

Simula I推出以后,在生产计划、库存管理、交通运输、建筑物的翻修等诸多方面获得成功应用。随后Simula在瑞典、德国、前苏联等许多国家被广泛采用。除UNIVAC版本外,1968年在宝来公司的B5500上,在前苏联的乌拉尔-16计算机上也都实现了Simula。

    奈加特和戴尔对所取得的成绩并不满足,在开发过程中,他们已经意识到了Simula还存在一些缺陷,如缺乏跟踪和调试功能,缺乏必要的工具去表达相关进程共有的性质,以及Algol 60编译器本身所带来的限制等等。

    1965年秋天,位于特隆赫姆(Trondheim)的挪威理工学院NIT(Norwegian Institute of Technology)和NCC接触,希望为1107开发一个专门用于Simula的Algol编译器,这正中奈加特和戴尔的下怀,双方很快达成协议,建立了合作关系。NIT方面为首的专家是克努特·斯考克(Knut Skog)。“对象”(Objcet)和“类”(class)以及“子类”(subclass)等基本概念正是在这个时期(1966年末)出现和形成的。在这个过程中,他们的目标也由专用语言逐渐转向通用语言,从而诞生了第一个面向对象的程序设计语言Simula 67。

    Simula 67首次同公众见面是在1967年5月于奥斯陆郊外的小镇莉沙布(Lysebu)举行的IFIP TC-2 工作会议上。两个星期以后,即1967年6月又召开了另一次会议,为Simula 67制定标准,以使今后在不同机器上实现的Simula程序可以兼容,1968年2月形成了Simula 67的正式文本。

    在程序设计语言的发展史上,20世纪60年代下半期是承上启下的重要时期。这个时期有3种重要的语言问世,即我们这里介绍的Simula 67,由IFIP组织欧美一批顶尖计算机科学家共同设计的Algol 68,以及由IBM公司为和360系列机配套而联合两大计算机用户组织SHARE和GUIDE共同开发的PL/I。这三个语言各有特色,均有所创新,都对后来的程序设计语言产生了重大影响。但客观地说,Simula 67的面向对象概念影响是最巨大而深远的。它本身虽由于比较难学、难用而未能广泛流行,但在它的影响下所产生的面向对象技术却迅速传播开来。70年代Xerox公司推出了Smalltalk,80年代Bell实验室推出了C++,美国交互软件公司推出了Eiffel……从此在全世界掀起了一股OO(Object oriented)热潮,至今盛行不衰,成为程序设计的主流。因此OO的奠基人奈加特和戴尔获得新世纪的第一个图灵奖可说是当之无愧。

你可能感兴趣的:(行业相关)