“结构程序设计”概念

来源:互联网 发布:win10蓝牙共享网络 编辑:程序博客网 时间:2024/06/07 23:06

“结构程序设计”概念被称为软件发展中的第三个里程碑(第一、二个里程碑是子程序和高级语言),是由著名的荷兰计算机科学家埃德斯加·狄克斯特拉(Edsgar Wybe Dijkstra)。早在1965年召开的IFIP会议上,Dijkstra就提出“Go To语句可以从高级语言中取消”,“一个程序的质量与程序中所 含的Go To语句的数量成反比”。在1966年,C·Bohm和G·Jacopini就证明了程序设计语言中,只要有顺序、选择和循环三种形式的控制结 构,就足以表示出其他各式各样的程序结构。1968年3月,ACM通讯(Communications of ACM)登出了狄克斯特拉的那封影响深远的信《Goto语句看来是有害的》("GOTO Statement Considered Harmful"),在信中他根据自己编程的实际经验和大量观察,得出如下结论:一个程序的易读性和易理解性同其中所包含的无条件转移控制的个数成反比关系,也就是说,转向语句的个数愈多,程序就愈难读、难懂。因此他认为"GOTO是有害的”,并从而启发了结构化程序设计的思想。1972年,他与当时在爱 尔兰昆士大学任教的英国计算机科学家、1980年图灵奖获得者霍尔(C.A.R.Hoare)合著了《结构程序设计》一书(Structured Programming,Academic Pr.),进一步发展与完善了这一思想,并且提出了另一个著名的论断:“程序测试只能用来证明有错,决不能证明无错!”(Program testing can be used to show the presence Of bugs,but never to show their absence!)。有关Goto语句的争论,直到1974年克努特发表文章《带有Goto语句的结构化程序设计》之后才平息下来。他主张在语言控制划分中仍然保留Goto语句,在功能方面不加限制,但限制其使用范围。结构化程序允许有Goto语句,但它只能在本程序块内使用,不允许从一个结构转移到另一 个结构。

在与癌症进行了多年的斗争之后,伟大的荷兰计算机科学家EdsgerWybe Dijkstra已经于2002年8月6日在荷兰Nuenen自己的家中与世长辞!终年72岁。

 

 

“结构程序设计”的主要观点是采用自顶向下、逐步求精的程序设计方法;使用三种基本控制结构构造程序,任何程序都可由顺序、选择、重复三种基本控制结构构造;其实质是控制编程中的复杂性。该方法的要点是:
(1) 没有GOTO语句;
(2) 一个入口,一个出口;
(3) 自顶向下、逐步求精的分解;
(4) 主程序员组。
其中(1)、(2)是解决程序结构规范化问题;(3)是解决将大划小,将难化简的求解方法问题;(4)是解决软件开发的人员组织结构问题。

详细描述处理过程常用三种工具:图形、表格和语言。
图形:程序流程图、N-S图、PAD图
表格:判定表
语言:过程设计语言(PDL)

 

程序流程图

程序流程图又称为程序框图,它是历史最悠久使用最广泛的描述过程设计的方法,然而它也是用得最混乱的一种方法。

下图中列出了程序流程图中使用的各种符号。

  (a)选择(分支);(b)注释;(c)预先定义的处理;(d)多分支;(e)开始或停止;(f)准备;(g)循环上界限;(h)循环下界限;(i)虚 线;(j)省略符;(k)并行方式;(1)处理;(m)输入/输出;(n)连接;(0)换页连接;(p)控制流。从20世纪40年代末到70年代中期,程序流程图一直是过程设计的主要工具。它的主要优点是对控制流程的描绘很直观,便于初学者掌握。由于程序流程图历史悠久,为最广泛的人所熟悉,尽管它有种种 缺点,许多人建议停止使用它,但至今仍在广泛使用着。不过总的趋势是越来越多的人不再使用程序流程图了。

    程序流程图的主要缺点如下:

    程序流程图本质上不是逐步求精的好工具,它诱使程序员过早地考虑程序的控制流程,而不去考虑程序的全局结构。

    程序流程图中用箭头代表控制流,因此程序员不受任何约束,可以完全不顾结构程序设计的精神,随意转移控制。

    程序流程图不易表示数据结构。

    应该指出,详细的微观程序流程图——每个符号对应于源程序的一行代码,对于提高大型系统的可理解性作用甚微。

 

PAD图

定义

PAD是问题分析图(Problem Analysis Diagram)的英文缩写,自1973年由日本日立公司发明以来,已经得到一定程度的推广。它用二维数形结构的图表示程序的控制流,将这种图转换为程序代码比较容易。

 

优点

1. 使用表示结构优化控制结构的PAD符号所设计出来的程序必然是程序化程序
2. PAD图所描述的程序结构十分清晰。图中最左边的竖线是程序的主线,即第一层控制结构。随着程序层次的增加,PAD图逐渐向右延伸,每增加一个层次,图形向右扩展一条竖线。PAD图中竖线的总条数就是程序的层次数;
3. 用PAD图表现程序逻辑,易读、易懂、易记。PAD图是二维数型结构的图形,程序从图中最左边上端的结点开始执行,自上而下,从左到右顺序执行;
4. 很容易将PDA图转换成高级程序语言源程序,这种转换可由软件工具自动完成,从而可省去人工编码的工作,有利于提高软件可靠性和软件生产率。
5. 可用于表示程序逻辑,也可用于描述数据结构
6. PAD图的符号支持自顶向下、逐步求精方法的使用。开始时设计者可以定义一个抽象程序,随着设计工作的深入而使用“def”符号逐步增加细节,直至完成详细设计。

 

 

 

 

结构程序设计的相关论文和书籍

(1) Bohm, C, and G. Jacobini, FlowDiagrams, Turing Machines, and Languages with only Two Formation Rules, Comm,ACM(9)5 (1966 May),366-371.

    C·Bohm和G·Jacopini证明了程序设计语言中,只要有顺序、选择和循环三种形式的控制结构,就足以表示出其他各式各样的程序结构。

(2) E. Dijkstra. "GOTOStatement Considered Harmful" Communications of the ACM, 11:3, p. 147,March 1968.

    Dijkstra根据自己编程的实际经验和大量观察,得出如下结论:一个程序的易读性和易理解性同其中所包含的无条件转移控制的个数成反比关系,也就是说,转向语句的个数愈多,程序就愈难读、难懂。因此他认为"GOTO是有害的”

(3) O.-J. Dahl, E.W. Dijkstra,C.A.R. Hoare."Structured Programming" Academic Press, 1972.

    《结构程序设计》达尔,O.-J., DIJKSTRA,E.W.,HOARE  (陈火旺等译)科学出版社,1980年.

(4) Knuth, Donald E."Structured Programming with go to Statements" ACM Computing Surveys6(4):261-301, December 1974.

    Knuth主张在语言控制划分中仍然保留Goto语句,在功能方面不加限制,但限制其使用范围。结构化程序允许有Goto语句,但它只能在本程序块内使用,不允许从一个结构转移到另一个结构。

(5) Edsger Dijkstra, Notes onStructured Programming, pg. 6

 

 

 

 

 

 

 

 

 

 

 

 

 

王选:从Dijkstra谈帅才的洞察力

 

    编者按:9月5日,本期报纸即将截稿付印之际,方正集团转来了王选老师特别写给《计算机世界》的这篇文章。 

    在文中,王选院士缅怀计算机科学先驱Dijkstra的历史功绩,在技术的时空中浓缩大师的魅力、勾勒计算机科学发展的轨迹。但在缅怀的背后,更值得读者重视的,是王选老师对中国软件产业缺乏既懂管理又懂技术的“师才”的忧虑。 

    《计 算机世界》最近报道了计算机科学先驱Dijkstra于8月上旬逝世的消息。Dijkstra被西方学术界称为“结构程序设计之父”和“先知先觉” (Oracle),他一生致力于把程序设计发展成一门科学。科学研究的帅才最重要的素质是洞察力(Vision和Insight),能够发现有前景的新领 域或在新领域内发现和解决最关键的问题。下面仅举几例说明Dijkstra的洞察力。 

    解决编译系统中的关键问题 

    FORTRAN 是最早得到一定程度推广的高级语言,但FORTRAN的编译系统并未科学地解决一些主要的难题。最早提出用堆栈(stack)来编译复杂公式的是德国的 Bauer和Samelson,他们的著名论文“顺序公式的翻译”(Sequential Formula Translation)是编译方面的经典论文。最近有些报道说Dijkstra是堆栈的发明人,这恐怕不符事实。Dijkstra发展了堆栈的概念,使之用于整个编译,以及目标代码运行时的动态存储分配,并在此基础上和Jenson完成了世界上第一个ALGOL60编译系统,采用了他首创的优先数编译算法。其中递归调用子程序时的环境维护是 Dijkstra的重要贡献,Display这一术语就是当时他发明的,这是用来维护动态环境的一组寄存器(软件),其结构清晰并能适应任何复杂情况。我于20世纪60年代初看完他的文章后马上想到,假如计算机硬件中有对应的设备将极大地提高软件的运行效率。 

    Dijkstra是ALGOL 60报告的主要起草者之一,1972年Dijkstra在他获得ACM图灵奖的讲演中,仍对这一报告给予高度评价:“只有极少极少几个像ALGOL60报告这样短的文件能给计算机界带来如此深远的影响。” 

    同步进程的协调和操作系统的结构 

    Dijkstra 在1950~1952年期间曾当过三年程序员,在从事硬件中断处理程序的研制中,他发现一些程序错误在多个中断同时出现的情况下无法再现,很容易被当作硬件的瞬间故障,这一现象使Dijkstra毛骨悚然,促使他后来钻研用科学方法从事软件研制。操作系统是当时最复杂的软件,1965年Dijkstra在 ACM通讯上发表了仅一页长的短文“并行程序的控制”,这是他在操作系统领域的第一个重要贡献。该文提出了并行程序互锁问题的一个解决方案。“死锁” (Deadly embrace)这一术语是Dijkstra发明的。1967年在首届操作系统原理研讨会上,Dijkstra介绍了他和几个博士生研制 的THE多道程序系统。THE系统的目的是验证Dijkstra关于操作系统原理、结构、同步进程通信机制等方面的一系列新想法。今天已经普遍采用的系统的多层结构、抽象、上层不需了解下层的详细细节等科学原则就是当时Dijkstra提出的,引起了强烈反响;同步进程通信的信号量Semaphore这一 术语也是Dijkstra当时创造的。 

    同步进程协调方面的程序错误是很难发现的,为此我曾吃过大苦头。1979年我开始设计Ⅱ 型照排系统,用了两台双极型高速微处理器平行工作实现轮廓字形的复原和控制激光扫描,两台微处理器通过信号量彼此协调。设计和编程均无错误,但在把微程序翻译成二进制代码时错了一位,结果造成了无法再现的随机故障:激光打印机输出的汉字有时拖尾巴。这一故障持续了一年多,引起用户不满,后由潍坊计算机公司 的一位协作人员挖空心思地发现了错误的原因,即二进制码错误,问题才得以解决。 

    上世纪六十年代操作系统的研制经受了一系列重大挫折,典型的例子是OS 360。而Dijkstra为首的一批科学家的努力,使操作系统走上了健康发展的道路。 

    Go To语句有害和结构程序设计 

    结 构程序设计被称为软件发展中的第三个里程碑(第一、二个里程碑是子程序和高级语言)。早在1965年召开的IFIP会议上,Dijkstra就提出 “Go To语句可以从高级语言中取消”,“一个程序的质量与程序中所含的Go To语句的数量成反比”。但是,Dijkstra讲话的影响很小,当时人 们正忙于IBM 360系列的使用;而IBM 360的主要语言之一是FORTRAN,Go To语句则是FORTRAN的支柱。 

    1968 年Dijkstra给ACM通讯写了一篇短文,该文后改成信件形式刊登,以便早日发表,这就是具有历史意义的、著名的“Go To Letter”。 Dijkstra在信中建议:“Go To语句太容易把程序弄乱,应从一切高级语言中去掉;只用三种基本控制结构就可以写各种程序,而这样的程序可以由上而下阅读而不会返回”。这封信引起了激烈的讨论。人们逐渐认识到:不是一个简单地去掉Go To的问题,而是促进一种新的程序设计观念、方法和风格,以期 显著提高软件生产率和降低软件维护代价。当时采用结构程序设计方法的两个最著名项目是: 

    1. 纽约时报信息库管理系统,含8.3万行源代码,只化了11人年,第一年使用过程中,只发生过一次使系统失效的软件故障; 

    2. 美国宇航局空间实验室操作的模拟系统,含40万行源代码,只用两年时间就全部完成。 

    上个世纪六十年代末到七十年代初,上述这两个系统可以算得上是大型软件了。 

    结构程序设计概念影响了后来的高级语言,也影响了一代程序员的风格和习惯。 

    坚持真理,不惜反对恩师 

    ALGOL 68 语言是Van Wijingaarden为主设计的,得到了IFIP下属的工作小组的多数票通过。Wirth、Dijkstra和Hoare等工作小组成 员发表了“少数派报告”,强烈反对这一语言及其表达方式。ALGOL 68的表达方式独特而严格,但不易理解,是Wijingaarden的发明。事实证 明,少数派是正确的,ALGOL 68很快就夭折了。 

    要知道,Wijingaarden是Dijkstra的恩师。上世纪五十 年代初Dijkstra在阿姆斯特丹数学中心编程序时Wijingaarden是他的领导。Dijkstra当时正在攻读理论物理学位,他发现理论物理课程和程序设计在精力上越来越冲突,他又拿不定主意,到底成为一个理论物理学家还是选择程序设计作为自己的职业,而他当时又担心程序设计能否成为被尊敬的学 科。充满不安心情的Dijkstra于1952年春的一个早晨敲开了Wijingaarden办公室的门。几个小时的谈话,使Dijkstra变了另外一个人,因为Wijingaarden向他指明了程序设计这门学科正处在起步阶段,因而有重大的机会,Dijkstra可以努力使程序设计变成一个受人尊敬 的学科。Dijkstra把这次谈话称为他一生中的转折点,于是决定尽快结束理论物理研究,全身心地投入程序设计。Dijkstra说,为此他应该终生感 谢Wijingaarden。但是Dijkstra还是强烈地反对其恩师的得意之作ALGOL 68,少数派报告虽被IFIP压制,但真理终究得到了证 明,后来的成功语言都是背离ALGOL 68方向的。 

    Dijkstra的名言今天仍有现实意义 

    Dijkstra 的主要贡献是在上个世纪五十年代末到七十年代初,也就是他二十多岁到四十岁出头这段时间完成的。回忆这些过去的成就是想强调:洞察力对一个科学家是何等的重要! Dijkstra获图灵奖以后,软件领域又涌现出图形用户界面、面向对象技术等一系列新的里程碑,因特网更是带来一个全新的时代。但是三十年前 Dijkstra关于程序可靠性的一些名言至今仍有意义: 

    “有效的程序员不应该浪费很多时间用于程序调试,他们应该一开始就不要把故障引入。” 

    “程序测试是表明存在故障的非常有效的方法,但对于证明没有故障,调试是很无能为力的。” 

    Dijkstra 大力鼓吹程序正确性证明,但这一方法离实用还有相当距离,因为一段源程序的正确性证明的文字往往比源代码还要长,所以充分的软件测试今天仍不可或缺。但是程序员的科学训练是十分重要的,有人曾做过一个试验:一个题目由一批印度程序员编程,其结果惊人地相似;而由一批中国程序员来做,编出的程序五花八门。中 国的软件人员有时把创造性放在不恰当的地方。只有规范的科学的编程,一个大项目才能得到有效的管理,其质量才有保证。 

    中国软件产业的发展需要有洞察力的帅才,也需要一大批训练有素的程序设计人员和既懂技术又懂管理的项目领导人。 

    2002年9月3日 

    王选简历 

    王 选教授,男,汉族,江苏无锡人,1937年2月生于上海,1958年毕业于北京大学数学力学系。现为北京大学计算机研究所所长、教授、博士生导师,中国科学院院士、中国工程院院士、第三世界科学院院士,文字信息处理技术国家重点实验室主任,电子出版新技术国家工程研究中心主任,北大方正集团董事,方正控股 有限公司首席科技顾问,全国人大常委,人大教科文卫委员会副主任委员,九三学社副主席,中国科协副主席。 

    王选院士是著名的计算 机应用专家,主要致力于文字、图形、图象的计算机处理研究。1975年开始主持我国计算机汉字激光照排系统和以后的电子出版系统的研究开发,跨越当时日本 的光机式二代机和欧美的阴极射线管式三代机阶段,开创性地研制当时国外尚无商品的第四代激光照排系统。并在国内外得到迅速推广应用,使中国报业技术和应用水平处于世界最前列。被誉为“当代毕”。 

    王选院士曾荣获联合国教科文组织科学奖,日内瓦国际发明展览金牌,首届毕奖,首届中国 专利金奖,陈嘉庚奖,何梁何利科学与技术进步奖,美洲华人工程师学会成就奖、海外华人设立的潘文渊奖、王丹萍奖,香港蒋氏科技成就奖,以及全国先进工作者、北京市劳模、“首都楷模”、首都精神文明建设奖等荣誉。鉴于王选教授在科技领域作出的杰出贡献,国务院隆重授予他2001年度国家最高科学技术 奖。 (计算机世界报)