第1章 Scala——一种混合式编程语言
Scala是一种将其他编程语言中的多种技巧融合为一的语言。Scala尝试跨越多种不同类型的语言,给开发者提供面向对象编程、函数式编程、富有表达力的语法、静态强类型和丰富的泛型等特性,而且全部架设于Java虚拟机之上。因此开发者使用Scala时可以继续使用原本熟悉的某种编程特性,但要发挥Scala的强大能力则需要结合使用这些有时候相互抵触的概念和特性,建立一种平衡的和谐。Scala对开发者的真正解放之处在于让开发者可以随意使用最适合手头上的问题的编程范式。如果当前的任务更适合用命令式的设计实现,没什么规定禁止你写命令式的代码,如果函数式编程和不可变性(immutability)更符合需要,那程序员也可以尽管用。更重要的是,面对有多种不同需求的问题领域(problem domain),你可以在一个解决方案的不同部分采用不同的编程方法。
1.1 Scala的设计哲学
深入理解Scala
为了理解Scala的哲学,我们需要理解产生Scala的环境:Java生态圈Java(TM)语言在1995年左右进入计算机科学领域,产生了巨大的影响。Java和运行Java的虚拟机开始慢慢地变革了我们的编程方法。在那时候,C++正如日中天,开发者正在从纯C风格的编程转而开始学习如何有效地使用面向对象编程方法。尽管C++有很多的优点,但它也有一些痛点,比如难以分发库(distributing libraries)以及其面向对象实现的复杂度。
Java语言通过提供限制了部分能力的面向对象特性和使用Java虚拟机,同时解决了这两个痛点。Java虚拟机(JVM)允许代码在一个平台上编写和编译后,几乎不费多大劲就能分发到其他的平台上。尽管跨平台问题并没有就此消失,但是跨平台编程的成本极大地降低了。
随着时间的推移,JVM的执行效率越来越高,同时Java社区不断成长。HotSpot(TM)优化技术被发明出来,这样就可以先探测运行环境再进行针对性的代码优化。虽然这使得JVM启动速度变慢,但是之后的运行时性能则变得很适合于运行服务器之类的应用。尽管最初并非为企业服务器领域设计的,JVM开始在此领域大行其道。于是人们开始尝试简化企业服务器应用开发,Enterprise Java Beans(TM)和较新的Spring Application Framework(TM)出现,帮助程序员更好地利用JVM的能力。Java社区发生了爆炸式的成长,创造出成百万的易于使用的库。“只要你能想到的,基本都能找到Java库”成为一个职场口号。Java语言持续地缓慢进化,努力维持住其社区。
与此同时,部分开发者开始延展他们的羽翼,触及了Java本身设计上的局限之处。Java简化了一些(编程元素),而社区中的部分成员需要增加一些复杂的,但是可控的元素。第二波创造JVM语言的浪潮掀起并持续至今。Groovy、JRuby、Clojure和Scala等语言开始将Java程序员带入一个新时代。我们不再局限于一种语言,而是可以有多种选择,每一种语言都有不同的优点和弱点。Scala是其中较为流行的一种。
Scala语言创造者Martin Ordersky是javac编译器的作者,也是他将泛型引入Java语言中。Scala语言衍生自Funnel语言。Funnel语言尝试将函数式编程和Petri网结合起来,而Scala的预期目标则是将面向对象、函数式编程和强大的类型系统结合起来,同时仍然要能写出优雅、简洁的代码。将以上多种概念混合的目的是创造出一种既能让程序员真正用起来,同时又能用来研究新的编程范式的语言。事实上它取得了巨大的成功—它作为一种可行的有竞争力的语言已经开始被产业界采用。
要想掌握Scala,你需要理解多种混合在一起的概念。Scala试图将以下三组对立的思想融合到一种语言中。
• 函数式编程和面向对象编程。
• 富有表达力的语法和静态类型。
• 高级的语言特性同时保持与Java的高度集成。
我们来看一下这些特性是如何融合在一起的。先从函数式编程和面向对象编程概念开始。