从分布式系统研究走向语言设计

比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup)是丹麦出生的计算机科学家、C++的设计者和最初实现者。他1950年生于奥胡斯,1975年在奥胡斯大学完成数学与计算机科学学业,1979年获剑桥大学计算机科学博士学位。他的研究涉及分布式系统、编程技术与软件工具,而不只是某一版语言语法。

博士研究中的模拟程序使他重视Simula的类和类型检查:它们能让程序结构对应研究对象,又能及早暴露设计错误。但当时实现的编译、链接与运行成本也带来困难。1979年进入贝尔实验室后,他开始把这种组织大型程序的能力与C适于系统编程的效率结合,形成“C with Classes”。

参考:[1] [2]

兼容C是一项工程选择

斯特劳斯特鲁普不是从空白语法出发。他保留C的表达方式、底层操作和既有工具环境,让使用者能把新机制逐步放进真实项目。早期Cfront把C++翻译成C,借助现成编译器和系统接口移植。这条路线也意味着不能随意抛弃旧程序依赖的规则。

兼容并不等于C是C++严格意义上的子集。斯特劳斯特鲁普在常见问题中列举了合法性或含义不同的程序,例如某些指针转换和新增关键字造成的差异。与此同时,他把“不用的功能不应额外消耗时间和空间”作为设计要求。因此,是否增加抽象机制,还要看它能否被实现为可控制成本的系统程序,而非只看示例是否简短。

参考:[2] [3] [4]

类、虚函数与模板并非同时出现

早期的类用于把数据和操作组织在一起;1983年C++加入虚函数后,调用者可以经由共同接口使用不同具体对象。图形系统无需在每个调用处逐一判断圆或其他形状,而能把具体操作留给派生类。这里的关键是接口与实现的分离,不是简单增加一种结构体写法。

C++在1983年已于AT&T内部使用,同年采用现名;首个商业实现和《C++程序设计语言》第一版在1985年10月推出。模板与异常处理则是后来发展的机制,并非那次发布已经包含的全部内容。模板让类型或其他参数参与生成可复用代码,与虚函数的运行时选择承担不同任务,C++因此不能只用面向对象编程概括。

参考:[2] [3]

个人设计进入集体标准化

随着厂商实现和用户增长,语言定义不能仅靠原始编译器维持。ANSI的C++委员会于1989年首次开会,随后与ISO工作组合作;约束新功能、处理不同实现及完善库成为集体工作。斯特劳斯特鲁普参与其中,但标准不是他的个人作品,具体编译器也属于各自实现团队。

例如,亚历山大·斯捷潘诺夫和孟李发展的标准模板库把泛型算法、容器等组织为可复用库,在1990年代进入标准化讨论。斯特劳斯特鲁普支持提高抽象层次,也面对模板编译模型等具体取舍。1998年的首个ISO标准是这一持续过程的阶段成果。此后他的著述和标准工作继续解释、改进语言,而非把1985年的设计视作一次完成的成品。

参考:[3] [4]