1987年6月初,Richard Stallman宣布推出GNU C编译器1.0版,那是截至那一天为止,我生命中最激动人心和最紧张不安的日子。经过1985年初次阅读和愉快编写Emacs代码之后,经过1986年的阅读和愉快编写GDB代码之后,1987年2月我怀着迫切的心情参加了由Stallman于德克萨斯州奥斯汀的MCC举办的为期一周的系列讲座。白天,当我开始理解Stallman的技术设计的深度、理解他的实施方法的魅力以及为我保护两个方面而不是通过GPL由我提供保护的方法时,我对Stallman以及GNU计划越来越欣赏。夜晚,当Stallman趁讲座间隙尤其是当一天结束时忙里偷闲地编写尚未准备好披露的计划时,我的好奇心也越来越强。
到二月份那一周的周末,秘密展现在我眼前:他在编写一种C编译程序,当时正处于最后阶段,他在完善优化程序。那年我22岁,仍然怀着有一天我可能编写出“美国历史上伟大的编译程序”的梦想。对于有机会亲眼看到像Stallman这样大师做这样的事情,我感到兴奋不已,并且害怕如果Stallman创造出第一种这样的伟大程序,我可能永远不会再创造出值得认可的程序。当Stallman到20年前的今天(大概)宣布推出1.0版时,我做出一个决定:与他合作,我可以和他一争高下,或者也可以编织一个新的梦想。我下载了GCC 1.0版,开始长达十年之久的协作(那时,由于RSI,我不再将编程作为我的主要工作)。
GCC 1.0版是我人生的一个分水岭。第一天我只是专心学习它如何运作——句法分析程序、词法分析程序、中间码编制程序、优化程序以及与机器有关的汇编输出程序。我打印了所有文件(用了非常大量的纸),然后把它们堆放在我的超大的餐桌上,从我所在的中间位置能够看到其他任何一个表面。我拿出在学习集成电路设计的工艺与技术时使用的彩色铅笔(红色用于polycilicon、绿色用于n扩散、蓝色用于金属、黄色用于n井、黑色用于via和contact),并赋予这些颜色新的意义,以便跟踪数据、代码以及与编译程序有关的其他关系。经过五昼夜的学习,我取得了极大的成功,不再需要这些文件——突然之间数据结构和基本组织变得再清晰不过了。我把铅笔丢到一边,开始极度渴望编写GCC。
我决定进行下一步——编写到微处理器的全新端口National Semiconductor 32032,它一直都让我很着迷。我在宾夕法尼亚大学摩尔工程学院时就有了该手册,所以我开始用适合National芯片的模板替换用于VAX和Motorola 69020处理器的模板。我很快就遇到了问题,但都是一些小问题,我轻而易举就解决了。我在几天内就使GCC生成用于National芯片的代码,并在几天之后生成正确代码。
当我在做这些工作的时候,一般汇编程序企业对于一项在一年到一年半时间内提供一种编译程序的服务要收取数百万美元,有时甚至要用更长的时间。在我从免费软件基金会(Free Software Foundation)下载汇编程序之后两周的时间里,我生成了代码,这比National汇编程序提供的代码速度快20%。如果把我当时每个月3000美元的薪酬与这些公司收取的费用相比,我花费1/30的时间和1/1000的成本提供了胜过20%的产品(用摩尔定律的时间表示为6至9个月)。我为自己的23岁生日献上了一份伟大的礼物!
在公布这一新端口的一小段时间之后,我自己当然也包括其他人清楚地意识到,还需要进行许多优化。又经过两周的努力,我生成了比National汇编程序快40%的代码。由于32032被宣传为“1 MIPS”芯片(意思是每秒钟执行100万条指令),因此40%是一个重要的数据,但是它的基准测试结果仅为0.75 MIPS,事情朝着不适合商业化的方向发展。对于我的32032端口,超过1 MIPS的芯片基准测试向我证明,硬件人员已经提供,而软件人员没有提供。我还意识到,即使在1987年,也已经有足够的人可以非常成功地进行协作处理。
那年夏天,我继续编写许多其他端口,通过编写GNU表现了不同寻常的连贯一致性,我平时能够比更大公司雇用的整个汇编程序编写人员队伍更快地生成更好的产品。到那一年的年底,我继续向新的目标努力,那就是编写GNU C++ 汇编程序。对于我而言,GNU C++是“伟大的美国C++ 编译器”——对我的最初目标进行完善的新版本。通过在我开始编写之前他人与我分享,以及通过在我开始编写之后他人为我提供有帮助的建议和错误修复方法,我获益匪浅,而我也自由地与大家分享我所获得的知识。我编写并举办了第一期关于GNU汇编程序内部组织的全面培训,把我的100多张LaTeX幻灯片给Stallman,以便他也能够通过向别人传授如何编写程序而获得报酬。两年后,我正式将GNU软件的商业优势商品化,而其余的,正如他们所说的,成为了历史。
我不知道接下来的20年里将会发生什么……
(责任编辑:A6)