结构化编程

✍ dations ◷ 2025-07-10 07:20:29 #结构化编程

结构化编程(英语:Structured programming),一种编程典范。它采用子程序、块结构、for循环以及while循环等结构,来取代传统的 goto。希望借此来改善计算机程序的明晰性、质量以及开发时间,并且避免写出面条式代码。

结构化编程在1960年代开始发展,科拉多·伯姆(英语:Corrado Böhm)及朱塞佩·贾可皮尼(Giuseppe Jacopini)于1966年5月在《Communications of the ACM》期刊发表论文,说明任何一个有goto指令的程序,可以改为完全不使用goto指令的程序,后来艾兹赫尔·戴克斯特拉在1968年也提出著名的论文《GOTO陈述有害论》(Go To Statement Considered Harmful),因此结构化编程开始盛行,此概念理论上可以由结构化程序理论所证明,而在实务上,当时也有像ALGOL一样,有丰富控制结构的编程语言来实现结构化编程。

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

若一个编程语言的语法允许用成对的关键字包围一段程序,形成一个结构,这种编程语言称为有“块结构”,这类的结构包括用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语言允许使用continuebreakreturn指令来产生结构的多个结束点,C++还可以用throw产生异常,在结构外再用catch进行异常的处理,有些语言则有配合标记的break指令(类似一般的break指令,但可以跳出不只一层的结构)。

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

相关

  • 连多硫酸连多硫酸是一种强酸,通式为H2SxO6,x可以从3一直到80,通常范围在1~6。阴离子通式为O3SSySO32-,y为0~3。连多硫酸常在加热时分解为硫酸、二氧化硫或硫
  • iFokIFokI是一种存在于细菌Flavobacterium okeanokoites的type IIS限制酶,含有位于N端的DNA结合区块(N-terminal DNA-binding domain),以及一个位于C端的非专一性DNA切割区块。当此酵
  • 自杀而死的跨性别青年列表这个列表收录了已经自杀身亡的著名女同性恋,男同性恋,双性恋和跨性别人士。
  • 奇翅目奇翅目(学名:Alienoptera)是一类已灭绝的昆虫,为网翅总目下的一个目级分类元,与蟑螂和螳螂密切相关。 该目的大多数已知成员来自缅甸的森诺曼期琥珀,然而,该目还包括来自Albian Cra
  • 鸠山秀夫鸠山秀夫(はとやま ひでお;1884年2月4日-1946年1月29日)东京出身,曾任众议院议员,并是日本的法学家。专长为民法:从明治末期到大正有“民法就是鸠山,鸠山即是民法”的说法。父亲鸠山
  • 鸽子山遗址鸽子山遗址位于中华人民共和国宁夏回族自治区青铜峡市境内贺兰山东麓台地中段的鸽子山一带,是一处处于旧石器时期和新石器时期的过渡时期的古文化遗址。该遗址最早被发现于19
  • 博尔讷群峰坐标:45°59′56″N 6°27′36″E / 45.99889°N 6.46000°E / 45.99889; 6.46000博尔讷群峰(法语:Massif des Bornes),是法国的山群,位于该国东北部奥文尼-隆-阿尔卑斯大区,由上萨
  • 廖荣吉廖荣吉(1940年-),绰号“刈包吉”,是台湾万华一位盛名的刈包小贩,亦是慈善家。廖荣吉因为多年来在过年期间在万华免费办桌,举办“刈包吉盛宴”宴请街友、穷人、失业劳工等弱势团体,还提供爱心面无限量供应。这使他的义行渐渐受到媒体和人们关注和重视。廖荣吉幼年家庭贫困,两岁时父亲就去世,使他在农村从小就经常吃豆腐渣、番薯签充腹,因此他很能体会穷人孤苦无依的心情。成大以后的廖荣吉,他在台北市万华区开了一家印刷厂,生意相当好还赚了不少钱,但随着时代变迁技术进步,传统印刷厂获利逐步下降,他只好关闭印刷厂,改在万华街口
  • 汉堡王餐点汉堡王(英语:Burger King,简称BK)是全球大型连锁速食企业。自1953年它的前身“速食汉堡王”餐厅开幕以来,餐点便是以汉堡、薯条、软性饮料、奶昔和甜点为主。餐厅在被佛罗里达州迈阿密的加盟店收购后,1954年改名为“汉堡王”,并开始丰富它的菜单,例如1957年创立皇堡三明治,也逐渐加入鸡肉、鱼肉和蔬食等非牛肉单品,如沙拉和无肉汉堡。此外,它也供应早餐餐点和冰吸(Icee)、果汁与瓶装水等饮品选择。不同于其他饮食业者着重于扩展全球版图,汉堡王结合当地特色,推出符合地方口味和文化或宗教信仰的产品。为
  • 英华分韵撮要英华分韵撮要(A Tonic Dictionary of the Chinese Language in the Canton Dialect)是一部英文解释的粤语字典,为美国人卫三畏所写,于1856年在广州出版。《英华分韵撮要》以《江湖尺牍分韵撮要合集》为底本,按照英式字典的体例和顺序编排,除了粤语读音之外,在每个字头上还标注了官话读音。