Scala 编程范型 多范式 :函数式 ,面向对象 ,指令式 設計者 Martin Odersky ( 英语 : Martin Odersky ) 實作者 洛桑联邦理工学院 编程方法实验室发行时间 2004年1月20日,21年前 (2004-01-20 ) 当前版本 3.5.0(2024年8月22日;穩定版本) [ 1] 型態系統 静态 ,强 ,类型推断 ,结构化 ( 英语 : Structural type system ) 實作語言 Scala 系统平台 JVM 、JavaScript [ 2] 、LLVM (實驗性)[ 3] 許可證 3句版BSD授權條款 [ 4] 文件扩展名 .scala, .sc 網站 www .scala-lang .org 受影响于 Eiffel ,Erlang ,Haskell ,[ 5] Java ,[ 6] Lisp ,[ 7] Pizza ( 英语 : Pizza (programming language) ) ,[ 8] Standard ML ,[ 6] OCaml ,[ 6] Scheme ,[ 6] Smalltalk ,Oz 影響語言 Ceylon ( 英语 : Ceylon (programming language) ) ,Fantom ( 英语 : Fantom (programming language) ) ,F# ,Kotlin ,Lasso ( 英语 : Lasso (programming language) ) ,Red ( 英语 : Red (programming language) ) ,Swift [來源請求]
Scala (发音为/ˈskɑːlə, ˈskeɪlə/ )是一门多范式 的编程语言,设计初衷是要整合面向对象编程和函数式编程 的各种特性。[ 8]
Scala运行于Java平台 (Java虚拟机 ),并兼容现有的Java 程序。它也能运行于CLDC 配置的Java ME 中。曾经有过另一.NET 平台的实现[ 9] ,不过该版本已被放弃。[ 10]
Scala的编译模型(独立编译,动态类加载)与Java 和C# 一样,所以Scala代码可以调用Java类库(对于.NET实现则可调用.NET类库)。
Scala套件包括编译器和类库,以BSD许可证 发布。[ 11]
洛桑联邦理工学院 的Martin Odersky于2001年基于Funnel ( 英语 : Funnel (concurrent computing) ) 的工作开始设计Scala。Funnel是把函数式编程 思想和佩特里网 相结合的一种编程语言。[ 12] Odersky之前工作于Java泛型 ( 英语 : Generic Java ) 和javac 。Java平台的Scala于2003年底/2004年初发布。[ 12] .NET平台的Scala发布于2004年6月。[ 8] [ 12] [ 13] 该语言第二个版本,v2.0,发布于2006年3月。[ 8]
Scala 2.8的特性包括重写的Scala容器庫、命名参数和默认参数、包对象,以及Continuation .[ 14]
2012年1月,发布版本2.9.1。
2012年4月,发布版本2.9.2。
Scala是一种纯面向对象 的语言,每个值都是对象 。对象的数据类型以及行为由类 和特质 描述。类抽象机制的扩展有两种途径。一种途径是子类继承 ,另一种途径是灵活的混入 机制。这两种途径能避免多重继承的种种问题。
Scala也是一种函数式语言,其函数也能当成值来使用。Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化 。Scala的case class 及其内置的模式匹配 相当于函数式编程语言中常用的代数类型 ( 英语 : Algebraic type ) 。
更进一步,程序员可以利用Scala的模式匹配,编写类似正则表达式 的代码处理XML数据。在这些情形中,列表推导式 功能对编写公式化查询非常有用。
由于JVM不支持尾调用 ,Scala也不能完全支持尾调用最佳化。不过,Scala编译器可以把某些简单的尾递归 最佳化成循环。[ 19]
以下代码以函数式风格实现了快速排序 算法,可以与Erlang 快速排序的例子做个比较:
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实现。[ 20] 以下代码是使用Actor模式的EchoServer实现
val echoServer = actor ( new Act { become { case msg => println ( "echo " + msg ) } }) echoServer ! "hi" Actor模式可以简化并发编程,好利用多核CPU的能力。
Lift 是开源的Web应用框架,旨在提供类似Ruby on Rails 的东西。因为Lift使用了Scala,所以Lift应用程序可以使用目前所有的Java库和Web容器。
以下是用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.0 1.1 https://www.scala-lang.org/download/3.5.0.html .^ Scala.js . [2015-07-27 ] . (原始内容 存档于2015-08-10). ^ Scala Native . [2015-07-27 ] . (原始内容存档 于2016-04-22). ^ Scala 2.11.1 is now available! . [2016-08-29 ] . (原始内容存档 于2016-08-27). ^ Fogus, Michael.MartinOdersky take(5) toList . Send More Paramedics. 6 August 2010 [2012-02-09 ] . (原始内容存档 于2012-02-14). ^6.0 6.1 6.2 6.3 Odersky, Martin.The Scala Experiment - Can We Provide Better Language Support for Component Systems? (PDF) . 11 January 2006 [2016-06-22 ] . (原始内容存档 (PDF) 于2016-06-23). ^ Scala Macros . [2020-09-26 ] . (原始内容存档 于2020-02-05). ^8.0 8.1 8.2 8.3 Martin Odersky et al., An Overview of the Scala Programming Language, 2nd Edition ^ Scala on .NET .洛桑联邦理工学院 编程方法实验室. 2008-01-07 [2008-01-15 ] . (原始内容 存档于2007-10-09).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. ^ 存档副本 . [2019-08-10 ] . (原始内容存档 于2017-07-29). ^ 存档副本 . [2009-07-22 ] . (原始内容存档 于2009-08-21). ^12.0 12.1 12.2 Martin Odersky,"A Brief History of Scala" (页面存档备份 ,存于互联网档案馆 ), Artima.com weblogs, June 9, 2006 ^ Martin Odersky, "The Scala Language Specification Version 2.7" ^ Scala 2.8 Preview . [2009-07-22 ] . (原始内容存档 于2009-04-26). ^ 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] . (原始内容 存档于2012-04-17). ^ Cloud, Jeremy.Scala + WattzOn, sitting in a tree... . March 10, 2009 [2009-07-22 ] . (原始内容存档 于2009-04-09). ^ 存档副本 . [2012-01-14 ] . (原始内容存档 于2011-07-19). ^ 存档副本 . [2014-04-15 ] . (原始内容存档 于2014-04-01). ^ Tail calls, @tailrec and trampolines . [2009-07-22 ] . (原始内容存档 于2011-08-12). ^ 存档副本 . [2013-05-08 ] . (原始内容存档 于2013-06-07).