编程语言之Scala
2010-12-15 15:22:35 阿炯

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 is a general purpose programming language designed to express common programming patterns in a concise, elegant, and type-safe way. It smoothly integrates features of object-oriented and functional languages, enabling Java and other programmers to be more productive. Code sizes are typically reduced by a factor of two to three when compared to an equivalent Java application.

Scala是一种针对 JVM 将函数和面向对象技术组合在一起的编程语言。Scala编程语言近来抓住了很多开发者的眼球。它看起来像是一种纯粹的面向对象编程语言,而又无缝地结合了命令式和函数式的编程风格。Scala的名称表明,它还是一种高度可伸缩的语言。Scala的设计始终贯穿着一个理念:创造一种更好地支持组件的语言。Scala融汇了许多前所未有的特性,而同时又运行于JVM之上。随着开发者对Scala的兴趣日增,以及越来越多的工具支持,无疑Scala语言将成为你手上一件必不可少的工具。

* Scala是面向对象的:Scala是一个纯面向对象语言,在某种意义上来讲所有数值都是对象。对象的类型和行为是由class和trait来描述的。Class的抽象可由子类化和一种灵活的基于mixin的组合机制(它可作为多重继承的简单替代方案)来扩展。

* Scala是函数式的: Scala还是一个函数式语言,在某种意义上来讲所有函数都是数值。Scala为定义匿名函数提供了一种轻量级的语法,它支持高阶(higher- order)函数、允许函数嵌套、支持局部套用(currying)。Scala的case类及其内置支持的模式匹配模型代数类型在许多函数式编程语言中 都被使用。

* Scala是静态类型的:Scala配备了一套富有表现力的类型系统,该抽象概念以一种安全的和一致的方式被使用。

* Scala是可扩展的:Scala的设计承认了实践事实,领域特定应用开发通常需要领域特定语言扩展。Scala提供了一个独特的语言组合机制,这可以更加容易地以类库的形式增加新的语言结构:
o 任何方式可以被用作中缀(infix)或后缀(postfix)操作符
o 闭包按照所期望的类型(目标类型)自动地被构造
两者结合使用可方便地定义新语句,无需扩展语法,也无需使用类似宏的元编程工具。

* Scala可与Java和.NET进行互操作:Scala 设计时就考虑了与流行编程环境良好交互,如Java 2运行时环境(JRE)和 .NET框架(CLR)。特别是与主流面向对象语言,如Java和C#尽量无缝交互。Scala有像Java和C#一样的编译模型(独立编译,动态装载 类),允许访问成千上万的高质量类库。

特性

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

函数式编程
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 = pivot) yield i)
}

静态类型
Scala是具备类型系统,通过编译时的检查,保证代码的安全性和一致性。类型系统具体支持以下特性:
* 泛型类别
* 型变注释(Variance Annotation)
* 类型继承结构的上限和下限
* 把类别和抽象类型作为对象成员
* 复合类型
* 引用自己时显式指定类型
* 视图
* 多态方法

扩展性
Scala的设计承认一个事实,即在实践中,某个领域特定的应用程序开发往往需要特定于该领域的语言扩展。Scala提供了许多独特的语言机制,可以以库的形式轻易无缝添加新的语言结构:
* 任何方法可用作前缀或后缀操作符
* 可以根据预期类型自动构造闭包

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

使用Scala的框架

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

Scala.js 已开源十年

Scala.js 是一个将 Scala 语言编译成 JavaScript 的工具,可以直接在浏览器上使用 Scala 编写程序。


最初的 Scala.js 是 EPFL LAMP 的一个单人项目,于 2013 年 2 月 5 日迎来了首次提交,并在 2013 年 6 月的 Scala Days 上首次展示,当时受到了热烈欢迎 —— 虽然它输出了 16 MB 大小的 “Hello world”。随后一小群早期的爱好者聚集在一个邮件列表中,为该项目提供有价值的早期反馈,随着讨论的增加,一个人的项目很快成长为一个两人核心团队以及几十个爱好者。起初 Scala 生态系统的大多数库都不支持 Scala.js,只有一些核心用户使用 Scala.js 构建了新的库和测试框架。但随着 Scala.js 0.6.0 脱离了实验性环境,转为生产可用,Scala.js 的采用显著增长, Scala 生态系统中越来越多的库开始支持 Scala.js。如今,大多数不专门针对 JVM-only 特性的库都为 Scala/JVM 和 Scala.js 交叉发布。在 2021 年 8 月发布的 Scala.js 1.7.0 以来,Scala.js 的每个版本的已知错误都是 0 ,覆盖了整个核心存储库:编译器后端和 Scala 链接器。

回想发布之初,将 Scala 编译成 JavaScript 还像一个梦想,但如今它已成为一种日常。如今 Scala.js 已经是一项非常成熟的技术,具有稳定核心、充满活力的库生态以及热情的用户和贡献者社区。在 Jetbrains 2022 开发者调查和 Scala 2022 现状调查中, Scala 开发者分别有 12% 和 17% 的 Scala.js 用户。 在 Maven Central 统计报告中,Scala.js 核心工件每月的下载量超过 100,000 次。2023年2月上旬,迎来了它的十周年记念。


最新版本:2.10
该版本包含 Value 类、隐式类、字符串插值、Futures 和 Promises,Dynamic 和 applyDynamic,依赖方法类型,新的基于 ASM 的 ByteCode 生成器,新的模式匹配,Scaladoc 改进和模块化语言特性;可配置的并行集合;包含 Akka Actors。提升了性能,更快的 inliner;更新了 ForkJoin 库,改进了 PartialFunctions 等等。

最新版本:3.0
Scala 3 稳定版于2021年5月中旬发布,发行公告中写道:“经过 8 年的努力开发,在此期间共产生了 28000 多次 commit、7400 多个 PR,以及关闭了 4100 多个 issue。从2012年12月6日 Scala 3 的首个 commit 算起,共计超过 100 人为项目做出了贡献。现在,Scala 3 通过结合类型理论的最新研究以及 Scala 2 的行业经验,Scala 的第三次迭代版本变得更易于使用、学习和扩展”。按照规划,3.x 期间的更新频率是每隔 6 周发布一次常规维护更新。下面简单介绍一下 Scala 3 值得关注的新特性:

新类型
交集类型
并集类型
类型 Lambda
匹配类型
依赖函数类型
多态函数类型

上下文抽象
Using 子句
扩展方法
实现 Type Class
Type Class 推导
Multiversal Equality
上下文函数
隐式转换

其他新特性
Trait 参数
透明 Trait
统一应用函数
Export 子句
不透明类型别名
开放类
参数解元组
Kind 多态
Matchable Trait
@threadUnsafe 注解
@targetName 注解
新控制语法
可选括号
显式 null
安全初始化
TypeTest
……
更多详细更新内容点此查看。


官方主页:http://www.scala-lang.org/