Scala 概述
摘要
Scala 是一种融合了面向对象和函数式编程的静态类型语言,他被定位为构建组件及组件系统。本文是 Scala 语言的概述,适合于理解编程方法和熟悉程序语言设计的读者阅读。
1 简介
真正的组件系统,一直是软件业一个近乎虚幻(elusive)的目标。从理想的角度看,软件应该可以使用组件库中预先设计好组件的构建,一如硬件可以用预制的芯片进行组装。然而现实中,任何软件中都有很大一部分是用 “从头开始”(“from scratch”)的方式编写的,正因为如此,软件开发迄今为止仍然是一种工艺(Craft)而没有成为工业。
这里所说的组件是指软件的某种部件(parts),他们可以被更大的部件或整个应用以某种形式所调用;组件可以有很多形式,如:模块(modules)、类(classes)、框架(frameworks)、过程(processes)或 web services。其代码规模也可以从几行到成百上千行。他们可以与其他组件以很多方式相连接,包括聚合、参数传递、继承、远程调用及消息传递等。
我们始终认为,基于组件的软件开发一直以来缺乏进展,很大程度上是由于我们用来定义和集成各种组件的编程语言本身的缺陷。绝大部分编程语言为组件的抽象和编写(composite)提供的支持极为有限,这一点在 Java 或者 C# 这种静态类型语言中尤为明显,恰恰当今的大部分组件系统都是由他们写成的。
(瑞士)洛桑联邦理工学院(EPFL)的程序设计实验室从 2001 年开始研发 Scala,并于 2004 年 1 月发布了基于 JVM 的版本,6 月又发布了基于 .NET 的版本。Scala 的第二版在 2006 年 3 月发布,这是一个改进的版本,也就是本文描述内容所基于的版本。
Scala 工作起源于研究更好地支持组件开发的编程语言,我们有两个假设希望通过 Scala 进行验证:首先,我们认为一种适合于组件系统的编程语言应该具有某种可扩展性(scalable),也就是说:相同的概念可以既适用于描述小型部件,也同样适用于描述大型部件。因此,我们专注于组件的抽象、组成和分解的机制,而非加入一整套基本语法结构来描述组件,因为这样做很可能在某种规模的组件层面上有效,而在另一个规模的层面上却无效。其次,我们认为可扩展的组件支持可以来自于这样一种编程语言:它能够统一并进一步泛化(generalize)面向对象编程和函数式编程这两种编程模式。迄今为止,在静态类型语言中(Scala 属于其中之一),这两个范式差距是很大的。(很显然这里所说 “Scala 属于其中之一” 并非是指 Scala 中这两种编程模式也存在很大差异,而是在表明把 Scala 设计成为静态类型语言的意义所在 —— 译注)
为验证我们的假设,需要能够真正用于设计组件和组件系统,因为只有得到用户社区的正式应用才能说明 Scala 语言所体现的这些概念是否在设计组件系统时真正有效。为了使用户更容易采用这种新语言,它必须能很好的与现有平台和组件相整合。因此 Scala 被设计成为能够与 Java 和 C# 很好的工作在一起,他采纳了这两种语言的主要语法和类型系统。当然,为了获得真正的进步,也必须抛弃很多固有的传统,这也就是为什么 Scala 并不是 Java 的超集:有些功能被去掉了,另一些概念被重新解释,以便获得一致性。
尽管 Scala 的语法刻意地遵守传统,但其类型系统至少在三方面有新的突破:首先,抽象类型定义和路径依赖类型(path-dependent types)将 νObj Calculus [36] 应用到了具体的语言设计上。其次,模块化的 mixin 组合方式(modular mixin composition)结合了 mixins 和 traits 的优势。第三,视图(views)的概念使组件得以按照模块化的方式被使用。
本文其余部分给出了 Scala 的概述,按照下列几个关键方面进行组织:
- Scala 程序与 Java 在很多方面十分相像,并且可以与 Java 程序无缝衔接(第 2 节)
- Scala 有一个统一的对象模型,这意味着所有的值都是对象,所有的操作都是方法调用(第 3 节)
- Scala 是一个函数式语言,这意味着函数是“一等公民”的值对象(first-class values)(第 4 节)
- Scala 有统一和强有力的抽象概念来描述类型和值(第 5 节)
- Scala 有灵活的,模块化的 mixin 组合构造用于编写类和特征(traits) (第 6 节)
- 它允许使用模式匹配来对对象进行分解(decomposition)(第 7 节)
- 模式(Pattern)和表达式被进一步泛化,用于对 XML 文档的自然处理(第 8 节)
- Scala 支持通过视图(views)对组件进行外部扩展(第 9 节)
最后第十节讨论相关工作,第十一节是结论。
本文是 Scala 语言的高层概括,主要面向对程序设计语言有一定知识的读者,它既不是简化版的 Scala 语言参考,也不是一个教程。完整的语言参考可以参见《Scala 语言规范》[35],教程则可参见 [34,18] 等。