Scala

Scala（ˈskɑːlə, ˈskeɪlə）是一门多范式的编程语言，设计初衷是要整合面向对象编程和函数式编程的各种特性。

## 平台和许可证

Scala运行于Java平台（Java虚拟机），并兼容现有的Java程序。它也能运行于CLDC配置的Java ME中。曾经有过另一.NET平台的实现，不过该版本已被放弃。

Scala的编译模型（独立编译，动态类加载）与Java和C#一样，所以Scala代码可以调用Java类库（对于.NET实现则可调用.NET类库）。

Scala套件包括编译器和类库，以BSD许可证发布。

## 历史

洛桑联邦理工学院的Martin Odersky于2001年基于Funnel (并行计算)的工作开始设计Scala。Funnel是把函数式编程思想和佩特里网相结合的一种编程语言。Odersky之前工作于Java泛型和javac。Java平台的Scala于2003年底/2004年初发布。.NET平台的Scala发布于2004年6月。该语言第二个版本，v2.0，发布于2006年3月。

Scala 2.8的特性包括重写的Scala容器库、命名参数和默认参数、包对象，以及Continuation.

2012年1月，发布版本2.9.1。

2012年4月，发布版本2.9.2。

## 使用Scala的软件

- 2009年4月，Twitter宣布他们已经把大部分后端程式从Ruby迁移到Scala，其余部分也打算要迁移。
- Wattzon已经公开宣称，其整个平台都已经是基于Scala基础设施编写的。
- 瑞银集团把Scala用于一般产品中。
- Coursera把Scala作为服务器语言使用。
- 多邻国，一个线上的免费语言学习平台，使用 Scala编写。

## 特性

### 支持的编程范式

#### 面向对象特性

Scala是一种纯面向对象的语言，每个值都是对象。对象的数据类型以及行为由类和特质描述。类抽象机制的扩展有两种途径。一种途径是子类继承，另一种途径是灵活的混入机制。这两种途径能避免多重继承的种种问题。

#### 函数式编程

Scala也是一种函数式语言，其函数也能当成值来使用。Scala提供了轻量级的语法用以定义匿名函数，支持高阶函数，允许嵌套多层函数，并支持柯里化。Scala的case class及其内置的模式匹配相当于函数式编程语言中常用的代数类型。

更进一步，程序员可以利用Scala的模式匹配，编写类似正则表达式的代码处理XML数据。在这些情形中，列表推导式功能对编写公式化查询非常有用。

由于JVM不支持尾调用，Scala也不能完全支持尾调用最佳化。不过，Scala编译器可以把某些简单的尾递归最佳化成循环。

以下代码以函数式风格实现了快速排序算法，可以与Erlang快速排序的例子做个比较：

```scala
def qsort(list: List[Int]): List[Int] = list match {
  case Nil => Nil
  case pivot :: tail =>
    val(smaller, rest) = tail.partition(_ < pivot)
    qsort(smaller) ::: pivot :: qsort(rest)
}
```

### 静态类型

Scala具备类型系统，通过编译时检查，保证代码的安全性和一致性。类型系统具体支持以下特性：

- 泛型类别。
- 协变和逆变。
- 标注。
- 类型参数的上下限约束。
- 把类别和抽象类型作为对象成员。
- 复合类型。
- 引用自己时显式指定类型。
- 视图。
- 多态方法。

### 扩展性

Scala的设计秉承一项事实，即在实践中，某个领域特定的应用程序开发往往需要特定于该领域的语言扩展。Scala提供了许多独特的语言机制，可以以库的形式轻易无缝添加新的语言结构：

- 任何方法可用作前缀或后缀操作符。
- 可以根据预期类型自动构造闭包。

联合使用以上两个特性，使你可以定义新的语句而无须扩展语法也无须使用宏之类的元编程特性。

### 并发性

Scala使用演员模型作为其并发模型，Actor是类似线程的实体，通过邮箱发收消息。Actor可以复用线程，因此可以在程序中可以使用数百万个Actor,而线程只能创建数千个。在2.10之后的版本中，使用Akka作为其默认Actor实现。

以下代码是使用Actor模式的EchoServer实现

```scala
val echoServer = actor(new Act {
  become {
    case msg => println("echo " + msg)
  }
})
echoServer ! "hi"
```

Actor模式可以简化并发编程，好利用多核CPU的能力。

## 使用Scala的框架

Lift是开源的Web应用框架，旨在提供类似Ruby on Rails的东西。因为Lift使用了Scala，所以Lift应用程序可以使用目前所有的Java库和Web容器。

## Hello World范例

以下是用Scala编写的典型Hello World程式：

```scala
 object HelloWorld extends App {
   println("Hello, world!")
 }
```

或

```scala
 object HelloWorld {
   def main(args: Array[String]) {
     println("Hello, world!")
   }
 }
```

请注意它与Java的Hello World应用程序有哪些相似之处。一处显著区别在于，Scala版的Hello World程序不通过static关键字把main方法标记为静态方法，而是用object关键字创建了单件。

假设该程序保存为HelloWorld.scala文件，接下来可以通过以下命令行进行编译：

```
> scalac HelloWorld.scala
```

若要运行：

```
> scala -classpath . HelloWorld
```

这与编译和运行Java的“Hello World”程序是不是很像呢？事实上，Scala的编译和执行模型与Java是等效的，因而它也兼容于Java的构建工具，比如Ant.

直接使用Scala解释器也可以运行该程序，使用选项-i（从文件加载代码）和选项-e（若要运行额外的代码，就得实际执行HelloWorld对象的方法）即可：

```
> scala -i HelloWorld.scala -e 'HelloWorld.main(null)'
```

## 测试

以下是测试Scala代码的一些方式：

- ScalaTest
- ScalaCheck，类似于Haskell的 QuickCheck的库
- specs，用于Scala的行为驱动的开发工具库
- JUnit

内置的Scala库SUnit已经不赞成使用，已在2.8.0版中移除。

## 图书

- Programming in Scala(ISBN 978-0-9815316-0-1) - A comprehensive step-by-step guide by Martin Odersky, Lex Spoon, and Bill Venners.
- Beginning Scala(ISBN 978-1-4302-1989-7) - A down–to–earth approach to teaching Scala by David Pollak.
- Programming Scala(ISBN 978-1-934356-31-9) - Creating highly scalable, highly concurrent applications on the Java platform by Venkat Subramaniam.
- Programming Scala (ebook)

## 基本资料

- 编程范型：多范式：函数式，面向对象，指令式
- 发行时间：2004年1月20日
- 设计者：Martin Odersky
- 开发者：洛桑联邦理工学院编程方法实验室
- 软件版本周期：3.8.4
- 类型系统：静态，强，类型推断, 结构化类型系统
- 受影响于：Eiffel, Erlang, Haskell, Java, Lisp, Pizza (编程语言), Standard ML, OCaml, Scheme, Smalltalk, Oz
- 施影响于：Ceylon (编程语言), Fantom (编程语言), F#, Kotlin, Lasso (编程语言), Red (编程语言), Swift
- 平台：JVM、JavaScript、LLVM（实验性）
- 许可证：3句版BSD授权条款
- 文件扩展名：.scala, .sc