二十年前的今天…
那是 1987 年 6 月初,当时理查德·斯托曼宣布发布 GNU C 编译器 1.0 版本。正如我在开源一书中写道,那是我一生中最激动人心也是最可怕的一天(到那时为止)。在 1985 年首次阅读并轻微修改了 Emacs 代码,在 1986 年阅读并轻微修改了 GDB 代码之后,我渴望参加了斯托曼于 1987 年 2 月在德克萨斯州奥斯汀的 MCC 举办的为期一周的 Emacs 系列讲座。白天,随着我开始理解斯托曼的技术设计的深度、他的实现方法的美妙之处以及 GPL 如何为我而不是从我这里保护这两者,我对斯托曼和 GNU 项目的敬佩之情与日俱增。晚上,我的好奇心也与日俱增,因为斯托曼会在讲座间隙,尤其是在一天结束时,抽出时间来研究一个他还不愿透露的项目。
到二月底的那个星期结束时,秘密向我揭示了:他正在开发一个 C 编译器,并且正处于优化器完善的最后阶段。那时我 22 岁,仍然怀揣着有朝一日写出“伟大的美国编译器”的梦想。我很高兴有机会看到像斯托曼这样的高手会如何编写这样的东西,我也很害怕如果他先在那里,我将永远无法创造出值得认可的东西。当斯托曼在 20 年前的今天(或多或少)宣布 1.0 版本时,我需要做出一个决定:我可以加入他,我可以与他竞争,或者我可以选择一个新的梦想。我下载了 GCC 1.0 版本,并开始了一项持续了十年的合作(当时,由于 RSI,我放弃了编程作为一项主流活动。)
GCC 1.0 版本是我人生中的一个分水岭事件。第一天,我一心只想学习它的工作原理——解析器、词法分析器、中间代码生成器、优化器和机器相关的汇编输出例程。我打印了所有文件(消耗了三令纸),并将它们成堆地铺在我的超大餐桌以及我可以从我的中心位置看到的任何其他水平面上。我拿出了我在学习集成电路设计艺术和科学时用过的彩色铅笔(红色代表多晶硅,绿色代表 n 型扩散,蓝色代表金属,黄色代表 n 阱,黑色代表过孔和触点),并赋予这些颜色新的含义,以跟踪与编译器相关的数据、代码和其他关系。经过五天五夜,有些东西“点击”了,我不再需要打印稿了——数据结构和基本组织突然变得“显而易见”。我收起铅笔,开始渴望修改 GCC,而且不是轻微地修改。
我决定采取下一步——为一直让我着迷的微处理器编写一个全新的编译器端口:National Semiconductor 32032。我在宾夕法尼亚大学摩尔工程学院的日子里已经有了手册,所以我开始了用适用于 National 芯片的模板替换用于 VAX 和 Motorola 68020 处理器的模板的过程。我立即遇到了问题——但这些都是小问题,很容易解决。几天之内,我就让 GCC 为 National 芯片生成了代码,又过了几天,我就让它生成了正确的代码。
当我完成这项工作时,典型的编译器公司收取数百万美元的服务费,在 12-18 个月甚至更长时间内交付编译器。在我从自由软件基金会下载编译器的整整两周后,我让它生成的代码比 National 编译器的代码快 20%。如果我将当时我每月 3000 美元的工资与这些公司收取的费用进行比较,我交付的产品在 1/30 的时间内以 1/1000 的成本提高了 20%(摩尔定律时间为 6-9 个月)。这是我送给自己 23 岁生日的绝佳礼物!
在发布这个新端口的公告后的几个小时内,我和其他人都很明显,我还有许多优化尚未实现。又经过两周的工作,我生成的代码比 National 编译器快了 40%。40% 是一个重要的数字,因为 32032 被宣传为“1 MIPS”芯片(意味着每秒能够执行一百万条指令),但它的基准测试仅为 0.75 MIPS,并且正在走向商业上的无关紧要。通过我的 32032 端口,该芯片的基准测试超过了 1 MIPS,这向我证明了硬件人员已经交付了,但软件人员没有。我也意识到,即使在 1987 年,已经有足够多的人让协作过程非常成功。
那个夏天,我继续编写了许多其他端口,以惊人的一致性证明,通过修改 GNU,我可以比大公司雇佣的整个编译器编写团队更快地生成更好的产品。在那年年底,我继续实现了一个新目标,那就是编写 GNU C++ 编译器。对我来说,GNU C++ 是“伟大的美国 C++ 编译器”,是我最初目标的新的改进版本。并且因为我受益匪浅,既受益于其他人在我开始修改之前与我分享的内容,也受益于我在开始修改之后收到的有益建议和错误修复,我也自由地分享了我获得的知识。我编写并交付了关于 GNU 编译器内部原理的第一个综合培训,将我的 100 多张 LaTeX 幻灯片交给了斯托曼,以便他也可以通过教别人如何修改来赚钱。两年后,我正式将 GNU 软件的商业优势商业化,剩下的,正如他们所说,就是历史了。
我想知道未来 20 年会带来什么…