结构化编程
概述
结构化编程是一种编程范式,主张程序应当仅使用顺序执行、条件选择和循环三种基本控制结构来组织,消除 goto 语句带来的控制流混乱。由 Edsger Dijkstra 在1968年开创。
关键内容
三种基本控制结构
- 顺序执行(Sequencing):语句按照书写顺序依次执行
- 条件选择(Selection):根据条件执行不同的分支(if-then-else)
- 循环(Iteration):在条件满足时重复执行一段代码(while-do)
加上过程调用作为组织手段,这四种结构共享一个关键特性:单一入口、单一出口(single-entry, single-exit)。
理论基础
Bohm-Jacopini 定理(1966年)从数学上证明了:任何使用 goto 语句的程序,都可以用仅包含顺序、选择和循环三种结构的等价程序来替换。这意味着 goto 在表达能力上是冗余的。
Dijkstra 的核心论证
Dijkstra 用"坐标系"类比论证了 goto 的危害: - 顺序执行:只需一个数字(文本索引)描述执行位置 - 过程调用:需要一个栈 - 循环:文本索引 + 循环计数器 - goto:没有任何规则的坐标系可以简洁描述
历史影响
- 1972年 Dijkstra、Hoare 和 Dahl 合著《Structured Programming》
- 直接影响了 Pascal、Ada、Java 等语言的设计
- 现代语言(Python、Ruby、Swift、Kotlin、Rust)要么完全没有 goto,要么严格限制
- Java 将 goto 保留为关键字但禁止使用
当代延续
- 代码可读性运动(Clean Code、Refactoring)
- Code Review 文化
- 类型系统的进化(TypeScript、Rust)
- 核心诉求"程序应当可以被人理解"至今仍在践行
来源
- raw/books/计算机科学/06-dijkstra-goto-considered-harmful.md
相关
- Edsger Dijkstra — 开创者
- Go To Statement Considered Harmful 论文 — 宣言式文献
- Bohm-Jacopini 定理 — 理论基础
- 意大利面条式代码 — 被取代的编程风格
- 函数式编程 — 进一步延伸
- FORTRAN — 被取代的 goto 密集型语言