Scala是可伸缩语言(Scalable Language)的缩写,读作skah-lah, 于2004年1月20日发布了第一个公开版本。其实早在2001年,Martin Odersky就开始Scala的设计工作,Martin 是瑞士洛桑联邦理工大学(EPFL)计算机与通信科学学院的一名教授, Martin曾和Haskell 语言设计者之一 Philip Wadler合作,设计了一个原型系统GJ, 最终演变为 Java 泛型。Martin还曾受雇于 Sun 公司,编写了 javac 的参考编译器,这套系统后来演化成了 JDK 中自带的 Java 编译器。
Scala是一门混合范式编程语言,同时支持面向对象和函数式编程,函数式编程已经被视为解决并发、大数据的最佳工具,这也是Scala相对于Java的强大之处。同时Scala还是一门有趣的语言,有趣之处在于虽然它是强类型语言,但是却采用了动态类型语法,使得代码更加简洁、灵活和优雅。这主要得益于Scala强大的类型推断系统,在编译期可以进行静态类型推断,不仅可以降低代码的冗余性,而且也不用担心动态类型语言的重构灾难。
从2001年开始,Scala经历了如下发展过程:
大事记 |
---|
2001年诞生于EPFL |
2003年发布初始版本 |
2006年发布2.0版本 |
2011年Odersky创建Typesafe,后改名Lightbend |
2012年发布2.8、2.9和2.10版本,从2.10开始弃用内置actor库,改用Akka |
2014年发布2.11版本 |
2016年发布2.12版本 |
2017年发布2.13-M2版本 |
Scala全面拥抱现有的Java生态系统,可以和现有Java类库实现无缝连接,你可以在Scala项目直接引入现有的Java依赖,或是直接引入Java源码文件。与此同时,Scala生态发展的也非常不错,下面列举几个具有代表性的项目。
分布式系统
Akka是一个工具库,可以帮助你构建一个基于消息驱动的高可用分布式系统。Akka包含很多模块,Akka Actor是Akka的核心模块,使用Actor模型实现并发和分布式,可以将你从Java的多线程痛苦中解救出来;Akka Streams可以让你以异步非阻塞的方式处理流数据,并且支持背压(backpressure); Akka Http实现了一套基于流的HTTP服务端和客户端;Akka Cluster可以帮你实现一个分布式集群系统;Cluster Sharding可以帮你做集群的分片处理;Distributed Data可以帮助你在集群之间分享数据;Alpakka可以帮你为Akka Streams集成不同的数据源;Akka Persistence可以帮你处理Actor消息的持久化存储,防止重启后数据丢失。
Finagle是Twitter基于Netty开发的支持容错的、协议无关的RPC框架,该框架支撑了Twitter的核心服务。
大数据处理
Spark是一个围绕速度、易用性和复杂分析构建的大数据处理框架。最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apache的开源项目之一。Spark提供了一个更快、更通用的数据处理平台。和Hadoop相比,Spark可以让你的程序在内存中运行时速度提升100倍,或者在磁盘上运行时速度提升10倍。去年,在100 TB Daytona GraySort比赛中,Spark战胜了Hadoop,它只使用了十分之一的机器,但运行速度提升了3倍。Spark也已经成为 针对 PB 级别数据排序的最快的开源引擎。
Kafka发源于LinkedIn,于2011年成为Apache的孵化项目,随后于2012年成为Apache的主要项目之一。Kafka使用Scala和Java进行编写。Apache Kafka是一个快速、可扩展的、高吞吐、可容错的分布式发布订阅消息系统。Kafka具有高吞吐量、内置分区、支持数据副本和容错的特性,适合在大规模消息处理场景中使用。
新一代编译器
Dotty 是 Scala 的下一代编译器,也是 Scala 的新语言概念和编译器技术研究平台。Martin Odersky一直领导着Dotty的工作。 Dotty是一种创新的,基于Dependent Object Types(DOT)演算(基本上是Scala的简化版本)和函数式编程(FP)数据库社区的研究编译器。
WEB框架
基于Scala的Web框架有很多,Play、Lift、Scalatra和Finatra等等,其中Play是Lightbend官方维护的框架。Play 刚开始发布的 1.x 版本是基于Java开发, 从 2.0 版本开始,整个框架使用Scala进行了重写。笔者正是从Play 2.0开始,从传统的SSH/SSI转向Play,一直使用至今。在这个过程中有诸多的欣喜与发现,在后面将会和大家慢慢分享。
本书的第一部分是Scala入门指引,不会涉及到Scala语言的高级特性,只是用简短的篇幅向大家介绍一些Scala在Web开发场景下常用的技巧。如果您想进行更深入的学习,建议您参考以下两本书籍: