跳转至内容

计算机编程/结构化编程

来自维基教科书,开放世界中的开放书籍


结构化编程 被认为是非结构化编程的解药,后者在结构化编程发明之前已经存在了几十年。

最初,存在非结构化编程

[编辑 | 编辑源代码]

非结构化程序是过程式程序——语句按编写顺序执行。但这种类型的编程使用 goto 语句。goto 语句允许将控制权传递到程序中的任何其他位置。当执行 goto 语句时,序列将从 goto 的目标继续。因此,要理解程序的工作原理,必须假装执行它。这意味着通常很难理解这种程序的逻辑。一些程序编译器会交叉索引 goto 连接到的位置,使快速浏览源代码成为可能。但是,在一些编程语言中,常见做法是将变量与 goto 的目标关联起来,这使得自动索引变得不切实际。在一些结构化编程语言中也存在类似的问题,例如外语视图的实现方式,允许许多人以他们的母语查看相同的数据。

这与使用某种形式的抽象来理解程序的工作原理形成对比,就像在结构化编程中一样。

出于这个原因,Dijkstra 建议禁止使用 goto 语句。

结构化编程

[编辑 | 编辑源代码]

从一种角度来看,结构化编程是避免使用可能危险的 goto 语句的编程。这可以防止潜在的混乱的控制转移。许多结构化编程语言支持 goto 语句,它可以以结构化的方式使用。例如,退出到例程的末尾,或返回到循环的开头。

从另一个角度来看,结构化编程仅限于使用仅具有一个入口点和一个出口点的控制结构。这些结构中最重要的结构是顺序、选择(if 和 if..else)和重复(while)。

另一种观点是,结构化程序是以便于使用抽象理解的方式编写的程序。抽象意味着能够理解某些代码的总体目的,而无需理解细节。抽象的主要机制是过程(方法)。但上面提到的单入口单出口结构也有助于使用抽象。

结构化编程的实现得益于高级语言和相关程序包,这些程序包可以利用软件图表技术进行流程图绘制,非程序员也能理解。

发明者

[编辑 | 编辑源代码]

一些计算机科学家负责发现结构化编程的概念,并将这一概念传达给其他程序员的世界。结构化编程最初体现在 ALGOL(算法语言)语言中(它成为第一个用于 Burroughs B5000 MCP(操作系统)系统编程的高级语言),(由 Bob Barton 设计,后来成为犹他大学教授,他在那里影响了学生 Alan Kay,Alan Kay 发明了 GUI 窗口,并是 Smalltalk 的开发人员之一)。反过来,ALGOL 成为 Simula 的基础,Simula 是第一种面向对象的语言。

ALGOL 基于一种语言设计形式主义,称为 BNF(Backus-Naur 形式),以其创始人 John Backus 和 Peter Naur 的名字命名。

该技术具有里程碑意义的书籍是“结构化编程”(学术出版社 1972 年),该书包含三个部分:“关于结构化编程的笔记”由 Edsger W. Dijkstra 撰写,“关于数据结构的笔记”由 C.A.R. Hoare 撰写,“层次程序结构”由 Ole-Johan Dahl 和 C.A.R Hoare 撰写。最后一部分介绍了 Simula 及其面向对象和并发功能。

Edsgar Djikstra 还撰写了“程序设计纪律”(Prentice Hall,1976 年)一书。

结构化编程领域的另一位杰出人物是 Donald Knuth,他撰写了多卷本的“计算机程序设计艺术”。

后来,Ed Yourdon 和 Larry Constantine 撰写了一本名为“结构化设计”的书籍,许多人认为它是结构化编程,但它不是。这是一种图形技术,在实践中非常繁琐,尽管它在很大程度上被抛弃,但在其他非正式方法中仍然有继任者,例如 UML。结构化设计和结构化编程中概述的技术非常不同,不应该混淆,因为它们都使用“结构化”一词。

进一步阅读

华夏公益教科书