冯莹 2010年11月07日 星期日 13:27 | 1489次浏览 | 1条评论
2008年图灵奖得主Barbara Liskov博士
2009年,我在图灵奖获奖仪式上要做一个讲话,在我想这个演讲怎么讲的时候,我就决定把我看过的论文再重新看一看,就是说我达到获得图灵奖的成就的那些最初的想法是什么,今天我非常想与大家分享这个。
我在斯坦福大学拿到了博士学位,当时学的是人工智能,我在读博士读到一半的时候,决定放弃人工智能转而研究计算机系统,当然了,学博士最后要拿学位的,这样才能做进一步研究。我决定上学的时候先不转型,拿到学位以后再转型。之后我在一个机构工作,主要是做一些计算机的研究,我在博士毕业以后开始做计算机系统的研究了。
首先我参加了维纳斯机器的一个设计,当时谈一种微编程,也就是说我们给计算机一个小的指令组,而且给它很小的只读内存,这样在非常弱的指令组上面是没有办法写的。对于这个项目来说非常有趣的一点,Interdata 3这个指令组和今天的一个架构是没有什么不同的,当时人们写的很多程序是机器程序,而且要想直接使用那么弱的指令组编程是非常难的,今天编程语言更加高级,由编译器生成。这个指令组相对来说还是比较标准化的,我把这个信号语给放进去了,放在当时的一个操作系统上面,我认为在硬件当中必须要有这样的配置。
到70年代末期我又开始推进一个新的项目了,大家看到我们主要做系统设计,不再做任何的人工智能,而且是边做边学来理解计算机系统,70年代末又开始变成编程方法论。
当时政府发现他们正在经历软件危机,今天我们仍然在经历软件危机。这是什么意思?我们不了解如何高效地运用软件,那时候软件匮乏是很大的问题,有大批的失败项目。刚开始我们有一个想法,然而软件不能达到我们的要求,最后导致整个项目必须放弃。那个软件的成本比今天要高得多,比方说一个大型机的耗资能够达到几十万美元,大家根本不了解软件怎么做出来,大家感觉软件可以轻而易举的做出来,而且软件不花钱,硬件花钱,所以当时人们不愿意在软件方面投资、花钱,这样对于软件编程员来说工作很难做,而且他们的工作不受重视。今天众所周知软件也是很贵的,不会为了硬件牺牲软件了。
为准备我的图灵获奖感言,我去年又重读了几篇论文,这个很有价值,今天介绍给我们的同学们也读这几篇论文。在给美国研究生做报告的时候,我发现大部分人没有读过这些论文,建议大家去读:
首先想给大家讲的是 E.W.Dijkstra 写的 Go To Statement Consider Harmful 这篇论文,这个论文当时发表的时候引起了很大的争议。当时大家感觉很奇怪,让大家放弃Go to语句,我们就很难推理程序。一旦不能推理程序在做什么的时候,你怎么能确保程序会去做你想做的事情呢?而当你对程序做出推理的时候发现程序文本是一个静止的东西。你要推理的是程序动态的执行,你推理的过程如果想做得更加简单的话,你要能够把静态和动态统一在一起,如果用Go to转到这个做法,这样就很混乱,就没有结构。有一个结构化的方式理解程序更好理解。
还有另外一个非常重要的论文,是 D.L.Parnas 写的 Information Distribution Aspects of Design Methodology ,关于这样的话题写了两篇文章,写的是程序结构问题,他的论文当中有一些很有意思的论断,他说这个项目是由模块组成的,不知道这些模块究竟是什么,他说我们知道这样一个结构,必须了解这个结构,但是结构本身是不清楚的。模块是什么呢?想把这些模块组合起来,并且模块之间产生互动的话,就必须说明你的代码是正确的,必须理解这些模块是相互联系的,不是说这样的模块对另外模块产生预算,而是整个模块相互联系。所以在论文当中提出了非常重要的一条,各个模块之间的联系是模块相互之间的假设。这样一个联系其实比你想象的更为复杂,必须进行深入的了解。
当时我读这些论文的时候推出了我的Venus系统。我使用了他们论文当中提供的方法,当时搞了自己的团队,承担了很重要的任务。在我们项目最开始决定用一个特别的开发推动我们这个项目。讲到项目的时候,会有各种各样的流程,这些流程他们也是相互之间进行呼叫的,但是也会产生很多总体的变量。在Venus中,我们会把整体的命令行分散,我们叫做分隔。对于每一个模块有自己所谓的指令表,每一个指令表有自己的变量,各个指令之间相互互动的时候叫做运算。也就是说同一个分割中有不同的运算。这样一种概念实际上是模块化的概念,在Venus项目中引用了这个。那个时候希望搞一个操作系统,就是用这种模块化的概念。
S.Schuman 和 P.Jourrand 在他们的论文中谈到了可扩展语言的作用,当时这个论文是在1967年发布的,主要有两种方法,困难性的语言必须让编程语言改变语言,这样他们可以进一步的进行调整,里面有语意,讲到语意进一步拓展句法,看起来是非常有道理的。
还有一篇 O-J. Dahl 和 C.A.R Hoar 于1972年写的非常有轰动效应的一篇文章, Hierarchical Program Structures 。在当时对于封闭没有产生概念,所以说没有把抽象以及分割两者之间结合起来。还有一篇是 J.H.Morris 的 Protection in Programming Languages 。这篇文章又开始讨论模块化的问题,模块化是非常重要的概念,如果有很大项目,每个模块规模又是比较大的,所以你要修正你的程序,必须修正不同的模块,要考虑这个模块是否完成了它应该做的事情。当时Morris问的问题是如何保证使用模块化的方式可以进行良好的调试。
到1974年夏天快结束的时候又要做一个抉择:下一步研究如何做。当时我选择继续研究设计程序语言,提出了抽象数据类型,提出有一系列的预算、对象以及所有的运算,只有通过这些运算才能对目标进行存取。这些论文中也对语言进行描述,说这是一个大概的框架、大致的架构。
为什么选择程序语言呢?讲到这样一种模块化,应该和虚拟数据类型结合起来的,人们需要了解里面的方法论。我觉得要走下一步其实是有必要原因的。首先编程语言就需要向程序员进行良好沟通,如果程序员不懂有什么意义呢?当时我们考虑到这一点,编程语言需要让编程员可以很好的了解,同时抽象数据类型是否真正的能够应用。想到一种想法怎么谈都行,但是讲到编程语言,把这个变成真正的实际使用。另一个原因,我希望对于这样一个概念,或者这样一个想法进行明确的定义,把这样一种想法具体的实施,因为我们这样一个想法本身是比较虚幻的,但是通过编程语言可以把这样的想法变成事实。
下面给大家讲讲设计流程。我想指出的是对于语言设计的目标其实和接口设计目标是一致的。我在这个项目之后也做了很多其他的项目,我始终把这些项目放在心上。一旦设计一个模块,或者大型、小型的界面、接口,必须考虑几点,首先考虑这样的模块是否能够考虑足够的表达能力。也就是说是否能够实现想要的目标。第二个原则是必须简单,如果你的程序员不了解这个程序如何编译,那么效率就很低了。同时它的绩效要比较高,而且使用起来很方便,否则是没有人愿意用这样的语言。对于任何的编程语言,这就是我们需要关注的四大目标。
我获得图灵奖以后,我的丈夫每天在网上找对我的赞誉,其实在我刚开始做研究的时候,没有人了解,但今天大家都知道了,这是主要的转变。现在在研究工作当中仍然有很多挑战,我起步非常早,但仍然有很多有趣的课题值得我们解决,对于下面的问题,我们需要更好的程序方法论,特别是在大规模并行计算的技术成为现实的时候。另外互联网本身也是一种计算机,我们如何来适应互联网时代的编程需要,也是我们有待解决的一个挑战。谢谢大家!
Barbara Liskov在演讲中提到的其他几篇重要论文是:
N. Wirth . Program Development by Stepwise Refinement.
B. Liskov . A Design Methodology for Reliable Software Systems.
W. Wulf and M. Shaw . Global Variable Considered Harmful.
B. Liskov and S. Zilles . Programming with Abstract Data Types.
Zeuux © 2024
京ICP备05028076号
回复 電波系山寨文化科学家 2010年11月08日 星期一 20:13
单
pc单机
以太
遗
哎...