族谱网 头条 人物百科

结构化编程

2020-10-16
出处:族谱网
作者:阿族小谱
浏览:620
转发:0
评论:0
底层的结构化程序设计结构化的程序是以一些简单、有层次的程序流程架构所组成,可分为循序(sequence)、选择(selection)及重复(repetition)。循序是指程序正常的运行方式,运行完一个指令后,运行后面的指令。选择是依程序的状态,选择数段程序中的一个来运行,一般会使用if..then..else..endif或switch、case等关系字来识别。重复是指一直运行某一段程序,直到满足特定条件,或是一集合体中的所有元素均已处理过,一般会使用while、repeat、for或do..until等关键字识别。一般会建议每个循环只能有一个进入点(戴克斯特拉的结构化程序设计要求每个循环只能有一个进入点及一个结束点,有些编程语言仍有此规定)。若一个编程语言的语法允许用成对的关键字包围一段程序,形成一个结构,这种编程语言称为有“区块结构”(block-structured),这类的结构包...

底层的结构化程序设计

结构化的程序是以一些简单、有层次的程序流程架构所组成,可分为循序(sequence)、选择(selection)及重复(repetition)。

循序是指程序正常的运行方式,运行完一个指令后,运行后面的指令。

选择是依程序的状态,选择数段程序中的一个来运行,一般会使用if..then..else..endif或switch、case等关系字来识别。

重复是指一直运行某一段程序,直到满足特定条件,或是一集合体中的所有元素均已处理过,一般会使用while、repeat、for或do..until等关键字识别。一般会建议每个循环只能有一个进入点(戴克斯特拉的结构化程序设计要求每个循环只能有一个进入点及一个结束点,有些编程语言仍有此规定)。

若一个编程语言的语法允许用成对的关键字包围一段程序,形成一个结构,这种编程语言称为有“区块结构”(block-structured),这类的结构包括用ALGOL 68的if..fi包围的程序,或是在PL/I中用BEGIN..END包围的一段程序,或是在C语言中用大括号{...}包围的一段程序。

结构化编程语言

用任何语言都可以进行结构化程序设计,不过一般较常使用过程式的编程语言。早期的结构化编程语言包括ALGOL、Pascal、PL/I及Ada,不过后来大部分的过程式编程语言都鼓励使用结构化程序设计,有时也会特意的省去一些特性(例如不支持goto指令)使得非结构化的程序设计更加困难。

历史

理论基础

结构化程序理论可做为结构化编程的理论基础,结构化程序理论中提到利用循序、选择及重复这三种组合程序的方式,可以表示所有可计算函数。上述的三种结构已足以表示CPU中的指令周期,也可以表示图灵机的运作,以此观点来看,处理器所运行的指令可视为是某种“结构化程序”,虽然整个程序可能不是一个结构化程序。一般都认为结构化程序理论是归功于伯姆和贾可皮尼于1966年发表的论文,其中一个原因可能是戴克斯特拉引用过此论文。结构化程序理论未提及如何撰写结构化程序,也没有提到结构化程序的分析,后来1960至1970年代时,戴克斯特拉、罗伯特·弗洛伊德、东尼·霍尔等计算机科学家在此领域有许多的贡献。

争议

结构化编程中一项重要的原则是减少甚至禁止goto指令的使用,不过不是所有计算机科学家都赞成禁止使用goto指令。高德纳赞成程序设计时需考虑可读性,但他不赞成禁用goto指令。在其1974年发表的论文《使用goto指令的结构化编程》(Structured Programming with Goto Statements)中,他提出了一些程序,使用goto指令可以使得程序更清楚而有效率,也不会牺牲程序的可读性。高德纳提出了一个较松的结构限制要求:将程序以流程图表示,前进的分支在流程图的左侧,倒退的分支在流程图的右侧,所有分支均不得交叉。

结构化编程在1970年有很大的进展,IBM的研究员哈伦·米尔斯(英语:Harlan Mills)将结构化编程应用在研究文件索引系统的开发,此计划相当成功,因此许多公司开始使用结构化编程,不过戴克斯特拉评论米尔斯使用的方式和一些已发表论文中的方式不同。

到1987年时在计算机科学领域仍有针对结构化编程的争论,弗兰克·鲁宾发表了一篇论文《“goto有害论”是有害的》(GOTO considered harmful" considered harmful),引发许多的反对,戴克斯特拉本人也批评鲁宾及其追随者的论点。

影响

在二十世纪末时绝大多数的计算机科学学者均已同意使用结构化程序设计的好处,原来缺乏程序结构的高级编程语言(如FORTRAN、COBOL及BASIC)也都已加入此特性。

例外情形

异常处理

子程序很少会有一个以上的进入点,相对的,有时子程序会有一个以上的结束点,表示剩下的程序不需运行,或因为一些原因,造成无法运行后续的程序。

以下是是一个由文件中读取数据并处理的程序示例:

open file; while (reading not finished) { read some data; if (error) { stop the subprogram and inform rest of the program about the error; } } process read data; finish the subprogram;

其中“stop and inform”的步骤可以利用多种方式达成,包括产生一个异常(exception)、利用return指令回到上一层的程序、使用配合标记的break指令,或是使用goto。当子程序有二个结束点时,就违背了戴克斯特拉的结构化编程原则。但此情形下若强制要撰写只有一个结束点的子程序又相当麻烦,而且若有几个不同的错误处理,错误产生后有不同的清除方式,单一结束点的程序会相当难以阅读及理解,甚至比未结构化使用goto的程序相当。

许多编程语言就提供了在结构化编程中产生多个结束点的方式。C语言允许使用continue、break及return指令来产生结构的多个结束点,C++还可以用throw产生异常,在结构外再用catch进行异常的处理,有些语言则有配合标记的break指令(类似一般的break指令,但可以跳出不只一层的结构)。

状态机

有些程序(例如语法分析器或是处理通信协议的程序)有许多的状态(英语:state (computer science)),因此程序进行的过程会在各状态中切换,此架构不容易简化成基本的控制结构。可以将此架构各状态下的程序分别独立为子程序,再用一个变量表示目前的状态,(可参考trampoline(英语:trampoline (computers))),另一种作法是用goto的方式切换到新状态对应的程序。

相关条目

控制流程

短路求值

面向对象程序设计

Nassi-Shneiderman图

编程范型

异常处理

结构图(英语:Structure chart)

switch指令(英语:Switch statement),可视为许多goto的组合

非结构化程序设计


免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

——— 没有了 ———
编辑:阿族小谱
发表评论
写好了,提交
{{item.label}}
{{commentTotal}}条评论
{{item.userName}}
发布时间:{{item.time}}
{{item.content}}
回复
举报
点击加载更多
打赏作者
“感谢您的打赏,我会更努力的创作”
— 请选择您要打赏的金额 —
{{item.label}}
{{item.label}}
打赏成功!
“感谢您的打赏,我会更努力的创作”
返回

更多文章

更多精彩文章
打赏
私信

推荐阅读

· 极限编程
历史极限编程的创始者是肯特·贝克、沃德·坎宁安和罗恩·杰弗里斯(英语:RonJeffries),他们在为克莱斯勒综合报酬系统(英语:ChryslerComprehensiveCompensationSystem)的薪水册项目工作时提出了极限编程方法。肯特·贝克在1996年3月成为克莱斯勒系统的项目负责人,开始对项目的开发方法学进行改善。他写了一本关于这个改善后的方法学的书,并且于1999年10月将之发行,这就是《极限编程解析》(2005第二版出版)。克莱斯勒在2000年2月取消了实质上并未成功的克莱斯勒系统,但是这个方法学却一直流行在软件工程领域中。至今2006年,很多软件开发项目都一直以极限编程做为他们的指导方法学。该书阐述了如下的极限编程的哲学思想:一种社会性的变化机制一种开发模式一种改进的方法一种协调生产率和人性的尝试一种软件开发方法把极限编程一般化并用于其它类型的专案称为极限专案管...
· 结构化分析
目的结构化分析在1980年代起开始广为使用。结构化分析包括将系统概念转换为用数据及控制的来表示,也就是转换为数据流程图。数据流程图中的程序以泡泡来表示,因此也称为“泡泡图”。不过完整的数据流程图中可能有许多的“泡泡”,使得很难去追踪数据流动的情形。此时可以先定义外界需要系统回应的事件,每一个事件指定一个泡泡,当系统定义完成后,再将事件的泡泡和回应的程序的泡泡相连接。也可以将程序对应泡泡加以分组,组合成较高级的程序。数据字典用来描述数据和指令的流动,而用程序规格来描述交易或数据转换的相关信息。许多著名的分析方式都和结构化分析(SA)及结构化设计(SD)有关,包括结构图、数据流程图及数据模型图等。许多程序设计方法学也结合了结构化分析及结构化设计,包括结构化系统分析及设计方法(SSADM)及结构化分析及设计技术(英语:StructuredAnalysisandDesignTechnique)(S...
· 编程范型
例子结构化编程对比非结构化编程命令式编程对比宣告式编程消息传递编程对比命令式编程程序编程对比函数式编程Value-levelprogramming对比Function-levelprogramming流程驱动编程对比事件驱动编程纯量编程对比阵列编程基于类编程对比基于原型编程(在面向对象编程的上下文中)Rule-basedprogramming对比Constraintprogramming(在逻辑编程的上下文中)基于组件编程(如OLE)面向方面编程(如AspectJ)符号式编程(如Mathematica)面向表格编程(如MicrosoftFoxPro)管道编程(如Unix命令中的管道)Post-objectprogramming面向主题编程自省编程或称反射编程参见ArsbasedprogrammingMemetics
· 编程语言
概论编程语言原本是被设计成专门使用在计算机上的,但它们也可以用来定义算法或者数据结构。正是因为如此,程序员才会试图使程序代码更容易阅读。编程语言往往使程序员能够比使用机器语言更准确地表达他们所想表达的目的。对那些从事计算机科学的人来说,懂得程序设计语言是十分重要的,因为在当今所有的计算都需要程序设计语言才能完成。目前发明了许多的编程语言,编程语言本身可能修改以匹配新需求,或是和其他的编程语言结合使用,尽管人们多次试图创造可以匹配所有需求的通用编程语言,但以“匹配所有需求”的标准来看,这些尝试都失败了。之所以有那么多种不同的编程语言存在的原因是,编写程序的初衷其实也各不相同;新手与老手之间技术的差距非常大,而且有许多语言对新手来说太难学;还有,不同程序之间的运行成本(runtimecost)各不相同。有许多用于特殊用途的语言,只在特殊情况下使用。例如,PHP专门用来显示网页;Perl更适合文...
· 逻辑编程
历史早在二十世纪七十年代,罗伯特·科瓦尔斯基(英语:RobertKowalski)等人提出了逻辑可以作为程序设计语言的基本思想,把逻辑和程序这两个截然不同的概念协调统一为一个概念,于是诞生了逻辑程序设计。这也是早期自动定理证明和人工智能发展的自然结果。随后,逻辑程序设计得到了迅速发展,特别是基于一阶谓词的逻辑程序设计语言,将逻辑推理对应于计算,具有丰富的表达能力、非确定性等特点,在定理机器证明、关系数据库系统、程序验证、模块化程序设计和非单调推理等都有了广泛的应用。

关于我们

关注族谱网 微信公众号,每日及时查看相关推荐,订阅互动等。

APP下载

下载族谱APP 微信公众号,每日及时查看
扫一扫添加客服微信