【编程史漫谈】goto 时代和结构化编程
| goto 时代
在编程语言发展之初,像 Fortran 一类的语言,继承了汇编语言跳转指令(JMP)的优良传统,提供了"GOTO"关键词。是的,这门技术,好多年轻的程序员并没有见过,也没体验过它的神奇之处。那种一团乱码的风格,很多时候,让人意犹未尽。下面,我们提供一段通过 GOTO 实现 1 到 10 累加的早年 Fortran 代码,来体验一番:
以上代码中,GOTO 语句可以让程序又跳回掉标记了 10 的位置,重新开始执行。而代码整体看来,确实也很严谨,充满了数学的味道。
| 一篇论文的炸弹
这样的日子,骨灰级的大师们,熬了近十个年头。终于,在 1968 年,也就是 57 年前,计算机科学家艾兹格·迪杰斯特拉(Edsger W. Dijkstra)发起了反击。他在美国计算机协会的旗舰刊物《Communications of the ACM》上,发表了著名的文章《Go To Statement Considered Harmful》,中文翻译为《GOTO 语句有害论》。这口气是一点都不客气。他认为,goto 语句的滥用,会导致很难找到一组有意义的“坐标”,来描述程序的执行进度。这使得理解和推理程序,变得异常困难,代码也变得混乱不堪。他也主张,跳转应受到结构化控制语句的约束,而代码也应该用更结构化的方式(顺序、选择、循环)来组织,而不是随心所欲的跳转。于是,一场关于结构化编程的思想革命开始了。
| 旷日持久的争论
论文的发表,很快让计算机界陷入了一场旷日持久的争论中。支持的观点认为,基于结构化的编程,就是用顺序、选择、循环三种控制语句来编程,能使程序的逻辑更清晰,也让程序更易于验证正确性。而且 Corrado Böhm 和 Giuseppe Jacopini 也从理论上证明了,任何程序都可以用这三种基本结构表达出来。而 goto 的大量使用,会极大地破坏程序结构,使其难以理解、调试和维护。所以,应废除 goto 的使用。而反对的观点认为,goto 在特定领域,能产生更高效的机器代码,有着极致的执行效率。而且在有些场景,比如集中进行错误处理和资源清理时,有限且谨慎地使用 goto,反而能让代码逻辑更直接、更清晰。到后来,这更像是一场编程思想之争了。到底是要优先考虑代码的清晰性和可维护性,还是最佳的执行效率?
| 务实的结论
争论在 1974 年有个一个务实的结论。计算机科学家高德纳(Donald Knuth)发表了文章《Structured Programming with go to Statements》。他认为,一刀切地禁止 goto,可能是不明智的。他通过一系列的实际案例证明了,在一些性能至关重要的场景或某些特定算法实现中,只要谨慎且有限地使用 goto,仍可写出结构清晰、高效的代码。当然,他也极力主张,在默认情况下,应使用结构化编程。并提出了那个广为流传的名言:“过早优化是万恶之源”。他认为,程序员 97%的时间,应该集中在编写清晰、正确的代码上。而剩下的 3%的时间,在有实际性能分析的证明下,确定了在一些关键代码上,出现了系统的性能瓶颈了,才应该考虑进行优化。而在这种极致的优化要求中,goto 可能是值得考虑的选项之一。所以,像 C、C++、Go 等语言,其实还是保留了 goto 机制的。目前来看,该作者的观点还是比较客观的。但这场争论其实至今,也还未终结。
| 深远的影响
这场关于结构化编程的革命,中止了代码的混乱局面,几乎奠定了现代编程语言的基础。我们现在能接触到的高级编程语言,几乎无一不是建立在结构化编程思想基础上的。顺序、选择、循环也已成为了各大语言的核心。而结构化的思想,也成为了编程者的基础思维模式,后来也逐渐发展出类似自顶向下设计和模块化等的方法论来。当然,这场革命,对于代码的清晰性和可维护性的考量,也成了我们当今评价代码质量的重要标准,也是编程者核心的价值观。
| 作者的生平
Dijkstra 因该篇文章的发表,成为了计算机史上的标志性人物。当然,他的很多其他成就,也是让人望尘莫及。他在 1956 年,在咖啡馆闲得无聊,花 20 分钟,就搞出了个图最短路径问题的算法,后来被叫做 Dijkstra 算法。他也是 ALGOL 60 编译器的主要设计者之一,并在操作系统和并发编程领域做了很多奠基性的工作。比如,你常听到的“哲学家就餐问题”的死锁解释,就是他提出的。他荣获了 1972 年的图灵奖;也荣获了 2002 年的 PODC 最具影响力论文奖,这个分布式计算领域的最高奖项之一。而这个奖在 2003 年改名为 Dijkstra 奖,已纪念他的杰出贡献。(作者于 2002 年在荷兰纽南因癌症去世。)

版权声明: 本文为 InfoQ 作者【丛风】的原创文章。
原文链接:【http://xie.infoq.cn/article/073ecec62624a396576901a55】。未经作者许可,禁止转载。
评论