1.4 Scala寻根
Scala的设计受到许多编程语言和编程语言研究领域的概念的影响。事实上,Scala只有很少的几个特性是原创的;大部分特性都在其他语言中实现过。Scala的创新在于将这些语法概念有机地结合在一起。本节将列出对Scala设计有重大影响的语言和观念。这份清单不可能做到完整(在编程语言领域,各种聪明有趣的点子实在是太多了)。
在表层,Scala借鉴了大部分来自Java和C#的语法,而这些语法特征大部分也是从C和C++沿袭下来的。表达式、语句和代码块与Java几乎一致,类、包和引入的语法也基本相同。[18]除了语法,Scala还用到了Java的其他元素,如基本的类型、类库和执行模型等。
除此之外,Scala也吸收了很多来自其他语言的影响。Scala采用的统一对象模型由Smalltalk开创,由Ruby发扬光大。Scala的统一嵌套机制(Scala几乎所有语法结构都支持嵌套)也同样出现在Algol、Simula中,近期Beta和gbeta也引入了类似机制。Scala方法调用的统一访问原则和对字段的选取方式来自Eiffel。Scala的函数式编程实现方式与ML家族的语言(包括SML、OCaml、F#等)也很神似。Scala类库的许多高阶函数(higher-order function),在ML和Haskell中也有。Scala的隐式参数是为了做到Haskell的type class的效果,它实现了类似在传统的面向对象语境中对于“同一类对象”的那种抽象[19]。而Scala基于actor模型的核心并发库——Akka,在很大程度上受到Erlang的启发。
Scala并不是首个强调伸缩性和扩展性的语言。支持不同应用领域的可扩展编程语言的历史,可以追溯到Peter Landin于1966年发表的论文——《未来的700种编程语言》[20](这篇论文中提到的编程语言Iswim与Lisp并列,是函数式编程语言的先驱)。具体到使用中缀(infix)操作符作为函数的想法,可以在Iswim和Smalltalk中找到影子。另一个重要的理念是允许函数字面量(或代码块)作为参数,以支持自定义控制结构。这个特性也可以追溯到Iswim和Smalltalk。Smalltalk和Lisp都支持灵活的语法来完整构建领域特定语言(domain-specific language)。通过操作符重载和模板系统,C++也支持一定程度的定制和扩展,但与Scala相比,C++更为底层,其核心更多的是面向系统级的操作处理。
Scala也不是首个将函数式和面向对象编程集成在一起的语言,尽管它很可能是这些语言中在这个方向上走得最远的。其他将某些函数式编程的元素集成进面向对象编程(OOP)的语言有Ruby、Smalltalk和Python。在Java平台上,Pizza、Nice、Multi-Java(还有Java 8自己)都基于Java的内核扩展出函数式的概念。还有一些主打函数式的编程语言也集成了对象系统,如OCaml、F#和PLT-Scheme。
在编程语言领域,Scala也贡献了自己的一些创新。比如,它的抽象类型提供了与泛型类型相比更加面向对象的机制,它的特质允许用户更灵活地组装组件,而它的提取器(extractor)提供了一种与展示无关的方式来实现模式匹配。这些创新点在最近几年的编程语言大会和论文中也多有提及。[21]