Scala

维基百科,自由的百科全书
跳转至: 导航搜索
Scala
编程范型 多范式函数式面向对象命令式
发行时间 2003年
設計者 Martin Odersky英语Martin Odersky
實作者 洛桑联邦理工学院编程方法实验室
最新发行时间 2.11.2 / 2014年7月24日;51天前 (2014-07-24)
型態系統 静态类型推断, 结构化英语Structural type system
啟發語言 Java, Pizza英语Pizza (programming language),[1] Haskell, Erlang, Standard ML, Objective Caml, Smalltalk, Scheme
網站 http://www.scala-lang.org

Scala(发音为 /ˈskɑːlə, ˈskeɪlə/)是一种多范式的编程语言,设计初衷是要整合面向对象编程和函数式编程的各种特性。[1]

平台和许可证[编辑]

Scala运行于Java平台Java虚拟机),并兼容现有的Java程序。它也能运行于CLDC配置的Java ME中。目前还有另一.NET平台的实现[2],不过该版本更新有些滞后。[3]

Scala的编译模型(独立编译,动态类加载)与JavaC#一样,所以Scala代码可以调用Java類別庫(对于.NET实现则可调用.NET類別庫)。

Scala套件包括编译器和類別庫,以BSD许可证发布。[4]

历史[编辑]

洛桑联邦理工学院的Martin Odersky于2001年基于Funnel的工作开始设计Scala。Funnel是把函数式编程思想和Petri网相结合的一种编程语言。[5] Odersky先前的工作是Generic Java英语Generic Javajavac。Java平台的Scala于2003年底/2004年初发布。[5].NET平台的Scala发布于2004年6月。[1][5][6]该语言第二个版本,v2.0,发布于2006年3月。[1]

Scala 2.8的特性包括重写的Scala容器庫、调用方法的命名参数和默认参数、包对象,以及Continuation.[7]

2012年1月,发布版本2.9.1。

2012年4月,发布版本2.9.2。

使用Scala的软件[编辑]

2009年4月,Twitter宣布他们已经把大部分後端程式从Ruby迁移到Scala,其余部分也打算要迁移。[8]

此外,Wattzon英语Wattzon已经公开宣称,其整个平台都已经是基于Scala基础设施编写的。[9]

瑞银集团把Scala用于一般产品中。[10]

Coursera把Scala作为服务器语言使用。[11]

特性[编辑]

支持的编程范式[编辑]

面向对象特性[编辑]

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

函数式编程[编辑]

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

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

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

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

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

静态类型[编辑]

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

扩展性[编辑]

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

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

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

并发性[编辑]

Scala使用Actor作为其并发模型,Actor是类似线程的实体,有一个邮箱发收消息。Actor可以复用线程,因此可以在程序中可以使用数百万个Actor,而线程只能创建数千个。在2.10之后的版本中,使用Akka作为其默认Actor实现。[13] 以下代码是一个使用Actor模式的EchoServer实现

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程式:

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

 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代码的一些方式:

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

参考文献[编辑]

  1. ^ 1.0 1.1 1.2 1.3 Martin Odersky; Philippe Altherr, Vincent Cremet, Iulian Dragos, Gilles Dubochet, Burak Emir, Sean McDirmid, Stéphane Micheloud, Nikolay Mihaylov, Michel Schinz, Erik Stenman, Lex Spoon, Matthias Zenger. An Overview of the Scala Programming Language, Second Edition. [2014-06-25]. 
  2. ^ Scala on .NET. 洛桑联邦理工学院编程方法实验室. 2008-01-07 [2008-01-15]. "Scala is primarily developed for the JVM and embodies some of its features. Nevertheless, its .NET support is designed to make it as portable across the two platforms as possible." 
  3. ^ http://www.artima.com/weblogs/viewpost.jsp?thread=163733
  4. ^ http://www.scala-lang.org/node/146
  5. ^ 5.0 5.1 5.2 Martin Odersky, "A Brief History of Scala", Artima.com weblogs, June 9, 2006
  6. ^ Martin Odersky, "The Scala Language Specification Version 2.7"
  7. ^ Scala 2.8 Preview
  8. ^ Greene, Kate. The Secret Behind Twitter's Growth, How a new Web programming language is helping the company handle its increasing popularity.. Technology Review. MIT. April 1, 2009 [April 6, 2009]. 
  9. ^ Cloud, Jeremy. Scala + WattzOn, sitting in a tree.... March 10, 2009. 
  10. ^ http://drdobbs.com/article/print?articleId=231001802&siteSectionName=
  11. ^ https://tech.coursera.org/blog/2014/02/18/why-we-love-scala-at-coursera/
  12. ^ Tail calls, @tailrec and trampolines
  13. ^ http://zh.scala-tour.com/#/using-actor

图书[编辑]

外部链接[编辑]