← 返回故事列表

BCPL:一台打字机、一间剑桥宿舍与一场改变世界的“减法”创业

时代:1967
阅读时间:8 分钟
浏览:4
点赞:0

1967年的秋天,剑桥大学数学实验室一间堆满打孔纸带和咖啡渍的宿舍里,29岁的Martin Richards正面临一个“疯狂”的抉择:要么继续在ALGOL 60那本厚达300页的语言规范中挣扎,要么亲手砍掉一切冗余,只用不到30页的草稿定义一门新语言。他选择了后者。这个决定,不仅催生了BCPL(Ba

# BCPL:一台打字机、一间剑桥宿舍与一场改变世界的“减法”创业 1967年的秋天,剑桥大学数学实验室一间堆满打孔纸带和咖啡渍的宿舍里,29岁的Martin Richards正面临一个“疯狂”的抉择:要么继续在ALGOL 60那本厚达300页的语言规范中挣扎,要么亲手砍掉一切冗余,只用不到30页的草稿定义一门新语言。他选择了后者。这个决定,不仅催生了BCPL(Basic Combined Programming Language),更在十年后,间接孵化出了统治全球数十亿台设备的C语言和UNIX。但鲜为人知的是,这场“创业”最初的目的,只是为了解决一个让人抓狂的工程问题——如何让一个编译器在三天内,从一台笨重的IBM 7094移植到一台陌生的机器上。 ## 技术极简主义的“商业”赌注 故事要从1966年说起。Martin Richards当时正在为剑桥大学的“自动计算机项目”开发编译器——一种将高级语言翻译成机器码的工具。那个时代,编程语言正处于“大爆炸”阶段:FORTRAN专攻数值计算,COBOL瞄准商业数据处理,而ALGOL 60则试图成为“通用语言”——结果它复杂到连它的发明者都承认“很少有人能完整实现其规范”。 Richards却在一个更“卑微”的领域工作:系统软件。他需要写操作系统、编译器和调试器,这些工具必须直接操作内存、管理硬件中断,而ALGOL 60的数组边界检查、类型系统、递归调用等“安全特性”,反而成为阻碍。更糟糕的是,每换一台计算机,编译器就必须重写——因为当时没有“可移植”的概念,编译器是绑定在特定硬件上的。 “如果我们能造一把‘瑞士军刀’——足够锋利,但只有三个功能:操作内存、跳转指令、调用过程,那会怎样?”Richards后来在回忆录中写道。这个想法在当时是异端:主流计算机科学家正忙着往语言里塞入“更高级”的特性(如并发、异常处理),而Richards却在做减法——他决定砍掉所有类型系统,只保留一个统一的数据类型:机器字(一个固定长度的二进制数)。这意味着,你可以把整数、指针、字符甚至函数地址都塞进同一个变量里。在1967年,这几乎是“疯狂”的——没有类型检查意味着程序随时可能崩溃。 但Richards看到了另一面:这种极简主义将使得编译器极易移植。他的“创业计划”是:设计一个核心语言,其编译器只依赖少量机器特性(如字长、内存寻址方式),然后写一个“可移植编译器”框架——只要为每种新机器写一个不到500行的“代码生成器”,就能完成移植。这相当于在软件领域开创了“特许经营”模式:语言本身是“品牌”,而移植工作是“加盟店”。 ## 三天移植的奇迹与剑桥的“车库”时刻 高潮发生在1967年冬天。当时,剑桥大学购买了一台新的ICT 1900系列计算机,与现有的IBM 7094架构完全不同。按照常规,为新机器编写一个完整的编译器需要6到12个月。Richards却向实验室主任下了赌注:“给我三天,我让BCPL跑起来。” 第一天,他花了16小时在宿舍里修改编译器的“代码生成器”——这是BCPL可移植架构的核心部分。他删除了所有与IBM机器相关的指令编码表,替换为ICT 1900的指令集描述。深夜,他对着打孔机反复测试,直到每一条BCPL语句都能正确映射到新机器的机器码。 第二天,他遇到了一个致命问题:ICT 1900的字长是24位,而BCPL假设字长至少为16位。某些指针操作在24位系统上会产生意外的地址对齐错误。Richards没有陷入“修复类型系统”的陷阱,而是直接在BCPL的标准库中添加了一个宏——`WORDALIGN`,让程序员手动控制内存对齐。这个“偷懒”的解决方案,后来成为C语言中`#pragma pack`的雏形。 第三天清晨,他带着一摞打孔纸带走进机房。当第一个BCPL程序——“打印‘Hello, World!’”——在ICT 1900的终端上成功输出时,整个实验室沸腾了。Richards后来回忆:“那一刻,我意识到我们创造了一个‘生物’——一个能在不同硬件上‘呼吸’的编译器。” 这个“三天移植”的案例迅速在剑桥传开,并吸引了美国贝尔实验室的注意。1969年,Ken Thompson和Dennis Ritchie在开发UNIX系统时,看到了BCPL的论文。他们最初想直接用BCPL写UNIX,但BCPL的“无类型”设计在系统编程中带来了一些痛点(比如无法区分整数和指针的算术运算)。于是,Thompson在BCPL基础上砍掉了某些特性,加入了类型系统,创造了B语言;而Ritchie又在B语言上增加了数据结构和对硬件的更精细控制,最终在1972年推出了C语言。 但BCPL的“创业”并未止步。Richards在1970年代将BCPL编译器移植到了超过20种不同的机器上,从PDP-11到IBM System/360,从军用计算机到微型计算机。他甚至为BBC Micro(英国1980年代的家用电脑)编写了BCPL编译器,让无数英国中小学生第一次体验到了系统编程的乐趣。 ## 减法的遗产:从“语言”到“方法” BCPL最深远的影响,不是它本身的流行(它从未像C语言那样被广泛使用),而是它开创的“可移植性方法论”。在BCPL之前,编译器是“一次性”的——每台机器都有一套独立的工具链。在BCPL之后,“编译器+代码生成器”的分离架构成为行业标准。今天的LLVM、GCC等现代编译器框架,都遵循着同样的原则:前端处理语言语法,后端处理机器指令生成。 另一个隐形遗产是“极简主义设计哲学”。BCPL的设计者相信,一门好的系统编程语言不应该试图保护程序员免于犯错,而应该给予他们充分的信任和自由。这种理念后来在C语言中达到巅峰(C语言甚至允许你通过指针直接修改代码段内存),并最终演变为“程序员应当对内存结构有完全控制权”的共识。尽管这种理念导致无数安全漏洞(如缓冲区溢出),但它催生了整个操作系统、数据库、嵌入式系统的生态。 Richards的“创业”故事也提供了一个反直觉的商业启示:在技术领域,有时“放弃”比“增加”更需要勇气。当所有人都在追求“更高级”时,他选择了“更底层”;当主流语言在构建复杂的类型系统时,他选择了“无类型”。这种逆向思维,恰恰是颠覆性创新的典型特征。BCPL从未成为商业产品,也没有融资、没有团队扩张,但它的“影响因子”却超过了同时代大多数商业语言。 ## 评论 BCPL的故事本质上是关于“工具性创新”的教科书案例:它不是为市场而生,而是为解决一个具体的工程痛点——编译器移植的昂贵与低效。Richards的“创业”没有商业计划书,没有用户调研,甚至没有明确的“客户”,但他抓住了软件行业一个深层次的结构性需求:硬件快速迭代与软件复用之间的鸿沟。他通过“减法”创造了“可移植性”这个新维度,从而改变了整个行业的成本结构。 这段历史对今天的创业者有三点启示:第一,真正的颠覆往往来自对现有“常识”的质疑(为什么编译器必须重写?);第二,极简主义可能是应对复杂系统的最佳策略(BCPL只有30页规范,而C语言标准后来超过700页);第三,技术创新的价值有时不在其直接应用,而在于它催生的“方法”和“思维”——就像BCPL催生了C语言,C语言又催生了UNIX,最终塑造了数字世界的底层。 ## 参考资料 - [BCPL - Wikipedia](https://en.wikipedia.org/wiki/BCPL) — BCPL的历史、设计哲学和影响 - [Martin Richards个人主页](https://www.cl.cam.ac.uk/~mr10/) — 剑桥大学教授,BCPL开发者,包含原始论文和编译器源代码 - [The BCPL Programming Language (1967) - Computer History Museum](https://www.computerhistory.org/collections/catalog/102658067) — 博物馆收藏的原始BCPL文档和打孔纸带 - [A History of BCPL - Martin Richards](https://www.cl.cam.ac.uk/~mr10/BCPL/history.html) — 开发者亲笔撰写的BCPL发展历程 - [BCPL and the birth of C - Bell Labs](https://www.bell-labs.com/usr/dmr/www/chist.html) — Dennis Ritchie关于C语言起源的经典文章,详细描述了BCPL对C语言的影响

发布于 2026/7/4