【创世纪厅】
1963年,CPL正式问世。由剑桥大学主导开发,面向大型机平台用户。
ALGOL的进阶版,催生了BCPL和C语言的血脉。
技术特色:编程语言、语言设计、计算机科学。
影响力评估:技术维度 9/10,商业维度 2/10,文化维度 6/10,用户维度 1/10。
作为创世纪厅的经典代表,CPL在软件发展史上留下了深刻的印记。
ALGOL的进阶版,催生了BCPL和C语言的血脉。
【创世纪厅】
1963年,CPL正式问世。由剑桥大学主导开发,面向大型机平台用户。
ALGOL的进阶版,催生了BCPL和C语言的血脉。
技术特色:编程语言、语言设计、计算机科学。
影响力评估:技术维度 9/10,商业维度 2/10,文化维度 6/10,用户维度 1/10。
作为创世纪厅的经典代表,CPL在软件发展史上留下了深刻的印记。
1963年的计算机世界,是一个充满激情与混沌的拓荒时代。大型机是那个时代的巨兽,它们占据整间恒温机房,用穿孔纸带和磁鼓存储数据,运行速度以毫秒计,内存则以千字节为计量单位。程序员们使用的工具,主要是汇编语言——那种直接操作机器指令、寄存器与内存地址的低级代码。编写一个简单的排序程序,往往需要数百行冗长且极易出错的汇编指令。在这片荒原上,高级编程语言如同沙漠中的绿洲。ALGOL 60刚刚确立了自己在学术界的地位,它拥有优雅的语法结构、块作用域和递归调用,让程序员能够用更接近数学表达的方式书写逻辑。然而,ALGOL的纯粹学术性也带来了问题:它缺乏处理输入输出、文件操作等实际商业需求的能力。与此同时,FORTRAN早已在IBM 704上证明了科学计算的威力,COBOL则试图用英语式的语法来征服商业数据处理领域。但这两者都过于专精,无法成为通用的编程工具。
正是在这种分裂的背景下,两位英国计算机科学的巨人——克里斯托弗·斯特雷奇(Christopher Strachey)和莫里斯·威尔克斯(Maurice Wilkes)——决定做一件在当时看来近乎狂妄的事情:设计一种融合ALGOL的表达力与商业编程实用性的通用语言。斯特雷奇是剑桥大学数学实验室的教授,一个性情古怪、思想超前的天才。他早在1950年代就发明了“概念编程”的概念,并设计出最早的宏处理器之一。威尔克斯则是伦敦大学的教授,更是一位务实的工程师——他在1949年领导建造了EDSAC,这是世界上第一台存储程序式电子计算机之一。两人的合作始于1962年的一次学术会议,会上他们讨论了ALGOL的不足,并萌生了创造一种“组合编程语言”(Combined Programming Language,简称CPL)的想法。
CPL的命名本身就透露了它的野心。“Combined”一词暗示着它将学术界的严谨与工业界的务实结合在一起。斯特雷奇和威尔克斯希望CPL能成为一种“编程语言的母语”——既能像ALGOL那样表达复杂的算法,又能像COBOL那样处理商务数据,还能像FORTRAN那样进行高效的科学计算。为了实现这一目标,他们为CPL设计了一系列超前于时代的特性。
最引人注目的是CPL的“模式匹配”机制。在现代语言中,模式匹配通常与函数式编程语言(如Haskell、Scala)或脚本语言(如Python的match语句)相关联,但CPL在1963年就已经引入了类似的概念。它允许程序员根据数据结构的不同形态编写分支逻辑,例如根据列表的第一个元素是否为整数来执行不同的操作。这种能力在当时是革命性的,因为它将数据结构的描述与操作逻辑分离,使代码更加简洁和可维护。
CPL还支持一种类似现代“泛型”的类型系统。程序员可以定义“类型变量”,然后编写适用于多种数据类型的函数。例如,一个“交换”函数可以同时用于整数、浮点数甚至自定义结构体,而无需为每种类型重复编写代码。这在1960年代是极其罕见的——大多数语言要么完全静态类型且缺乏抽象能力(如ALGOL),要么完全动态类型(如LISP)。CPL试图在两者之间架起桥梁,尽管它的实现方式相当复杂,需要编译器在编译时进行大量的类型推导和代码生成。
此外,CPL引入了“引用”和“指针”的概念,尽管这些术语在当时尚未标准化。它允许程序员间接访问内存位置,类似于后来C语言中的指针,但语法更为严格。CPL还拥有丰富的数据结构支持,包括记录(类似结构体)、联合(类似共用体)以及链表等基本动态结构。它的控制流也相当完整:条件语句、循环(包括带条件的while和for)、函数定义、递归调用,甚至支持“跳转表达式”(类似后来C语言的逗号运算符和条件表达式)。
然而,这些先进特性的背后,是巨大的技术代价。CPL的编译器设计极其庞大和复杂。当时的计算机,如剑桥大学的Titan(一台基于Atlas架构的机器),内存只有大约64KB,而CPL编译器本身就需要占据数十KB的空间。编译一个中等规模的CPL程序,往往需要数小时,甚至因为内存溢出而崩溃。更糟糕的是,CPL的运行时系统也异常臃肿:它需要维护复杂的类型信息、堆栈帧和垃圾回收机制(尽管当时的术语是“存储整理”)。据当时的程序员回忆,编译CPL代码时,整台机器会陷入“几乎完全停滞”的状态,其他用户只能等待。
这种低效催生了一个著名的调侃:CPL被戏称为“Cumbersome Programming Language”(笨重的编程语言)。这个双关语在剑桥和伦敦的计算机实验室里流传甚广。斯特雷奇本人对此不以为意,他认为语言的优雅和表达力远比运行效率重要。但威尔克斯则更为务实,他意识到CPL的设计过于抽象,已经超出了当时硬件能力的承受范围。1965年,当CPL的编译器终于能在Titan上勉强运行时,其性能之低劣让许多早期用户望而却步。最终,CPL从未获得广泛采用,它的商业应用几乎为零,只在剑桥和伦敦的学术圈内拥有少量用户。
但CPL的失败并非终点,而是一个关键的分岔点。1966年,剑桥大学的年轻研究员马丁·理查兹(Martin Richards)接手了CPL的简化工作。理查兹当时正在研究操作系统移植问题,他需要一种比汇编语言更高级、但又比CPL更轻量的工具。他从CPL中剥离了所有冗余特性——模式匹配、泛型、复杂的类型系统——只保留核心的控制流、数据结构定义和基本表达式。结果就是BCPL(Basic CPL),一种简洁到极致的语言。BCPL的编译器只有几千行代码,运行速度极快,甚至可以在一台内存只有16KB的机器上顺利工作。理查兹在1967年发布了BCPL的第一个版本,它迅速成为操作系统开发者的宠儿。
BCPL的成功直接影响了另一位程序员——肯·汤普森(Ken Thompson)。当时,汤普森在贝尔实验室参与Multics操作系统的开发。Multics的失败让他和丹尼斯·里奇(Dennis Ritchie)等人转而开发一个更简单的系统:Unix。汤普森最初用汇编语言编写Unix,但很快意识到需要一种更高级的语言来移植系统。他从BCPL中汲取灵感,简化了语法,去除了类型系统(BCPL只有一种数据类型——机器字),创造了B语言。B语言极其简陋,甚至不支持整数与浮点数的区分,但它足以编写操作系统内核。1972年,里奇在B语言的基础上增加了类型系统、结构体和指针,形成了C语言。C语言后来成为Unix的基石,并最终演变为整个软件工业的基础设施。
因此,CPL虽然本身从未成功,但它如同一条隐秘的河流,通过BCPL、B语言和C语言,最终汇入了现代编程语言的汪洋大海。斯特雷奇和威尔克斯的设计思想——将高级抽象与低级控制相结合——在C语言中得到了完美的体现。C语言的指针、结构体、函数指针等特性,都能在CPL的蓝图中找到原型。甚至CPL的模式匹配思想,也在后来的函数式语言和Python等语言中复活。
CPL的遗产还体现在另一个层面:它证明了语言设计需要平衡抽象与效率。斯特雷奇的理想主义让CPL过于超前,而威尔克斯的务实主义则催生了BCPL。这种张力后来成为计算机科学中永恒的争论——语言的优雅与机器的性能如何取舍?CPL的失败给出了一个历史性的答案:在硬件资源极度受限的时代,过度抽象是致命的。但它的理念并未消亡,而是在数十年后,当硬件足够强大时,重新成为现代语言设计的重要参考。
在剑桥大学科学博物馆的档案室里,至今保存着CPL编译器的原始穿孔纸带和手写设计文档。那些泛黄的纸张上,斯特雷奇用铅笔勾勒的语法图,与今天的Rust、Go、Python等语言的抽象语法树有着惊人的相似。参观者可以在这里看到一份1963年的CPL程序示例,它用类似ALGOL的语法定义了一个链表操作函数。如果忽略掉那些过时的关键字(如“proc”代替“function”,“val”代替“int”),这段代码几乎可以直接编译为现代C语言。这让人不禁感叹:有些思想,即使诞生在错误的时代,也会在正确的时间重新绽放。
CPL的故事,是计算机史上最典型的“失败中的伟大”。它从未成为主流,甚至从未真正投入使用,但它播下的种子,通过BCPL、C语言和Unix,重塑了整个数字世界。当你在手机上滑动屏幕、在浏览器中打开网页、在服务器上运行数据库时,那些底层代码的基因里,都流淌着CPL的血脉。它就像一位默默无闻的曾祖父,虽然早已离世,但他的子孙后代却遍布全球,统治着这个由0和1构成的王国。
对技术发展和工程实践的推动程度
对商业模式和市场格局的影响深度
在科技文化和社会层面的持久影响力
用户群体的广度和普及程度