恶之根的根:一句编程名言的历史溯源
延续去年的脚步大型面向对象我再次决定为今年的优质软件大会.上次,我的起点是伊万·萨瑟兰的速写本.这次,是那句话:“过早优化是万恶之源”。
当人们提到这个词时,通常想辩论它的正确用法,用它来论证观点,或者猜测是哪位传奇计算机科学人物创造了它。在这次新演讲中,万恶之源我什么都不做。
相反,我尽量尽可能完整地描绘导致该短语诞生的具体情况。我越是研究相关历史人物,就越相信如果不了解他们每个人的故事,你无法真正理解原义的所有细微差别:你要么解读过多,要么解读得太少,错过正确运用它所需的细微理解。
所以,如果你曾经好奇“过早优化是万恶之源”是什么意思。真的意思——或者好奇为什么一位著名程序员会说出这句话——我希望你能和我一起,再次深入计算机科学历史,去寻找万恶之源!
影片制作人员
演讲中使用的几乎所有照片都来自布莱恩·兰德尔精彩的北约会议历史页面.这些作品既归功于兰德尔,也归功于他的同时代人罗伯特·麦克卢尔。
兰德尔实际上在正式讲座中短暂出现——他是迪克斯特拉在引发事件中的主要对话者。GOTO 被认为有害.
不幸的是,在我写这些致谢时,托管Brian页面的服务器似乎遇到了SSL证书问题。这是一个很棒的页面,配有罕见的历史照片,希望问题能尽快解决!
如果还不好,你可以尝试访问页面的备份版本在互联网档案馆.
剩余照片:唐纳德·克努斯书籍的照片由埃克托·加西亚-莫利纳,以及 可获得的可直接从唐纳德·克努斯的网站下载.唐纳德·克努斯本人的照片,以及他长期合作伙伴罗伯特·弗洛伊德的照片,出现在互联网和书籍中,但从未注明署名。
如果有人知道这两张照片的原始来源,请告诉我,以便我能在这里正确注明摄影师的署名!
幻灯片参考
正如你所想,为了准备这样的演讲,我阅读了大量历史资料。我的研究目录根源其中包含了200多份文件!在那成千上万页的庞大篇幅中,只有少数节选被收录到实际的幻灯片上。
每张引用幻灯片都附有页脚说明其来源。如果您想更详细地阅读幻灯片后面的文档,我附上了超链接列表,帮助您查找。如果材料看起来是合法发布(即非盗版),我会尽可能链接公开版本。
按照每位演讲者的出场顺序,摘录如下:
- ACM计算调查,第6卷,第4期
- 带有 go to 语句的结构化编程
- TeX的错误 (仅限付费访问)
- EWD196 - “THE”多程序系统的结构
- 埃兹格·怀贝·迪克斯特拉——他的生平、工作与遗产 (仅限付费访问)
- 与埃兹格·W·迪克斯特拉的访谈
- EWD215 - 反对“通用”陈述的论据
- 前往被认为有害的声明
- EWD1308 - 是什么促成了《结构化编程笔记》
- EWD245 - 论实用结构
- EWD340 - 谦逊的程序员
- Datamation - 1968年10月 (原始扫描得以保存,感谢位存器)
- Datamation - 1968年12月 (原始扫描得以保存,感谢位存器)
- EWD227 - 逐步项目建设
- 《结构化规划》回顾
- 1968年北约软件工程会议报告 (在互联网档案馆,因为布莱恩·兰德尔的页面目前已关闭)
- EWD249 - 结构化规划笔记
- EWD209 - 程序正确性问题的建设性方法
- 皇帝的旧衣
- 大型节目的高效制作
- 对ALGOL开发的贡献
- 记录处理
- 安东尼·霍尔爵士的口述历史
- 结构化规划
- 唐纳德·克努斯的口述历史
- 计算机科学系研究(1969年)
- 避免使用“去去”语句的注意 (仅限付费访问)
- IBM System/360 型号 91 (仅限付费访问)
- 节目频率计数的最佳测量点 (仅限付费访问)
- FORTRAN程序的实证研究 (仅限付费访问)
- 作为编程工具的执行时间配置文件 (据我所知,截至本文撰写时尚无数字版)
- 查尔斯·安东尼·理查德·霍尔的访谈
- 计算机程序调试 (仅限付费访问——仅出现在问答环节)
你永远不知道会发现什么
我知道现在很难说服人们花时间阅读历史文献。为什么不让AI帮你做呢?
就我个人而言,我认为阅读这些文件的实际过程是体验中最有价值的部分。主要原因是,整体对材料的理解比任何具体事实更重要,而如果不花大量时间沉浸于历史记录中,是无法获得这一点的。
但另一个原因是,事先不可能知道所有你可能想要查找的事实。每次我在计算机科学历史中探险时,总会发现数十件我从未专门寻找过的有趣文物。
可能是道格·罗斯在1950年代发明(并使用)胖结构,1979年比亚恩·斯特劳斯特鲁普的“依赖注入”(稍后会详细介绍),或者最近一次,发现查尔斯·安东尼·理查德·霍尔爵士提出的看似静态单项任务形式......1965年!
社会保障局- 编译器构建的主力,至今仍被最流行的后端使用——据说是在1980年代IBM开发的。虽然我从未对这一说法(或其历史)做过研究,因为我一直在做研究。
根源,我偶然发现了以下段落霍尔未发表的IFIP提案:
首先,程序被转换为一个完全等价的程序,移除所有内部块,且赋值语句左侧没有标识符出现超过一次。满足这些条件是因为翻译例程语言中没有 go to 语句、条件语句和 for 语句。下一步是重新排列程序语句序列,使得每个变量在赋值的左侧出现前先于其首次出现在右侧。这可以通过广泛应用于 PERT 程序的拓扑排序算法实现。
Hoare 提出类似 SSA 的转换,正是出于与其最终开发(并且至今仍在使用的)相同的原因:作为多遍编译器的内部表示结构。
那么,为什么世界还要等到编译作者才真正开发出SSA呢?根据Hoare在1998年添加到提案封面上的手写说明:
由于Naur在大会上的负面评论,我从未将这本书写出来发表。他说写一个九遍编译器很容易。
这里的“Naur”是彼得·瑙尔你可能从这个词中听过他的名字”巴克斯-诺尔形式“,该词被广泛用于指代用于定义编程语言语法的符号风格。
收工
希望你喜欢万恶之源.如同大型面向对象在准备这本书的过程中,我又一次学到了大量关于计算机历史的知识。但,也像大型面向对象我带着一种无法摆脱的感觉离开,觉得自己才刚刚触及了表面。
我不确定以后是否还会再做一次这样的演讲。准备这些演讲非常有压力,因为你要精简的信息量非常庞大——远比我做过的任何类型的演讲都要多得多。
你总有更多研究可以做,还有一些令人烦恼的问题,答案可能藏在某个你尚未找到的晦涩文档里。我通常会一直制作幻灯片直到演讲那一刻,而且我从来没有机会提前好好排练。
但我怀疑自己永远不会停止在计算机科学历史中探究。有太多精彩的内容,我肯定永远不会用尽。作为一个行业,遗憾的是,我们遗忘的远多于记住的。
说到这里,既然今天是大型面向对象我还准备了一段特别的一小时会员专属视频,尽力展示阅读这两场不同寻常演讲所用历史资料的感受。
它试图浓缩超过500页的片段大型面向对象研究一小时,当然需要我对最新抖音“快话”风格的最佳模仿。对于所有面向对象粉丝,它还包括了前面提到的发现:斯特劳斯特鲁普在七十年代末提出了依赖注射。
我会在这里发布那个视频作为后续,如果你想在上线时收到通知,请查看我们的订阅选项:
下次见,祝大家编程愉快,网络见。
—— 凯西
无论谁创造了这个词,因为有些人——包括最有可能的起源者唐纳德·克努斯——都将它归于他人。