数学基础和跨领域研究是取得创新成果的重要因素
———从事计算机研究的体会之一
加入WTO后,我们的工业将纳入国际大市场,大家都关心如何提高我国产品的竞争能力。在与计算机相关的领域内,既有挑战,又有重大的机遇。能够抓住机遇的人往往会获得意想不到的成功。近年来经常有人问我下列问题:“1975年你怎么想到要从事照排系统的研制?”“怎么想到跳过当时国外流行的做法,而采用新的技术途径?”“你在从事计算机系统的研制中最重要的体会是什么?”。我想在本文中谈一下我的一些粗浅的看法,供大家参考。
实践出真知
一定要在年轻的时候养成自己动手的习惯。在计算机领域内,只出点子、从来不动手实现的人不容易出大的成果。一个新思想和新方案的提出者往往也是第一个实现者,这似乎是一规律。因为开头人们总会对新思想提出怀疑,而只有发明者本人才会不遗余力,承受一切艰难困苦、百折不回地予以实现;也只有发明者本人最清楚自己方案中的问题,能最有效地改进方案和克服实现过程中的各种困难以取得成功,只提方案、自己不实现,则会使一项有价值的发明不能很快付诸实现,而在高科技时代,一种新方案在市场上的生命周期是不长的,一项发明的实施过程太长,会使别人捷足先登。
获图灵奖的科学家通常既是新思想的提出者,又是第一个实现者。FORTRAN是第一个真正推广的用于科学计算的高级语言,五十年代,
Backus在设计和实现FORTRAN语言方面作出了极大努力。由于当时的计算机速度慢,内存小,程序员习惯于用各种编程技巧来提高运行速度,因此FORTRAN编译系统在下标变量优化,全局优化和充分利用当时IBM
704上很少几个变址寄存器方面费尽心计,以保证目的程序有高的运行效率。经过Backus等人的艰苦努力,才使FORTRAN得到承认。美国巨型机先驱,被称为巨型机之父的Cray,从1964年的CDC
6600,直到后来的Cray巨型机,二十多年的时间内始终处于这一领域的前沿(当然现在受到超并行机方案的严重挑战)。CDC
6600使用硅管、分立元件,多个运算器同时工作,达到每秒300万次的高速度,六十年代中期称霸一时。Cray的一个很大本领是用体系结构和逻辑设计的办法把器件潜力全部控掘出来,达到可能的最高运算速度。他曾说过,当他提出一个新的构思时,人们常常说“Can't
do”(做不成),而对这种怀疑的最好回答是“Do it
yourself”(自己动手做)。从1975年到1988年这段时间内,Cray的这段话曾给过我很大的鼓舞力量。我于1976年提出了用轮廓加参数的方法描述高分辨率汉字字形,提出了跳过光机式第二代照排机、阴极射线管第三代照排机,直接研制第四代激光照排系统,提出了用逐段高速形成版面点阵并缓冲的方法驱动逐线扫描的高精度激光输出设备。当时相信的人很少,认为我在玩弄骗人的数学游戏,根本无法实现。1980年当原理性样机(华光Ⅰ型)排出样书后,人们相信上述方案是可以实现的,但多数人认为即使能够实现,也无法与国外产品竞争。直到1989年外国公司纷纷败下阵来,局面才戏剧性地根本扭转。正是按照Cray这段话的精神,我们马不停蹄,不断创新,从华光Ⅰ型一直到现在的方正93系统,十八年来可以说一口气都没有歇过。
“自己动手做”的另一范例是我国数学家吴文俊,吴先生五十年代就已大名鼎鼎,成为当时中国最年轻的学部委员之一。晚年他在定理的机器证明方面取得重大突破,国外誉为“吴方法”。这些年来他用计算机来验证和发展他的理论,上机时间比年轻人还多。科学院数学研究所的一位研究员给我讲过一个故事,他说前几年的一个农历除夕晚上八点多钟,他在外面散步时看到吴文俊先生还在机房上机。一个享有盛名的科学家在致力于新领域的突破时仍需自己动手,更不用说年轻人了。好的数学基础,强的动手能力和第一线实践经验,再加上洞察力和创造性等因素,就有可能取得出色的成就。Hoare的经历是有启发的,他在Elliott当程序员期间,参与了ALGOL
60语言的制定和成功地主持了编译系统的设计和实现,这给他后来在程序语言的形式化定义方面的贡献打下了基础;他在六十年代中期研制操作系统方面的挫折使他致力于并行程序和语言的研究、操作系统结构,尤其是进程之间通信方面一些基本问题的研究。
软硬件的结合曾带来突破性成果
五十年代和六十年代硬件和软件的结合给计算机体系结构带来一系列的突破,计算机硬件方面的很多高招均来自程序和应用的需要。五十年代初的DYSEAC机用指令计数器作变址,使子程序从磁鼓调入内存后,可以放在任意区域而不必修改程序中的地址,此即早期的地址浮动;1958年麻省理工学院林肯实验室研制的晶体管计算机TX-2实现了外部设备多个进程的并行工作,当时称为多道序列(mul-ti-sequence),这是多道程序的前身;五十年代设计,1961年运行的大型机Stretch(即IBM
7030),号称每秒百万次运算,其研制是与应用紧密结合的。除了指令先行部件、一拍完成多位操作的运算器、I/O交换器等一系列特点外,Stretch硬件中断后的操作是用程序来实现的,这点给我印象特别深。最使我激动不已的是1961年初看到的关于Atlas计算机的一篇不到一页的简短报道,Atlas是英国曼彻斯特大学研制的,主设计师Tom
Kilburn;样机也叫Muse,首创了虚拟存储器,该机于五
十年代末设计,1962年运行,其详细细节于1962年后才披露。At-las是一台大型计算机,每秒几十万次运算,支持多道程序;但英国比较穷,不象Stretch那样使用容量大的磁心存储器,而只用16K×48位的磁心存储器,再加上第二级90多K字的磁鼓存储器,组成了所谓的“一级存储器”(One
level
storage,当时还没有虚拟存储器Virtualmemory这一名称)。一级存储器的调度和外设所有资源的管理由一个管理程序Supervisor完成,而Kilburn是主要设计者,可见他是精通程序的;Kilburn又是杰出的电路专家,他曾利用晶体管某些开关特性使加法器进位链上的延迟降低到最小,他发明的这一电路当时被称为Kilburn加法器。虚拟存储器除了要有好的调度算法和调度程序外,另一关键问题是要有一个小容量(例如32个单元)超高速的页寄存器堆和附加的全等比较电路,可以对所有的寄存器同时作全等比较。每次访问内存前,首先把要访问的虚拟页地址与堆中的所有单元内容同时作全等比较,判断当前页是否在内存:若在,则读出对应的内存物理地址;若不在,则需从外存读入一个页面。判断当前页面是否在内存,并把虚拟地址变成物理地址的操作必须极快。Kilburn的电路才能使他有魄力用晶体管分立元件来实现这一创新的方案。这一事例再一次说明具有两方面专长的人在面临挑战时会萌发新的构思。
1961年我从北大数学系计算数学专业毕业已三年,主持过电子管计算机逻辑设计和整机调试工作,也参与过部分电路设计工作,一直在硬件第一线上跌打滚爬,在紧张工作的同时,也阅读国外文献。五十年代国外有名的计算机体系结构使我赞叹不已,我试图寻找创造的源泉,即这些创新构思的背景,逐步领悟到程序和应用对硬件设计的重要性。1961年我作出了一生中最重要的一个决定:从硬件转向软件,但不放弃硬件,而是从事软硬件相结合的研究以探讨软件对未来计算机体系结构的影响。当时软件Software这一名词还没有,帮我在这一领域入门的是前苏联Ершов写的“快速电子计算机编制程序的程序”,即详细介绍他们研制的一个程序设计自动化系统框图的书,
Ершов后来成为前苏联科学院院士;另一本是详细介绍IBM
650上流行很广的汇编语言SOAP资料;另外还看了FORTRAN的一些文章,后来则仔细钻研了修改后的ALGOL
60语言以及一系列叙述编译系统原理的文章。当时有一种“茅塞顿开”的感觉,原来我以为自己是懂得计算机的,此时才发现只有了解软件,才真正懂得计算机。高级语言、汇编语言(和机器语言)以及微程序语言是三个不同级别的语言,贯通这三者,必然会在体系结构上有创新的构思。为了这一目的,1964年我承担了当时正在进行硬件设计的DJS
21机的ALGOL 60编译系统,这一系统是与许卓群、陈 、朱万森等人合作完成的,后来又经数学所陆汝钤等高手的精心修改、完善,才在几十个用户中得到了推广。DJS
21机的ALGOL 60系统采用的是标准的ALGOL 60语言,只是因为DJS
21机的内存只有4K字(后改为8K字),因而限制了子程序的递归调用,除此之外,几乎与ALGOL 60没有什么差别,连五单位的纸带码都尽量和欧洲从事ALGOL
60语言的确定和编译系统的小组ALCOR的编码相同,在当时批判洋奴哲学的极左路线下,这样做也是要冒风险的,但我始终认为应遵循国际标准,不该创新的地方不应创新。为了保证实用和能够推广,坚持让用户在源程序一级上调试,为此增加了一系列程序运行时指示错误的措施,例如当某个运算符发出算术溢出时,能准确指示源程序上产生溢出的运算符的位置,并把该运算左右两个分量溢出前的值打出,并打出此溢出出现前标志程序流程的16个标号,以协助用户追查错误的根源,这些措施后来很受用户的欢迎。我觉得,不能浮光掠影地参加一个软件系统的研制,而应该彻底投入一个真正实用的系统,这样才能切实理解软件对硬件的影响。六十年代的那些日子里,我用90%的时间从事ALGOL
60编译系统的研制,另外10%的时间探讨适合高级语言的计算机的体系结构。对于ALGOL 60,FORTRAN, PASCAL这类汇集时间(binding
time)早的高级语言,我从来不赞成硬件直接执行高级语言的方案,而主张寻找编译和目的程序运行中的瓶颈,依靠灵巧的硬件设计显著地提高效率。下标变量的处理是个瓶颈,子程序调用(尤其是递归调用)又是一个瓶颈,因为在子程序入口时需要保存和建立一整套的环境,以便处理局部量、局部数组、参数和返回地址,这些在当时的常规计算机(例如IBM
360)上都是很费时间的。由于我有硬件实践经验,所以很容易想出硬件上的方法来克服这些瓶颈。当时我感到似乎找到了创造的源泉,并相信一旦有了这种源泉,中国人有可能和外国人同时或更早提出某些新的思想。这种信心,以及软硬件两方面的知识和实践是我后来能够承担激光照排系统研制的决定性因素。五十年代和六十年代初软件尚未充分发展,硬件则还是分立元件时代,设计和实现一台计算机的硬件还是一件复杂的事,往往意味着好几个大的机箱,因此同时通晓软、硬件,并具有两方面实践经验的人是不多的。我国当时尚苦恼于磁心存储器和逻辑电路的稳定性问题,对软件还很不重视,更谈不上过问硬件如何适应软件的问题。Robert
Barton是软硬件结合从事体系设计的先驱者之一,五十年代末和六十年代中,他主持设计的一系列Burroughs公司的计算机B5000,B6000,B7000是这方面的典范,Barton获1979年Eckert-Mauchly奖(体系结构方面的专项奖)。软硬件的结合在六十年代曾带来一系列的突破,而今天的硬件很大程度上变成芯片设计的问题,同时熟悉主机板上各芯片的外部性能和相应的某些软件已不是一件困难的事情了,年轻一代应寻找新的突破点。
要及时了解和学习国外最新成就
六十年代初在研究计算机体系结构和编译系统过程中,我大概看了近一百篇国外文献,以后养成了每做一个项目先要了解国外现状的习惯。为了加快英文阅读速度,1963年初又决定锻炼听力,先收听短波中北京电台对外英语广播,后来觉得不过瘾,就收听英国广播公司BBC对远东的英语广播,1963年起连续二年多,每天半小时的收听使我反映速度明显加快。“收听敌台广播”后来在文化革命中成了我的一条“罪行”,带来不少麻烦,因为文革前这样做的理科教师很少,因而显得情节严重。今天,年轻一代比我们这一代的英语水平要高,各类杂志又很多,条件比十多年前好多了;但今天面临国际市场的激烈竞争,及时掌握情报的重要性比以前更加突出。除从书本和杂志上学习外,研究单位的局域网还应与国际网络相连,应及时购买光盘出版物(这是更新最快的出版物),和购买各种最新版本的软件供学习研究用,这是智力投资所必需的。
1993年3月12日
———选自《王选文集》北京大学出版社1996年版
|