【51CTO精选译文】一段时间以来,Java 是唯一运行在 JVM 上的语言。而 Scala 最近因用于扩展 Twitter 后台(详情可参考51CTO之前发布的《一位Twitter工程师的Scala探秘之旅》)而吸引了众多目光。与许多运行在 JVM 上的语言不同,如 Groovy、Jruby 和 Jython,Scala 它是静态类型的。这表示,与 Java 和 C# 类似,类型必须在编译时是已知的。通常,人们介绍 Scala 时会说它即是面向对象的(OO)又是函数式的(functional)。虽然这种说法是正确的(并且令人畏惧,很多人对于这些词汇很不爽),但并没有抓住 Scala 的重点。
以下 Scala 的各种特性能够为你带来最直接的好处:
兼容 Java。这点很明显(其他 200 多种 JVM 上的语言也兼容 Java),但它是如此重要的一个功能,因此不可小视。它意味着 Scala 可以使用所有 Java 库和框架爱。这也是对那些投资该技术的人员和公司的表达敬意。
联合编译(Joint Compilation)。这表示与 Groovy 类似,Scala 类被编译为 Java 类,因此可以在 Java 项目中使用(甚至在他们被定义的同一项目中的 java 类 使用)。即使你的团队觉得完全转向 Scala,对于通过 JSR 223 整合动态语言,这依然很有用。
类型推断(Type Inference)。如果编译器能猜到类型(通常它可以做到),你就不必告诉它。这使得 Scala 代码具有动态语言的简洁性,而同时保持类型安全。
隐式转换(Implicit conversion),使 Scala 具有类型安全性,正如扩展方法(extension method)之于 C#,开放类(open class)之于 ruby。即:向你未曾定义的类型添加方法(如字符串、列表、整数)。这是使得 Scala 符合 DSL(特定领域语言)模型的特性之一。
鼓励使用对象不变性,并且容易实现。Scala 甚至提供了内置的不变对象垃圾收集器。对于Scala有这样一种说法:“每当提到不变性时,有人就会开始担心性能的问题,对于某些情况,这种担忧并非毫无来由,但对于 Scala,最终结果却与这一担忧相反。不可变的数据结构相对于可变的数据结构,更有助于获得较高的效率。其原因之一在于强大的垃圾收集器(garbage collector),与 JVM 中的垃圾收集器类似。”
自动生成 Getter 和 Setter,如果你不需要(比如你只需 Setter),你必须显示地将他们私有化(private)。这不是问题,因为通常情况都需要。
Scala 具有第一等级(first-order)函数并通过 iterable trait 实现了枚举协议(enumeration protocol),这有助于让代码更加干净、更加简洁,并能够带来其他一些好处。
Actor 编程模式让高度并行应用程序的开发更加简单。
不必显示抓取或抛出(try-catch)异常。可以认为使用已检查异常(checked exception)的害处多于好处。
有关Scala更多的好处,可以参考51CTO之前发布的Ruby高手点评Scala编程语言十大绝招一文。不过,单单这些特性就已足够——足够令 Scala 成为一个非常有趣的语言,足够让 JRuby 创建者之一 Charles Nutter 宣称它就是 Java 王位的合法继承人,甚至足够让 Groovy 的创建人 James Stracha 以及 Java 的创建人 James Gosling 为其背书。尽管如此,Scala 是一个具有深度的语言,还有几项高级特性,可以让开发者更具生产力。但在掌握基本知识之前就学习这些功能会让人感觉非常困难,如果没有很好的支持文档(比如 IBM、 Aritma、Jonas Bonér、Daniel Spiewak、Sven Efftinge 以及官方和其他网站提供的资料)会更加困难。不过,这不仅仅是令人兴奋,在你需要时,它确实可以用来进一步挖掘更具深度的一些概念。
51CTO编辑推荐:Scala编程语言专题
即使 Scala 具有学术性的根源(正如在它的论文网页上显示的那样,以及它涉及的某些高深概念),它已成功应用在企业项目上,除 Twitter 之外,还有西门子、法国电力集团(électricité de France)和 WattzOn 网站。
在所有这些优点之外,Scala 的确还存在一些粗糙的地方。虽然很多正在努力解决这些弱点,但近期内它们还是有影响的:
◆刚刚起步的 IDE 支持。正如 Lift 的作者所言,Scala 的 IDE 支持,虽然进行了很多开发,还没有做到 Java 那种地步。重构支持、代码完整以及单元测试整合都很差。更不必说大多数框架支持工具不能很好地与 Scala 兼容。由于 IDE 能够帮助人们学习这种语言,这可能吓退那些新手。另一方面,Martin Folwer 认为这种 IDE 状况是相对的,一种让你更具生产力的语言足以弥补缺乏高级工具的弱点。
◆大多数 IDE 不支持联合编译。同样,当 Scala 更加普及之后,这一点会有所改变。
◆类的不变性并非真的不变性,因为引用对象自身可能不是不变的。并且目前没有方法可以确保整个对象图谱是不变的。
◆让 JSR 223 完美地兼容 Scala 非常困难。但另一方面,取得足够好的兼容还是相当容易的。
◆Scala 不支持元编程(metaprogramming)。通过将其与动态语言结合,如 Ruby,可以绕过这个问题,但如果你是元编程的重度使用者,使用一个完全不同的语言是一种较好的解决办法(Fan 是另一个运行在 JVM 上的静态类型语言,与 Scala 类似,但支持元编程)。
◆使用 Java 资源的框架,如客户端 GWT,不能很好地兼容 Scala(虽然有人已经在服务器端让 Scala 与 GWT 兼容)。不过,有一个项目正在进行,将能够使 Scala 转化为 Java 资源。
◆语法和某些概念与 Java 有点不同,比如:颠倒的类型声明顺序、使用下划线而不是通配符、星号和缺省值,太多种类的空概念(nothing)、没有静态方法(你需要使用单例对象 singleton object 作为替代)。文档对这些问题有很好的解释,但是,请留意,这不是 Java 代码到 Scala 代码的自动转换。
正如 Joe Amstrong 所说,随着 CPU 变得更加廉价,具有越来越多的内核,开发者能够更加简便地使用多核 CPU 的语言需求,将会不断增加。Scala 恰好满足了这种需求,而同时 Java 的开发停滞不前,纠缠于广泛部署所带来的问题,以及未来有多开放的不确定性和某些主要贡献者的政治问题。根据这种情况来看,Scala 非常适合 Java 王位继承者这一角色。
【编辑推荐】