Scala 的起源(2009)
Scala语言的诞生源于其创始人Martin Odersky对编译器和函数式编程的热情。在参与改进Java并为其引入泛型后,Odersky因Java严格的向后兼容性限制而感到沮 দেখেন。为了创造一门既能利用JVM生态系统、又能在设计上更先进和安全的语言,他领导开发了Scala。这门语言旨在克服Java在类型系统(特别是数组协变性)上的根本缺陷,从而提供一个更灵活、更强大的编程模型。
早期的编译器探索
Martin Odersky对编程语言的兴趣始于大学时期,他着迷于编译器的构建。在80年代,他和同学Peter Sollich决定为当时流行的Modula-2语言编写一个编译器。
- 起步困难: 他们最初使用的计算机资源有限,只有一台内存为56KB的Osborne-1电脑,且唯一的编程工具是功能简陋的Microsoft Basic。
- 自举实现: 他们采用经典的“自举”(bootstrapping)技术,从一个用汇编语言编写的简易Pascal编译器开始,逐步迭代,最终构建出一个完整的Modula-2编译器。
- 商业接触: 他们的编译器最终被Borland公司收购,但由于市场策略等原因,并未获得广泛推广。这次经历后,Odersky决定继续学术研究,并师从Pascal和Modula-2的发明者Niklaus Wirth攻读博士学位。
改进Java的尝试
在研究生涯中,Odersky对函数式编程产生了浓厚兴趣,并希望将其思想引入当时新兴的Java语言。
- Pizza语言: 他与Phil Wadler合作开发了名为 Pizza 的实验性语言。它在Java的基础上增加了三个核心的函数式特性:
- 泛型
- 高阶函数
- 模式匹配
- Generic Java (GJ): Pizza的成功引起了Sun公司核心开发团队的注意。他们对泛型特性尤其感兴趣,并与Odersky合作启动了 GJ (Generic Java) 项目。这个项目最终演变成了Java 5中的泛型实现。
- 成为标准编译器: Odersky为GJ编写的编译器因其稳定性和可维护性优于Sun的官方编译器,从Java 1.3版本开始,它被采纳为标准的
javac编译器。
设计一门超越Java的语言
在改进Java的过程中,Odersky深刻体会到现有语言的局限性。
我有时会感到沮 দেখেন,因为Java是一门既有的语言,有着非常严格的限制。因此,我无法按照我认为正确的方式去做很多事情。
这段经历让他下定决心,要设计一门全新的、更好的语言。但他也清楚,完全从零开始是不现实的。他的核心理念是:
- 设计一门新语言,但必须与现有的Java基础设施(JVM和库)相连。
最初的尝试是一种名为 Funnel 的纯函数式语言,但它在实践中被证明过于学术化,对初学者不友好,对专家又显得繁琐。团队因此决定重新开始,寻求在纯粹的学术语言与务实的Java之间找到一个平衡点。这个新的项目最终成为了 Scala,于2002年启动,2003年首次公开发布。
解决Java的核心设计缺陷
Scala之所以需要打破与Java的源码兼容性,一个关键原因是为了修复Java在设计之初留下的一些根本性问题,其中最典型的就是 数组协变性 (covariant arrays)。
- 问题所在: 在Java中,一个
String[]类型的数组可以被当作Object[]类型的数组使用。这个设计是为了在没有泛型的早期版本中实现通用的排序等算法。 - 不良后果: 这种设计在类型上是不安全的,会导致运行时的
ArrayStoreException异常。更严重的是,它从根本上阻碍了Java为数组实现一套完善的泛型系统。Odersky称之为“原罪”,一个早期的权宜之计破坏了后续的设计。 - Scala的解决方案: Scala选择不再兼容这一点,它放弃了Java的数组协变性。这一决定虽然破坏了与Java的部分兼容性,但却为构建一个更健全、更一致的类型系统扫清了障碍,使得泛型等高级特性能够以更优雅和安全的方式实现。