查尔斯•霍尔

 

Rule of Simplicity (by C.A.R. Hoare) - -
                                       
"There are a number of ways of constructing a software design. 
One way is to make it so simple that there are obviously no deficiencies, 
and the other way is to make it so complicated that there are no obvious deficiencies." -- C.A.R. Hoare 


查尔斯·霍尔

                   ---QUICKSORTCASE到程序设计语言程序设计语言的公理化

    学过“数据结构”或“算法设计与分析”的人都知道著名的快速排序算法QUICKSORT;编过程序的人大概也都用过实现条件转移的最方便的语句CASE语句。但是你知道这个算法和这个语句是谁发明的吗?它们的发明者就是1990IEEE计算机先驱奖和1980年图灵奖的获得者英国牛津大学计算机科学家查尔斯·霍尔(Charles AntonyRichard Hoare)。当然霍尔之所以获得这两项大奖决不仅仅是因为他发明了QUICKSORTCASE,而是因为他在计算机科学技术的发展中,尤其是在程序设计语言的定义和设计、数据结构和算法、操作系统等许多方面都起了重要的作用,有一系列发明创造,QUICKSORTCASE只是其中的一小部分而已。

    霍尔于 1934111日 诞生于英国南部。在坎特伯雷(Canter·bury)的国王学校(Kings Sch001)度过中学阶段以后,进入牛津的莫顿学院(Merton College)学习数学,1960年取得硕士学位。之后他进入伦敦一家不大的计算机生产厂家Elliott Brothers公司,为该公司的Elliott 803计算机编写库子程序,从此开始他的计算机生涯。QUICKSORT就是他在那个时候用原有的SHELLSORT(以算法的发明人DLShell命名的通过调换并移动数据项实现排序的一种算法,发明于1959)编程时分析了它的缺点而发明出来的。QUICKSORT具有“快刀斩乱麻”的特点,能迅速地对乱序作大幅度调整,特别适合于因多次追加、删除而变得杂乱无章的数据集合。QUICKSORT是利用“分治法”(divide and conquer)进行算法设计的一个成功范例,它的发明是霍尔在计算机方面的天才的第一次显露,受到老板的赞赏和重视。第二年,霍尔接受了一个新的任务,为公司的新机型Elliott 503设计一个新的高级语言。但就在其时,他弄到了一份Algol 60报告的复印件,还参加了一个由狄克斯特拉(EWDstra,首届计算机先驱奖获得者)等人在布赖顿举办的Algol 60培训班,感到与其自己没有把握地去设计一个新的语言,还不如将比较成熟的Algol 60Elliott 503上加以实现。霍尔和他的同事们的这个想法获得公司同意以后,由霍尔主持设计与实现了Algol 60的一个子集的版本。霍尔在开发初首先制定了明确的目标,即系统要安全可靠,生成的目标码要简洁,工作区数据要紧凑,过程和函数的人口和出口要清晰、严密等,还明确了整个编译过程采用一次扫描等原则。这样,ElliottAl-gol的开发十分顺利与成功,它在1963年中推出以后大受欢迎,成为世界各国所开发的Algol 60的各种版本中在效率、可靠性和方便性等方面的性能指标都首屈一指的一个版本,霍尔本人也从此受到国际学术界的重视。国际信息处理联盟IFIP后来任命霍尔为21工作组(WorkingGroup 21)的负责人,这个工作组的任务是维护和发展Algol。霍尔果然不负众望,主持设计了Algol X以继承与发展Algol60。正是在AlgolX的设计中,霍尔发明了CASE语句。CASE语句具有如下形式的语法结构:

CASE E of

C1:S1

C2:S2

.

.

.

Cn-1:Sn-1;

Otherwise:Sn

End

其中E是一个表达式,称为“选择子”(Selector),每个Ci的值为常数,称为“分情形标号”,Si则为可执行语句。CASE语句的含义是:若E的值等于某个Ci的值,则执行其后的Si(i=123,…,n1),否则执行Sn。某个SiS。执行完之后,整个CASE语句也就执行完毕。由于CASE语句构成多路分支,程序结构清晰、直观,所以CASE语句后来几乎成为程序设计语言的标准,被各种语言广泛采用。在C语言中,没有独立的CASE语句,但它的SWITCH语句(开关语句)实际上是在CASE语句的基础上形成的:

switch E

{case C1:S1

case C2:S2

.

.

.

case Cn-1:Sn-1;

[default:Sn]

  不同之处有二:一是C;可以是表达式,但计算结果必须仍是常数;二是E的结果若不等于某个Ci(i=123,…,n1)的值,则视有无default子句,若有,执行Sn;若无,则什么也不执行,控制转向SWITCH后的语句。显然,这些都是对CASE语句的进一步改进。

  霍尔于1968年离开Elliott,离开产业界,原因是作为学者他对程序设计浯言的形式化定义这类更偏重于学术性和理论性的课题更感兴趣。离开Elliott以后,他任职过一年英国国家计算中心主任,发现自己也不适于从事行政管理,因此又转入爱尔兰的昆土大学(Queens University),从事教学和研究,1977年转入牛津大学。离开Elliott以后,霍尔在计算机科学理论的研究中发挥其特长,作出了许多创造性的重大贡献。首先是196910月,霍尔在Communications of ACM上发表了他那篇有里程碑意义的论文“计算机程序设计的公理基础”(An Axiomatic Basis for Computer Programming)。在这篇论文中,霍尔提出了程序设计语言的公理化定义方法,即公理语义学(axiomatic semantics),也就是用一组公理和一组规则描写语言应有的性质,从而使语言与具体实现的机器无关,而且也易于证明程序的正确性。这是继麦卡锡(JMcCarthy1985年计算机先驱奖获得者)1963年提出用递归函数定义程序、弗洛伊德(RWFloyd1991年计算机先驱奖获得者)1967年提出基于程序流程图的归纳断言法以后,在程序逻辑研究中所取得的又一个重大技术进展。霍尔提出的方法在逻辑上与弗洛伊德提出的方法类似,但不是用流程图而是用代数法,即控制流用以下一些结构表示:

    begin ala2a3;…;an end

    if p then a1 else a2

    while p do a

    后面为了方便,我们用到第一个结构时省略首尾的beginend

    相应于弗洛伊德的验证条件,霍尔引入下列符号:

    p{a}q

    其意义是:如果在执行。之前P(叫做precondition)成立,则当α执行完了后q(叫做postcondition)成立。

    霍尔给出了以下一组证明规则(proof rule)或叫推导规则:

       p pp{a}qqq

    1.

          p{a}q

    这个规则中的p’→和q’→q是普通数理逻辑中的断言命题,表示若p(q)成立,则p(q)成立。这个规则表示,若横线以上的p’→pp{a}qqq’成立,则横线以下的p{a}q1成立。

2

   P(e){x:=e}p(x)

这个规则表示,如果在将e赋给x之前p(e)成立,则其后p(x)成立。

 

3 P{a}qq{b}r

    p{a;b}r

    这个规则表示的是“传递律”(transitive law),即如果执行α之前p成立,α执行完了以后q成立;而如果执行b之前q成立,b执行完了以后r成立,则若在动作序列。和^执行之前P成立,则ab执行完了以后r成立。

  

   4.   pr{a}qp∧~r(b)q

       p{if r then a else b}q

 

    这个规则中的∧和~是一般数理逻辑中的合取(conjunction)和否定(negation)连接词。这个规则定义了if-then-else的执行取决于precondition r的值。

  

5.        pq{a}p

     p{while q do a}p∧~q

    这个规则定义了while循环:p是循环不变量(loop invariant),而q是终止循环的条件。

    下面我们举一个例子说明如何用霍尔建立的系统验证程序的正确性。设有计算n的阶乘n!的如下程序:

A: x:1;B

B: while y>0 do C

C: x:y×x;y:=y-1

    则通过下列霍尔断言可以证明上述程序是正确的,因为这些断言都是真的,而且在霍尔的系统中是可以被证明的,而最后一个断言正是我们所要寻求的结论,因此它们形成对上述阶乘程序正确性的说明。

i.  y>0x×y! =n! {x:=y×x}y>0x×(y-1)! =n!

[首先y>0x×y! =n!y>0(y×x)×(y-1)! =n!]

然后用规则(2),用x代替y×x]

ii. y>0x×(y-1)! =n!{y:=y-1}y0x×y! =n!

    [类似(i),利用规则(2]

iiiy>0x×y! =n! {C}y0x×y! =n!

[(i)(ii)用规则(3)]

ivY0y=nx=1{B}x=n!

[因为] y=nx=1x×y! =n!

又因为0 =1,所以Y0x×y! =n! y0y=0x=n! x×y! =n!

根据(iii),利用规则(5),令(5)中p=y0x×y! =n!q=y>0,孥可得(iv)]

v.  y0y=n{x:=1}y0y!=nx=1

[因为p{x:=1}px=1]

vi. y0y=n{A}x=n!

[对(V)和(Vi)利用规则(3)]

    因为(vi)中的precondition正好是n的初始条件,而postcondition给出了所需结果,这样就证明了程序可算出n!

    为了给出证明,应该从程序的最后一行开始逐步后推。在这个例子中,(iii)步是最关键的,其中y0x×y! =n!就是循环不变量或归纳假设(induction hypothesis)

    利用霍尔提出的这种方法,已经成功地描述了PASCAL等语言,说明了这个方法的巨大威力。但应该指出的是,霍尔的这个方法是不完备的,因为霍尔在开发和建立这个系统时并没有追求系统的完备性,而更多地追求系统的实用性。

    在数据类型、数据结构和操作系统设计等方面,霍尔也做了许多开创性的工作。目前广泛流行与应用着的许多概念都源于霍尔的工作。例如,关于抽象数据类型的规格说明(Specification,也叫规约)与其实现是否一致,就是由霍尔于1972年公式化了的。霍尔通过前后断言方法用已经定义了的(抽象)数据类型给出所要定义的新类型的抽象模型,这成为抽象数据类型规格说明的两种主要方法之一,即模型方法(另一方法为基于异调代数理论的代数方法)。对于操作系统的设计与实现十分关键的monitor(监控程序)的概念也是霍尔首先提出,并界定了它的作用与功能,即作为操作系统的核心,在把操作系统看做虚拟机扩充时,monitor是硬件的第一次扩充,它完成中断处理、进程控制与进程通信、存储区动态分配,建立软时钟,驱动设备通道,进行处理机调度。monitor为外面各层的设计提供良好的环境,并提高系统的安全性。

    20世纪70年代后期,霍尔又深入研究了运行在不同的机器上的若干个程序之间如何互相通信、互相交换数据的问题,实现了面向分布式系统的程序设计语言CSP。在该语言中,一个并发系统由若干并行运行的顺序进程组成,每个进程不能对其他进程的变量赋值。进程之间只能通过一对通信原语实现协作:Q?x表示从进程Q输入一个值到变量x中;P!e表示把表达式e的值发送给进程户。当户进程执行Q?x,同时口进程执行户!‘时,发生通信,e的值从Q进程传送给户进程的变量xCSP语言后来成为著名的并行处理语言OCCAM(INMOS公司为Transputer开发)的基础。20世纪80年代中期,霍尔又和布鲁克斯(SBrooks)等人合作,提出了“CSP理论”TCSP(Theory Of Communicating Sequential Processes),它与上述CSP不同,但又有联系,这是一个代数演算系统,其基本成分是事件(或动作)。进程由事件和一组算子构造而成。TCSP采用“广播式通信”,而不像程序设计语言CSP中那样采用握手式通信,即只有当并行运行的各进程都执行同一动作时,才发生通信。此外,TCSP采用失败等价作为确定进程等价的准则,这就是著名的“失败语义”。利用失败可以构造TCSP的指称模型。霍尔为失败等价建立了一些公理系统,可以对语义上的等价关系进行形式推导。霍尔在这方面的工作开创了用代数方法研究通信并发系统的先河,形成了所谓“进程代数”(process algebra)这一新的研究领域,产生了很重要的影响。

    霍尔的论著极多,而且都很有份量,有很高的学术水平。有评论说,霍尔每发表一篇论文,几乎就要改变一次人们对程序设计的认识。这虽然是一种夸张的说法,但也说明霍尔的论著确实非常重要。ACM1983年评选出最近四分之一个世纪中发表在Communications of ACM上的有里程碑式意义的25篇经典论文,只有两名学者各有2篇论文人选,霍尔就是其中之一(另一名是首届计算机先驱奖获得者狄克斯特拉)。霍尔人选的两篇论文分别是196910月的“计算机程序设计的公理基础”(An Axiomatic Basis for Computer Programming,这篇论文的要点我们前面已经介绍过了),另一篇是19788月的“通信顺序进程”(Communicating Sequential Processes),该论文奠定了前述CSP语言的基础。CSP现在已推广为“混合通信/顷序进程”(Hybrid Communicating Sequential Processes)。在这个语言中,有一种特殊的语句称为“连续构件”,可表示一个具体给定初值的微分方程;而原有的通信语句可用来表达事件的起源和发生;语言中的顺序算子、条件算子等则用来刻画连续构件和通信间的耦合关系。

    值得指出的是,霍尔还和我国软件学者、中国科学院软件所的周巢尘研究员等合作,在20世纪80年代末由于EspritProCos项目的需要而对基于时态逻辑的逻辑型混合计算模型进行了研究,在这个模型中引入了时段和切变的概念,建立了时段演算,已引起该领域同行的广泛重视。时段用以刻画系统在一个时间区间上的连续变化,而切变则表示事件的发生(离散变量的变化)。在单个时段上,借助连续数学(微分方程理论)推导系统的行为;而在相邻时段间,则用时态逻辑中切变算子的规则,推导系统行为的转化。这种混合计算模型对于设计要求绝对安全的软件系统具有十分重大的意义。时段演算已在煤气燃烧器、铁路岔口控制、水位控制、自动导航、OCCAM语言的实时语义、描述调度程序的实时行为和电路设计等方面获得成功应用。

    此外,由法国学者阿勃利尔(JRAbrial)提出的以状态机为模型的著名的形式规约语言Z语言,也是由霍尔所领导的研究小组加以发展并实现的。

  霍尔出版的专著主要有以下几种:

  《操作系统技术》(Operating Systems TechniquesAcademic Pr.,1972)

    《数理逻辑和程序设计语言》(Mathematical Logic and Programming languagePrenticeHall1985)

  《并发和通信的发展》(Development in  Concurrency and CommunicationAddison-Wesley1990)

  《机器推理和硬件设计》(Mechanized Reasoning and Hardware DesignPrentice·Hall1992)

    除了获得计算机先驱奖和图灵奖以外,霍尔还在1981年获得AFIPSHarry Goode奖;1985年获得英国IEE的法拉第奖章。霍尔曾应邀到过世界的许多国家讲学,中国科学院研究生院也曾于1983年邀请霍尔到北京讲学,并主办讨论班。1989年霍尔当选为欧洲科学院院士。1992年新加坡政府授予霍尔“李光耀优秀访问学者”称号。在2000年北京WCC大会上,霍尔应邀作了主题报告。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值