Scala是一门多范式的
编程语言,一种类似
java的编程语言,设计初衷是实现可伸缩的
语言、并集成
面向对象编程和
函数式编程的各种特性。Scala是一种纯粹的
面向对象语言,因为每个值都是一个对象。对象的类型和行为由类和特征描述。类可以通过子类化和使用灵活的基于mixin的组合机制作为多继承的干净替代来扩展。
产生背景
Scala是一种通用编程语言。它由Martin Odersky创建和开发。Martin于2001年在
洛桑联邦理工学院(EPFL)开始研究Scala。它于2004年1月20日正式发布。
发展历史
联邦理工学院洛桑(
EPFL)的
Martin Odersky于2001年基于Funnel的工作开始设计Scala。Funnel是把函数式编程思想和
Petri网相结合的一种编程语言。Odersky先前的工作是Generic
Java和
javac(Sun Java
编译器)。
Java平台的Scala于2003年底/2004年初发布。
.NET平台的Scala发布于2004年6月。该语言第二个版本,v2.0,发布于2006年3月。
截至2009年9月,最新版本是版本2.7.6 。Scala 2.8预计的特性包括重写的Scala
类库(Scala collections library)、方法的命名参数和
默认参数、包对象(package object),以及
Continuation.
2009年4月,
Twitter宣布他们已经把大部分后端程序从
Ruby迁移到Scala,其余部分也打算要迁移。此外, Wattzon已经公开宣称,其整个平台都已经是基于Scala基础设施编写的。
主要功能
Scala不是Java的扩展,但它完全可以与Java互操作。在编译时,Scala文件将转换为Java字节码并在JVM(Java虚拟机)上运行。Scala被设计成面向对象和函数式的。它是一种纯粹的面向对象语言。scala的名字来源于单词scalable,意思是它可以随着用户的需求而增长。
版本记录
语言特点
Scala得以提供一些出众的特性,包括:
面向对象风格
函数式风格;
Scala把Erlang风格的基于actor的并发带进了JVM。开发者可以利用Scala的actor模型在JVM上设计具
伸缩性的并发应用程序,它会自动获得
多核心处理器带来的优势,而不必依照复杂的Java线程模型来编写程序。
Scala是一种纯面向对象的语言,每一个值都是对象。对象的
数据类型以及行为由类和特征(Trait)描述。类抽象机制的扩展有两种途径。一种途径是子类继承,另一种途径是灵活的混入(Mixin)机制。这两种途径能避免
多重继承的种种问题。
轻量级的函数语法
高阶;
嵌套;
局部套用(Currying);
匿名;
Scala也是一种
函数式语言,其函数也能当成值来使用。Scala提供了轻量级的语法用以定义
匿名函数,支持
高阶函数,允许嵌套多层函数,并支持
柯里化 。Scala的Case Class及其内置的
模式匹配相当于函数式编程语言中常用的代数类型(Algebraic Type)。
更进一步,程序员可以利用Scala的模式匹配,编写类似
正则表达式的代码处理XML数据。在这些情形中,顺序容器的推导式(comprehension)功能对编写公式化查询非常有用。
由于JVM不支持
尾部递归,Scala也不能完全支持尾部递归优化。不过,在简单的情况下,Scala
编译器可以把尾部递归优化成循环。
以下代码以函数式风格实现了
快速排序算法,可以与
Erlang快速排序的例子做个比较:
def
qsort(list: List[Int]): List[Int]=
list match{
case Nil => Nil
case pivot::tail =>
qsort(for(i <- tail if i < pivot)yield i)::: pivot :: qsort(for(i <- tail if i >= pivot)yield i)
}
静态类型
Scala是具备
类型系统,通过
编译时的检查,保证代码的安全性和一致性。类型系统具体支持以下特性:
泛型类,型变注释(Variance Annotation),类型继承结构的
上限和下限,把类别和抽象类型作为
对象成员,复合类型,引用自己时显式指定类型,视图,多态方法。
扩展性
Scala的设计承认一个事实,即在实践中,某个领域特定的
应用程序开发往往需要特定于该领域的语言扩展。Scala提供了许多独特的
语言机制,可以以库的形式轻易无缝添加新的
语言结构:
任何方法可用作前缀或后缀
操作符,可以根据预期类型自动构造闭包。联合使用以上两个特性,可以定义新的语句而无须扩展语法也无须使用宏之类的
元编程特性。
与XML集成
可在Scala程序中直接书写XML
可将XML转换成Scala类
运行环境
Scala运行于
Java平台(Java虚拟机),并兼容现有的Java程序。它也能运行于
Java ME,
CLDC(Java Platform, Micro Edition Connected Limited Device Configuration)上。还有另一.NET平台的实现,不过该版本更新有些滞后。
Scala的编译模型(独立编译,动态类加载)与Java和C#一样,所以Scala代码可以调用Java类库(对于.NET实现则可调用.NET类库) 。
Scala包中包含了
编译器和类库,以
BSD许可证发布。
编程范例
以下是用Scala编写的典型的Hello Scala中文程序:
或
object HelloScalachina {def
main(args:
Array请注意它与Java的Hello Scala中文应用程序有哪些相似之处。一个显著区别在于,Scala版的Hello Scala中文程序没有把任何东西标记为
static,而是用object 关键字创建了一个单件。
假设该程序保存为HelloScalachina.scala文件,接下来可以通过以下
命令行进行编译:
> scalac HelloScalachina.scala
若要运行:
> scala -classpath . HelloScalachina
这与编译和运行Java的“Hello Scala中文”程序是不是很像,事实上,Scala的编译和执行模型与Java是等效的,因而它也兼容于Java的构建工具,比如Ant.
直接使用Scala
解释器也可以运行该
程序,使用选项-i (从文件加载代码)和选项-e (若要运行额外的代码,就得实际执行HelloScalachina对象的方法)即可:
> scala -i HelloScalachina.scala -e 'HelloScalachina.main(null)'