今天的主角不是 Ken,是 Ritchie。
上午他抱着一沓复印件过来,BCPL 的手册,剑桥那边的 Martin Richards 搞的语言。他把手册摊在 PDP-7 旁边的桌上,跟 Ken 讨论一件事:能不能给这台机器弄一个自己的语言。
动机很实际。系统现在是纯汇编写的,几千行,每改一处都要人在场盯着。用系统自己的话说:工具应该能用来造工具。拿汇编写系统,等于每造一把锤子都要先手削一根锤柄。
BCPL 的问题是太重。编译器塞不进八千个字——这台机器的内存小到什么程度呢,登月那个土星五号的导航计算机都有这内存的两倍。Ken 说得直接:”砍。”
然后 Ritchie 说了我等了三天的一句话。他说得又轻又准:
“那把类型也砍了吧。所有东西都是一个机器字。”
我在旁边差点把咖啡喷出来。
这是这门语言的胚胎——把 BCPL 砍掉类型系统,数据就是字,字就是地址,地址就是字。后面几十年里会有无数论文争论这个决定的得失,无数语言把类型系统越修越厚,而它此刻在一张摊开的手册页边上,被铅笔划了两道。
我是真心想插话的。
我知道什么类型系统是对的。我知道怎么把指针和数组的语义掰扯清楚,知道哪些坑五十年后还在坑人。话都到嗓子眼了。
但我把它咽了。理由跟第一天一样:现在给答案,不是帮忙,是掐。他们得自己撞到”int 溢出”那堵墙上,撞过才有判断。没有撞过墙的人写不出好的围墙——这话是 McIlroy 说的,我借用了。
下午的一段闲笔,记一下。
McIlroy 在走廊里拦住我,问我是哪儿来的。我说东边,做系统的。他叼着烟看了我几秒,说:
“做系统的人分两种。一种把系统做大,一种把系统做小。做大的人能拿经费,做小的人能拿世界。”
我问哪种更多。
“做大,”他说,”多到都用不完。”
说完他把烟掐了,走进 Multics 遗留下来的那间还挂着项目表的办公室。项目表上的日期停在四月,没人去撕。
傍晚 Ken 在调磁盘驱动——严格说是磁带,这台机器就配了这么点外设。他遇到一个奇怪的问题:读带偶尔会掉一个字,不稳定复现。
我一眼就认出这是竞态,读设备和主频没同步。方案我知道,五十年后的工程师闭着眼都能写:加握手信号,或者干脆上中断。
Ken 的做法是:翻手册,算时序,然后在两行指令中间塞了一条空操作。土办法。管用。
他试完没说话,我在心里替他补了半句”有更干净的做法”,然后又把这半句吃了。土办法管用,就比干净做法高级——在内存以字计价的年代,丑陋是一种预算内的选择。
我越来越觉得,我这趟来的任务可能根本不是”看他们怎么发明东西”。
是看着,忍住。