← 返回故事列表

挪威的种子:Simula 67如何用“对象”点燃一场软件革命

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

1967年,当美国阿波罗计划正冲刺登月,当IBM的System/360大型机统治着数据中心,在挪威奥斯陆一个不起眼的计算中心里,两位程序员却悄悄写下了一段改变未来的代码。他们没有发明更快的算法,没有打造更强大的硬件——他们创造了一种全新的思维方式:让软件像现实世界一样,由“对象”构成。这就是Simu

# 挪威的种子:Simula 67如何用“对象”点燃一场软件革命 1967年,当美国阿波罗计划正冲刺登月,当IBM的System/360大型机统治着数据中心,在挪威奥斯陆一个不起眼的计算中心里,两位程序员却悄悄写下了一段改变未来的代码。他们没有发明更快的算法,没有打造更强大的硬件——他们创造了一种全新的思维方式:让软件像现实世界一样,由“对象”构成。这就是Simula 67,第一款面向对象编程语言。然而,它的诞生并非一帆风顺:起初被当作“模拟工具”而遭商业冷遇,甚至被主流计算机界视为古怪的挪威实验。但正是这颗被时代低估的种子,在二十年后长成了Java、C++和Python的参天大树。本文讲述的,就是两位挪威科学家如何从机场排队问题出发,撬动整个软件工程范式的传奇。 ## 从机场客流的困惑到“对象”的诞生 故事始于1960年代初的挪威计算中心(Norsk Regnesentral)。这里聚集着一群为政府和企业解决实际问题的应用数学家。其中,Ole-Johan Dahl和Kristen Nygaard正被一个棘手的项目困扰:奥斯陆机场的客流模拟。当时的计算机擅长数值计算,但面对“乘客、航班、排队、安检通道”这类离散实体时,传统的Fortran和ALGOL代码变得混乱不堪。每次模拟都要重写大量重复代码,数据与流程纠缠在一起,修改一个参数往往需要改动整个程序。 “我们被困在过程的牢笼里,”Nygaard后来回忆道,“每个程序都是一个巨大的流程图,而现实世界是由相互作用的实体组成的。为什么我们不能让代码描述这些实体本身?” 这个看似简单的疑问,触及了当时软件工程的根本缺陷。1960年代的程序设计遵循“过程式”范式:程序员定义一系列步骤,数据被动地被函数处理。一旦系统复杂度上升,代码就会像一团乱麻。Dahl和Nygaard意识到,他们需要的不是更快的计算,而是更自然的映射——让程序中的每个“乘客”拥有自己的状态和行为,就像真实世界那样。 于是,他们开始构思一个革命性的概念:“类”(Class)。一个类就像一个蓝图,定义了某种实体的属性和行为。而“对象”(Object)则是这个蓝图的具体实例。更关键的是,他们引入了“继承”(Inheritance):你可以创建一个“乘客”类,再从中派生出“VIP乘客”类,后者自动拥有前者的所有特征,只需添加额外功能。这种机制让代码可以像生物分类一样层级化、可复用。 1965年,他们提交了一篇题为《SIMULA:一个用于系统模拟的扩展ALGOL》的论文。但学术界的反应冷淡。一位评审人甚至写道:“这不过是在ALGOL上加了几个花哨的语法糖。”很少有人意识到,这些“花哨的语法糖”正在重塑软件的基因。 ## 深夜的奥斯陆:当“继承”成为武器 转折点出现在1967年的一个深夜。Dahl和Nygaard正在为Simula 67的最终编译器调试一个关键问题。之前的Simula I(1965年)还只是个模拟语言扩展,而Simula 67的目标是成为一门完整的通用编程语言。最大的挑战在于:如何让“类”和“继承”在编译层面高效实现,而不拖慢运行速度? 当时的主流编译器都是为过程式语言设计的。函数调用简单直接:压栈、跳转、返回。但“继承”意味着子类对象可能调用父类的方法,而方法的具体实现需要在运行时才能确定(动态绑定)。这需要一种全新的内存布局和调用机制。Dahl盯着满桌的穿孔卡片,突然说:“如果我们把每个对象的内存分成两部分——一个指向类描述符的指针,和一个存储自身数据的区域——那么所有方法调用都可以通过这个指针间接跳转。” 这就是后来被称为“虚函数表”(vtable)的雏形。Nygaard立刻意识到这个方案的价值:“这样继承就不会增加任何额外开销!编译时我们就能生成跳转表,运行时只需要一次间接寻址。”他们兴奋地工作到凌晨,用铅笔在草纸上画出了对象布局的示意图。这个设计如此优雅,以至于后来C++、Java、Python的虚函数机制都与之神似。 1967年6月,Simula 67的编译器在UNIVAC 1107上成功运行。它能够编译包含类、继承、动态绑定和协程的代码。为了演示,他们编写了一个银行模拟程序:账户、交易、客户——每个实体都是一个对象,继承关系清晰,代码量只有传统Fortran版本的三分之一。然而,当他们在国际信息处理联合会(IFIP)的会议上展示时,听众的反应依然不温不火。一位IBM的工程师甚至评论:“这很有趣,但谁会需要‘继承’这种复杂的东西?我们只需要更好的循环和子程序。” 商业上的困境接踵而至。Simula 67的编译器价格昂贵(约5000美元),而当时大多数程序员连“对象”的概念都难以理解。Nygaard后来不无苦涩地说:“我们发明了未来,但未来还没有准备好迎接我们。” ## 沉寂的种子与爆发的森林 Simula 67的商业失败几乎是注定的。它的运行需要昂贵的UNIVAC大型机,而它的语法——基于ALGOL 60——对普通程序员来说过于学术化。更重要的是,面向对象的概念超前了时代至少十年。1970年代,当结构化编程(如Pascal、C语言)正成为主流时,Simula逐渐退出了商业舞台。到1980年代初,它几乎只在挪威的学术界和少数欧洲研究机构中被使用。 但种子已经播下。1972年,施乐帕克研究中心(Xerox PARC)的Alan Kay在阅读Simula的论文后深受震撼,他写道:“Simula让我意识到,程序不应该是过程,而应该是互相发送消息的对象。”Kay随后设计了Smalltalk,将面向对象推向图形界面和动态语言的世界。1980年代,Bjarne Stroustrup在贝尔实验室开发C++时,明确承认Simula的类机制是其核心灵感。他说:“C++的类直接来自Simula,只是去掉了协程,加上了C的效率。”1990年代,Java的发明者James Gosling同样引用Simula作为“面向对象思想的源头”。而Python的创始人Guido van Rossum也承认,Simula的“类”概念让他第一次理解了什么是真正的代码复用。 2001年,Dahl和Nygaard因对面向对象编程的贡献获得图灵奖。颁奖词写道:“他们通过引入类、继承和对象,改变了软件工程的面貌。”此时,Simula 67的代码早已无人使用,但它的思想已经嵌入到每一行Java、C++、Python代码之中。据统计,截至2023年,全球超过70%的软件开发项目使用了面向对象语言,而这些语言的基因都可以追溯到那个奥斯陆的深夜。 ## 评论 Simula 67的故事是一个典型的“先见之明与商业滞后”的案例。它的教训在于:技术突破的价值往往不在当下,而在它为后代提供的认知框架。Dahl和Nygaard没有发明“模拟”本身——他们发明的是思考软件的新方式:将现实世界映射为代码中的“对象”。这种映射的深刻之处在于,它让程序员不再与机器逻辑搏斗,而是与业务逻辑共舞。从商业史看,Simula的失败提醒我们:伟大的技术需要与之匹配的生态——包括教育、硬件和市场需求。但它也证明:只要思想足够正确,即使沉寂数十年,最终仍会占据统治地位。今天,当我们在IDE中敲击“class”关键字时,应该记得:这不是语法糖,而是两位挪威科学家在1967年那个深夜,用铅笔和穿孔卡片,为整个软件行业打开的一扇门。 ## 参考资料 - [Simula - Wikipedia](https://en.wikipedia.org/wiki/Simula) — 全面的Simula历史、语法和影响介绍 - [Ole-Johan Dahl and Kristen Nygaard - ACM Turing Award](https://amturing.acm.org/award_winners/dahl_6917229.cfm) — 2001年图灵奖官方介绍,包含个人传记和贡献说明 - [The Birth of Object-Oriented Programming: The Simula Language](https://www.cs.utexas.edu/users/EWD/transcriptions/EWD1000.html) — E.W. Dijkstra对Simula的评论(需搜索引擎查找具体档案) - [Simula 67 Compiler Source Code (Norwegian Computing Center)](https://www.nr.no/en) — 挪威计算中心官网,可查阅Simula历史档案 - [Bjarne Stroustrup on Simula's Influence on C++](https://www.stroustrup.com/hopl-almost-final.pdf) — Stroustrup在HOPL会议论文中详细讨论Simula的影响

发布于 2026/7/4