科技: 人物 企业 技术 IT业 TMT
科普: 自然 科学 科幻 宇宙 科学家
通信: 历史 技术 手机 词典 3G馆
索引: 分类 推荐 专题 热点 排行榜
互联网: 广告 营销 政务 游戏 google
新媒体: 社交 博客 学者 人物 传播学
新思想: 网站 新书 新知 新词 思想家
图书馆: 文化 商业 管理 经济 期刊
网络文化: 社会 红人 黑客 治理 亚文化
创业百科: VC 词典 指南 案例 创业史
前沿科技: 清洁 绿色 纳米 生物 环保
知识产权: 盗版 共享 学人 法规 著作
用户名: 密码: 注册 忘记密码?
    创建新词条
科技百科
  • 人气指数: 39724 次
  • 编辑次数: 1 次 历史版本
  • 更新时间: 2009-10-04
方兴东
方兴东
发短消息
相关词条
Novell被收购
Novell被收购
瑞途旅游管理软件
瑞途旅游管理软件
Scala
Scala
推荐词条
希拉里二度竞选
希拉里二度竞选
《互联网百科系列》
《互联网百科系列》
《黑客百科》
《黑客百科》
《网络舆情百科》
《网络舆情百科》
《网络治理百科》
《网络治理百科》
《硅谷百科》
《硅谷百科》
2017年特斯拉
2017年特斯拉
MIT黑客全纪录
MIT黑客全纪录
桑达尔·皮查伊
桑达尔·皮查伊
阿里双十一成交额
阿里双十一成交额
最新词条

热门标签

微博侠 数字营销2011年度总结 政务微博元年 2011微博十大事件 美国十大创业孵化器 盘点美国导师型创业孵化器 盘点导师型创业孵化器 TechStars 智能电视大战前夜 竞争型国企 公益型国企 2011央视经济年度人物 Rhianna Pratchett 莱恩娜·普莱契 Zynga与Facebook关系 Zynga盈利危机 2010年手机社交游戏行业分析报告 游戏奖励 主流手机游戏公司运营表现 主流手机游戏公司运营对比数据 创建游戏原型 正反馈现象 易用性设计增强游戏体验 易用性设计 《The Sims Social》社交亮 心理生理学与游戏 Kixeye Storm8 Storm8公司 女性玩家营销策略 休闲游戏的创新性 游戏运营的数据分析 社交游戏分析学常见术语 游戏运营数据解析 iPad风行美国校园 iPad终结传统教科书 游戏平衡性 成长类型及情感元素 鸿蒙国际 云骗钱 2011年政务微博报告 《2011年政务微博报告》 方正产业图谱 方正改制考 通信企业属公益型国企 善用玩家作弊行为 手机游戏传播 每用户平均收入 ARPU值 ARPU 游戏授权三面观 游戏设计所运用的化学原理 iOS应用人性化界面设计原则 硬核游戏 硬核社交游戏 生物测量法研究玩家 全球移动用户 用户研究三部曲 Tagged转型故事 Tagged Instagram火爆的3大原因 全球第四大社交网络Badoo Badoo 2011年最迅猛的20大创业公司 病毒式传播功能支持的游戏设计 病毒式传播功能 美国社交游戏虚拟商品收益 Flipboard改变阅读 盘点10大最难iPhone游戏 移动应用设计7大主流趋势 成功的设计文件十个要点 游戏设计文件 应用内置付费功能 内置付费功能 IAP功能 IAP IAP模式 游戏易用性测试 生理心理游戏评估 游戏化游戏 全美社交游戏规模 美国社交游戏市场 全球平板电脑出货量 Facebook虚拟商品收益 Facebook全球广告营收 Facebook广告营收 失败游戏设计的数宗罪名 休闲游戏设计要点 玩游戏可提高认知能力 玩游戏与认知能力 全球游戏广告 独立开发者提高工作效率的100个要点 Facebook亚洲用户 免费游戏的10种创收模式 人类大脑可下载 2012年最值得期待的20位硅谷企业家 做空中概股的幕后黑手 做空中概股幕后黑手 苹果2013营收 Playfish社交游戏架构

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

目录

[显示全部]

介绍编辑本段回目录

平台和许可证
Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。它也能运行于Java ME, CLDC(Java Platform, Micro Edition Connected Limited Device Configuration)上。[2]目前还有另一.NET平台的实现,不过该版本更新有些滞后。

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

Scala软件包中包含了编译器和库,以BSD许可证发布。

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

截至2009年9月,最新版本是版本2.7.6 。Scala 2.8预计的特性包括重写的Scala集合库(Scala collections library)、方法的命名参数和默认参数、包对象(package object),以及Continuation.

2009年4月,Twitter宣布他们已经把大部分后台程序从Ruby迁移到Scala,其余部分也打算要迁移。此外, Wattzon已经公开宣称,其整个平台都已经是基于Scala基础设施编写的。

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

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

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

由于JVM不支持尾调用,Scala也不能完全支持尾调用优化。不过,在简单的情况下,Scala编译器可以把尾调用优化成循环。[10]

以下代码以函数式风格实现了快速排序算法,可以与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 <- tail if i >= pivot) yield i)
   }

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

泛型类,
型变注释(Variance Annotation),
类型继承结构的上限和下限,
把类和抽象类型作为对象成员,
复合类型,
引用自己时显式指定类型,
视图,
多态方法。 

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

任何方法可用作前缀或后缀操作符,
可以根据预期类型自动构造闭包。
联合使用以上两个特性,使你可以定义新的语句而无须扩展语法也无须使用宏之类的元编程特性。

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

Groovy创始人James Strachan:Java面临终结 Scala将取而代之 编辑本段回目录

不要误解我的意思——我在过去的这十来年里写了无数的Java代码,并且坚信它相对C++和Smalltalk来说是一个巨大的进步(当然,很多其它语言也很有帮助,像JavaScript,Ruby,Groovy,Python等)。但是我还是一直期待着能有javac的替代者出现。我甚至还自创了一门语言(51CTO编者注:此处指Groovy)好让我暂时满足一下这种期望。

Java是一种令人惊叹的复杂语言(它的语法规范长达600页,我怀疑到底有没有人能真正理解它),它有自动装箱(Autoboxing),空指针异常(NPE)往往就是这时抛出的。其中的基本类型(primitive type),字符串/文字/缓冲器/集合类(collections)以及数组缺乏多态性,以至于处理任何数据结构都需要冗长的语法;而且,由于Bean 属性和对闭包支持的缺失(甚至在JDK 7里也仍然还不支持),这会让你的代码里充满了 try/catch/finally 这些语句(除非你使用框架和新的自定义API)。除了这些还有好多数不清的麻烦问题。Java倒是有类型推断(type inference)功能但却不用,使得我们要多输/读如此大量的代码。

这个问题在没有Java7后变得更加紧迫 (在Snorcle之后它变得更加重要:我不知道javac是不是要被jdkc 取而代之了?)。所以我猜javac可能已经走到了尽头,它看起来根本就没有什么进展或简化了。

那么,从长久来看,谁能取代javac 呢?当然,像Ruby,Groovy,Python,还有JavaScript这些动态语言在过去几年里很受欢迎——很多人喜欢他们。

我认为将来可能替代javac的就是Scala 。它实在太让我印象深刻了。我甚至可以诚实地说,如果有人在2003年把Martin Odersky,Lex Spoon以及Bill Venners写的那本《Programming in Scala》拿给我看了的话,那我根本就不会再去发明Groovy了。

那么,为什么我会看好Scala呢?Scala是静态类型的,它可以被编译成与Java同样快速的字节码,所以它的速度与Java不分上下(有时快一点,有时慢一点)。你可以看看 Scala 在与 groovy 或jruby一起进行测试时表现有多好。注意:速度并不是我们追求的唯一目标——有时候我们可能宁肯让代码慢上十倍,也要写得简洁一点;但是如果要取代javac,速度当然还是很重要的。

Scala已有类型推理(type inference)功能,因此它和Ruby/Groovy一样简洁,但是它完全是静态类型的。这是很有好处的,它使得理解代码、阅读代码以及编写文档都简单多了。在任何片段(token)/方法/符号上点击,你都可以跳转到相应的代码或文档中去浏览。不需要打那些怪异的补丁,也不用操心谁什么时候新增了一个方法——这对于那些需要一个团队一起长期开发的大项目是很有好处的。Scala似乎已经实现了动态语言(dynamic language)的那种简洁,而实际上它是完全静态类型的。所以,我根本不需要去记哪些魔术方法可用——或是在shell里运行脚本来查看这些对象—— IDE/编译器在你编辑代码时就已经知道这些了。

Scala已经提供了对高阶函数和闭包的支持,另外还支持序列解析(sequence comprehensions) ,这样你就可以很容易用Scala写出漂亮简洁的代码。Scala还把函数式和面向对象的编程思想很好地统一到了一种语言里,它比Java要明显简单一些(虽然它的类型体系(type system)和泛型(generics)需要花费差不同一个数量级的时间去理解,但是,它通常是框架开发者才需要考虑的问题,应用程序开发人员并不需要涉及)。它也使得从传统的面向对象/Java 编程模式向函数式编程的转变变得更加容易——这对于编写并行或异步程序的开发人员尤其意义重大(这是因为现在芯片的主频已经达到了数个GHz,很难再有提升了;而芯片集成的核心数则在快速增长。51CTO之前曾发布过哪种语言将统治多核时代 再看函数式语言特性一文,对于函数式语言在多核时代的潜力做了相当深入的分析)。你可以在最开始用面向对象的方法编程,然后当你需要它的好处时,就可以迁移到用不变状态 (immutable state)函数式编程正变得越来越重要,因为我们总是希望能把问题变简单,并且在一个更高的层次上解决它(如闭包,高阶函数,模式匹配,单子 (monad)等),同时我们还需要通过不变状态(immutable state)实现并发和异步。

Scala也有适当的混入(mixin)(特性(trait)) ,所以你不必去摆弄面向对象编程的缺陷来获得模块化的代码。如果你确实需要一些鸭子类型(duck typing),Scala甚至能为你提供构造类型(structural type)。

最让我印象深刻的一点就是它的核心语法极其精练简洁(它的语法手册只有大概Java的四分之一),但是其方式却更加强大和灵活,而且非常容易通过库来扩展,添加新的语义和功能。可以看看这个例子:Scala Actors。因此它非常适合用于创建嵌入式DSL或外部DSL 。有了它以后就真没必要再用Java,XPath ,XSLT,XQuery,JSP,JSTL,EL和SQL这些东西了——你可以在各种各样的场合使用DSL。

Scala确实需要花点时间去习惯——我承认第一次我看Scala时并不觉得顺眼——用了Java之后你就会习惯用一堆冗长的代码来做一点点事,刚开始时我们也都不会一看到几个符号就觉得有多惊讶。(我花了好长一段时间才习惯Scala里用_作“通配符”,因为在Scala里是用作标识符/方法)。

如果你一直在写Java,那么最开始确实会觉得Scala很不一样(如在声明方法/变量/参数时在类型或标识符上加上阶,虽然那样做的原因是为了能更方便地略去一多余的类型信息)。

例如,在Java中的写法:

   1. List< String> list = new ArrayList< String>()

在Scala中的写法:

   1. val list = new List[String]

或者,如果你要指定确切的类型的话:

   1. val list : List[String] = new List[String]

但是如果你坚持用上一段时间,Scala优美的一在很快就显现出来。它对Java里的许多地方进行了简化,让你可以用非常简洁的代码就描述出意图,而不用花上大段代码去实现细节——同时还为你提供了一条迁移到函数式编程的不错途径,这对于编写并发和分布式程序是非常有利的。

我强烈建议你学习一下Scala:以开放的心态看看(当你的思维转过来后)你是否能发现它的美丽之处。

◆我强烈推荐由 Martin Odersky,Lex Spoon 和 Bill Venners编写的《Programming in Scala》 一书。它非常好地介绍了Scala的特点以及设计时的选择。这本书相当厚,但是你可以先跳着读,必要时再深入细节。

◆《O'Reilly Scala book》这本书我只跳着读了一点,但是看起来也非常不错。

◆如果你想在短时间内就知道个大概语法,那么可以看看《Tour of Scala》。不过看了之后你也还得花上一些时间来真正理解为什么它跟Java会有这样那样的不同。

◆Martin Odersky 的JavaOne 2008上关于Scala的演说

◆Jonas Bonér在 Real-World Scala上作的报告

◆Gert's的 对他如何创建 Apache Camel DSL for Scala 的介绍

◆用于JDBC类型安全查询的一个Scala版LINQ,顺便再了解下DBC。

◆一份非常不错的报告,介绍了把 Scala 和 OSGi 与DSL结合使用

◆如何使用 Scala和XML ( 语言里已经自带了处理XML,XPath , XSLT, XQuery的简洁语法)

◆Scala的例子

◆Scala快速参考表

◆这个例子显示了如何 创建的bean风格的属性 (或C #风格的getter函数)

◆创建一个 用Lift实现的聊天演示程序 或查看 Lift网站上的更详细介绍

如果你还有一些空余时间的话,这些视频资料也非常不错

◆Bill Venners所发表的The Feel of Scala

◆Lex Spoon所作的Scala: 把未来的语言带到JVM里来

好用的Scala框架和库

◆liftweb :Scala的rails

◆语言规范和ScalaTest for BDD 以及其它一些入门测试(literate testing)能让你体会到类型安全的DSL对于编写IDE友好 的简洁代码有多大帮助。

◆scalaz 是一个很有用的例程库。

◆用HTTP /JSON服务进行调度

另外,顺便说一下,对于那些像我一样一喜欢JAXRS的,现在可以通过jersey-lift模块使用lift模板和Jersey了。

作为这的实例,你可以看看RestMQ,这是一个我最近也参与了的开源项目,它旨在为面向消息的中间件提供REST风格的API和Web控制台,它也是基于JAXRS(Jersey),Scala,Lift构建的。

至于开发工具方面,有Ant/Maven插件,它带有一个交互式Scala控制台(REPL)和一个用于IDEA的IDE插件,还有 Eclipse,NetBeans,以及TextMate,Emacs这些通用编辑器,都可以供你选择。在IDE插件的丰富程度上与Java还是有差距的,但是这些工具所提供的代码导航和自动补全功能还是很有用的。

我试用过NetBeans,Eclipse和IDEA这几个IDE上的插件,它们都各有优劣。看起来,Scala的追随者也因为这些工具分裂成了几派。如果要代码导航和自动补全,那我发现IDEA非常不错。当你打开一个Maven pom.xml,它好像就能非常好地自动解析代码,找出Scala源,那样你就能很方便地在任意的类型/方法以及它们对应的文档/源代码中跳转浏览。(通常你必须在运行/调试任务里手动添加Scala)。不过IDEA在错误代码高亮上并不是最好的。在作上一些弥补后,它们都能变得与对应的Java工具一样好用。试试这几个工具吧,找出你最习惯的那个。

Scala Nit

任何一种语言都有你喜欢的一面,也有你不是那么热衷的一面。Scala给你的最初印象可能确实是符号太多了点,但是你并不需要使用所有的这些符号 ——如果你喜欢的话,你可以继续沿用很多Java里的东西。但我想到了那个时候最好还是用符号来实现“特殊任务”以避免标识符冲突。

我对嵌套的引入声明不太感冒,使用_root_.java.util..List来把一个”全局“引入和相对引入区别开来。我还更愿意使用子引入。例如,如果你引入了com.acme.cheese.model.Foo,然后,为了引入model.impl.FooImpl,我就更喜欢用一个明确的相对前缀,就像:import _.impl.FooImpl。这对简化任务有一些好处,对于保持和Scala的简洁性就更有帮助了。

然而,和Java里大把的毛病相比,再考虑到Scala的优美,简洁和强大,Scala的这一些负面因素和根本不算什么了。

结语: 

既然  MrJava(Adam Bien),MrJRuby(Charles Nutter) 和 MrGroovy(作者本人) 都认为Scala将会是javac的的替代者,那肯定是有些原因的。那你还在等什么呢?赶快去买《Programming in Scala》 或 《O'Reilly Scala book》一探究竟吧!

这篇博文发布后,立刻有很多Scala,Groovy和Java开发者进行了回复。Scala的创始人Martin Odersky也对这篇文章发表了自己的赞赏之词。以下是Martin的留言:

James,感谢你的认可!这对我来说意义重大。我相信,如果我们一起努力向Java开发者们展示现在在JVM上更加美好的语言选择,我们大家都会因此而得到好处。感谢你在这方面带了个好头。

根据我对Groovy的了解(很可惜的,我的了解没有你了解Scala那样多),它看起来并非是意图填补同一块领域的。Groovy的吸引力在于它是一个语法接近Java的动态脚本语言。Scala的吸引力在于它是一个强类型的,静态的,结合函数式和面向对象的语言。

此外还有很多精彩的评论,51CTO译者对这些评论进行了一些筛选,挑出部分翻译如下:

Scala的体验

去年,我在做一些调查项目时把Scala引进到了我的小Java车间里。

如今Scala成为了我们最主要的编程语言。

通过使用Scala,我们现在可以构建类型系统(type system),跟踪总结以前所做项目的经验教训,并用它来替代我们过去以模型为导向(model-driven)的开发方式。然后,我们利用函数分发 (pass around functions)的特性来改进组件的参数化。

总之,对于建立可重用的组件,Scala提供了一套比Java更好的机制。

C#和Java?

我觉得你可以去看看C#。它解决了你在Java中遇到的许多问题。如果你不喜欢微软的话,就可以试试.NET的开源替代版本Mono。

有关Scala和F#

其实,在.NET平台里与Scala对应的语言并不是C#,而是F#。不管什么时候,我都更倾向于使用Scala,而不是F#,原因如下:

1 )在F#文化里,面向对象看起来并不重要。在所有讲F#的书里,都必定有一章介绍类,然后,剩余部分就是专门讲解函数式。相比之下,Odersky在发明 Scala时,并没有照搬Java的这一套机制,而是通过对象类型、特性(trait)、增强的可见性规则(visibility rule)等概念扩展并超过了Java的这一套机制。Scala使得像我这样有根深蒂固面向对象思想的开发人员觉得很舒适,它提供的函数式语法特性让我可以用来把代码变得非常简洁。

2 )F#比Scala看起来更接近人类语言,初看起来这似乎是好事。不幸的是,由于开发者很少需要写类型说明(type annotation),大部分代码里也都没写,这就使得代码变得更加难于理解。在Scala里,至少要声明参数类型,而且最好也声明一个方法的返回类型,除了那些一目了然的情况。

3 )F#一直力求尽量往OCAML的语法靠拢,所以它在语法也真是没有什么创新之处。而Scala则是博取众长,吸纳了各种语言的优点。此外,它还让人感觉有些机制并不是必须的,而是为了让开发者更好地表达意图而加入的。通过加入隐式转换(implicit conversion),析取器(extractor)这些功能,Martin从我这里得到了很大的帮助。

4 )在我看来,Java程序员学会Scala比从C#到F#的过渡要容易得多。大体上来说,原因是Java程序员不需要花很大的代价入门,Scala可以直接被当作一门少了些模板(boilerplate)的Java使用。当程序员渐渐熟练后,他就可以开始发掘函数式编程的威力了。在其它任何的面向对象/函数式编程语言里我都找不出可以这样过渡学习的。

Groovy盖棺定论了?

James,我一直在留意你的博客,这篇文章写得棒极了,堪称高超。你发过一份声明说不会再继续把Groovy开发得更强大了(51CTO编者注:James Strachan在写这篇博文之前很久已经离开了Groovy开发团队),这份声明影响力很大,而且几乎可以说是给Groovy盖棺定论了。

我们有一个面向最终用户的数据处理软件,然后我们选择的是Groovy (而没用Jython和JRuby )来作为实现各种功能扩展(从对变量编写公式到编写脚本)的途径。你们在开发Groovy所写的代码很多都是粘合代码(glue code)(对核心语言起补充作用)。我们充分利用Groovy所支持的这些特性与MS Office产品和Web服务进行整合。我真的希望,如果你们的开发团队更中意Scala的话,也请尽量让我们到时候在Scala里也能用上这些有用的库。

James Strachan对上文的回复

我不认为任何一种主要的JVM语言会消失,肯定会一直有一大帮人继续维护Groovy, Jruby, Cojure, Jython, Rhino等。

JVM中最大的一点好处就是这些语言很容易共存,重用另一种语言的代码也非常容易。因此,只要相信大众的选择,就不用担心会选错开发语言。

而且我也并不认为Scala会是Ruby/Groovy/Fan这些动态语言的替代者;大多数情况下性能还是很重要的。对于一个快速、静态类型的编译器来说,过去Java显然是第一选择——但是现在,Scala才是首选——这是因为Java已经显出老态了。(它可能永远也不会支持闭包,永远也不会考虑支持类型推断等新特性)。

自从发现了类型推断的威力之后,我实际上越来越觉得动态类型(就是很简洁的代码实现功能)的动机变得越来越难以琢磨了。比如说,你可以用Scala 写一些脚本,它就会像Ruby/Groovy一样进入”读取-执行-打印 循环“(Read-Evaluate-Print Loop, REPL)。

但是我发这篇文章的目的并不是要挑起Scala拥护者和Ruby/Grovy/Clojure/JavaScript这些动态语言支持者之间的战争 ——我只是想让被Java一叶障目的开发者们意识到,这个世上已经有了比Java更好的静态类型语言:这门语言有他们所想要的全部功能(还附带有Java 最需要增强的功能)。所有这一切,都能在这门语言里用简洁、优美的代码表示出来(尽管这门语言和Java确定有些不太一样,并且需要你经历一个学习曲线)。

Scala创始人:创造比Java更好的语言编辑本段回目录

Scala是一种针对 JVM 将函数和面向对象技术组合在一起的编程语言。Martin Odersky创建这个语言之时,希望它能够解决Java语言中的一些问题。Scala现在还相对比较小众,但也已经拥有了相当忠实的拥护群体。

近日,Scala语言的创始人Martin Odersky接受了Artima的一系列访谈。Martin Odersky在2001年开始创立Scala语言,最初的动机是因为对Java的一些特性感到不满,想要创建一个比Java更高级的语言。他基本达到了这个目的:Scala成为了Java的首选替代之一。如果你对Scala语言还不太了解,可以参考Scala编程语言简介。

本文是访谈的第一个系列。在这部分节选的内容中,Martin Odersky详细的描述了他创建Scala的前因后果:他是如何创建这个基于JVM和Java类库的、不同于Java的语言的。

Scala创始人Martin Odersky

因编译器而着迷

Artima:让我们从头开始。您是如何开始介入编程语言的?

Martin Odersky:我最喜爱的科目一直都是编译器和编程语言。1980年,当我在读大学的时候,第一次接触编译器,我就马上想自己建立一个编译器。那时候我唯一可以买得起的电脑是Sinclair ZX 80,它只有1KB的RAM 。幸运的是,不久后我有了一个性能更强大的机器Osborne-1,它是世界上第一款“便携式”(笔记本)电脑,看上去就像一个倾斜90度的缝纫机。它有一个5英寸的显示屏,每行显示52个字符。但它有一个56KB可用的RAM以及两个90K的软盘驱动器。

在那些日子里,我花了一些时间与我大学里的另一名学生Peter Sollich一起研究。我们一起了解了一种新语言Modula-2,我们发现它非常棒,而且设计良好。因此,我们计划编写一个适用于8位Z80计算机的Modula-2编译器。但是出现了一个小问题,Osborne附带的唯一语言是Microsoft Basic,这完全不适合我们的想法,因为它甚至不支持带参数的程序,只能使用全局变量。而当时的其他编译器对于我们来说又都太昂贵了。因此,我们决定采用经典的bootstrapping(引导)技术。Peter使用Z80汇编语言为一个小小的Pascal子集编写了第一个编译器。然后,我们不断改进这个编译器,使它能够逐渐编译稍微大量的语言。经过几代版本后的改进,直到我们可以编译所有的Modula-2语言。它可以产生解释后的字节码以及Z80二进制码。该字节码是当时所有系统中最简洁的,其二进制版本是当时8位机上最快的。我们的这个编译器在当时看来是能力相当不错的系统。

我在我们即将要完成我们的编译器之前,Borland带着其Turbo Pascal横空出世,同时正在考虑入主Modula-2市场。事实上,Borland决定购买我们的Modula-2编译器,并将以Turbo Modula-2的名字出售,适用于CP/M芯片,并想要开发其IBM PC版本,我们提议为他们编写IBM PC版本,但他们告诉我们,他们对于这个版本的开发已经做好了安排。但不幸的是,这个版本的开发周期远远超出了他们的计划。3、4年后,其编码实现小组从公司中独立出来,并推出了TopSpeed Modula-2。在没有IBM PC版本时,Borland继Turbo-Modula-2之后就再也没有任何市场竞争力了。

(这个曾经的开发巨头Borland于日前陨落。详情可参考Borland传奇终结 被英国软件商7500万美元收购)

当我们完成Modula-2编译器时,Borland提议要雇用Peter和我。于是Peter去加入了他们的行列。我曾经也想这样做,但有个问题是,我仍然还有一年的课程没有读完,而且还要计划读硕士。当时我很受诱惑,甚至想过退学。但最后,我决定坚持读完大学。之后,在做硕士项目期间(有关增量分析的课题),我发现我更喜欢做研究。于是最终我放弃了加入Borland编写编译器的想法,而是继续在苏黎世ETH攻读Niklaus Wirth的博士,Niklaus Wirth是Pascal和Modula-2的发明者。

为了更好的Java而努力

Artima:Scala是如何出现的?Scala的发展史是什么样的?

Martin Odersky:在我的苏黎世生活快要结束的时候,大概是1988到1989年,我开始非常喜欢函数式程序设计。于是,我一直留在那里做研究,最终成为一名德国卡尔斯鲁厄的大学教授。我最初的工作偏向于编程的理论方面,比如call-by-need lambda(惰性λ)演算。这项工作是同Phil Wadler共同进行的,他当时在格拉斯哥大学。有一天,Phil告诉我,他的研究组里一个很勤奋的助教听说有一种新的语言要被推出,目前这种语言仍处于alpha版本阶段,语言的名字为Java。这个助教告诉Phil:“看看这个Java,它所具有的灵活性。它拥有字节码,它可以运行在网络上,它具有垃圾收集功能。这个Java将要毁灭你们。你们准备怎么应对?” Phil说,是的,也许他说的有些道理。

对此的回应就是,Phil Wadler和我决定从函数式程序设计中提取出一些想法,并把这些想法转移到Java空间。这一努力成就了一个新语言Pizza,它具有函数式程序设计的三个特点:泛型、高阶函数以及模式匹配。Pizza最初发布于1996年,是在Java发布的一年之后。Pizza是比较成功的,因为它表明,我们可以在JVM平台上实现函数式语言的特性。

然后,我们接触了来自Sun核心开发团队的Gilad Bracha和David Stoutamire。他们说:“我们对你们一直所研究的泛型非常感兴趣,让我们一起做一个关于泛型的项目吧。”那就是GJ(泛型Java)。因此,我们于1997/98年开发了GJ,6年后,对它进行一些补充,使之成为了Java 5中的泛型功能。特别是,补充了由Gilad Bracha和奥胡斯大学的人们一起独立开发的Java泛型通配符。

虽然我们的泛型扩展被搁置了6年,但Sun公司对于我为GJ所开发的编译器表现出了浓厚的兴趣。经证明,我所写的编译器比他们的第一个Java编译器更稳定、更易于维护。因此,他们决定从2000年推出的1.3版本开始,将GJ编译器作为其标准的Javac编译器。

然后,为了比Java更好的语言

Martin Odersky:现在,经过Pizza和GJ的经历,我有时会感到沮丧,因为Java是一个具有非常强的约束的语言。因此,很多事情都不能像我想象的那种方式那样去做——那种我原本确信是正确的方式。所以本来,本质上我的工作是集中于让Java变得更好,但在那之后,我决定,现在是时候应该后退一步看看了。我想要从零开始,看看我能否可以设计出一些比Java更好的东西。但与此同时,我知道我不能从零开始。我需要借助一个现有的基础架构,否则这只是不切实际地引导自己去无中生有,没有任何类库、工具等等。

所以我决定,即使我想要设计出一种不同于Java的语言,始终还是要借助Java的基础架构——JVM和它的类库。这就是我的想法。我认为在那个时候,这是一个很好的机会,那时候我正在洛桑联邦理工大学担任教授,这为我提供了一个极好的独立研究的环境。我可以组建一个小型研究组。

开始的时候,我们非常激进。我们想要在一个现有的非常好的模型上创建一些东西,该模型为join calculus(连接演算)。我们创建了一个连接演算的面向对象版本Functional Nets,以及一种新语言Funnel。但是,又过了一段时间,我们发现,Funnel是一个非常纯粹的语言,并不一定很实用。Funnel是建立在一个非常小的内核之上。很多人们通常认为理所当然的事情(如类,或模式匹配)都只能通过编码到内核才能实现。从学术的角度来看这是一项非常优雅的技术。但运用于实际它就并不那么好。初学者觉得这种必要的编码相当困难,而高手们却觉得不得不一次又一次地编码非常无聊。

因此,我们决定再次从头开始,并做一些介于Funnel(非常纯粹的学术语言)和GJ(非常实用但却存在一些限制的语言)中间的技术。我们希望创造一些能够实用和有价值,同时又比Java高级的东西。在大约2002年时,我们开始着手进行这种语言,称之为Scala。首次公开发布是在2003年。相对比较大规模的一次重新设计是在2006年初。从此,它开始稳步成长。

更好的Java受到的约束

Artima:您说您那时候感到很沮丧,遇到一些约束,需要向后兼容Java。您能否提供一些遇到约束的具体的例子?

Martin Odersky:在泛型设计中,有很多非常强硬的约束。其中最强、最难以应付的是,它必须充分地向后兼容非泛型Java。Collections类库只停留在1.2版本,而且仅仅因为泛型的出现,Sun不准备推出全新的Collections类库。因此,只能完全透明工作。(有关Collections类库的更多内容,可参考这篇基于JDK 5.0一些collection类的使用总结,以及《Java语言的科学与艺术》一书中的Collection层次结构章节。)

这就是为什么总会存在一些相当难看的东西。你总是不得不使用具有泛型类型的非泛型类型,即所谓的raw(原始)类型。还有,你不能改变数列行为,否则就会有未经检查的警告。最重要的是,你不能利用数组做你想做的很多事情,比如生成一个具有类型参数的数组。后来在Scala,我们知道了实际上能如何实现这些事情,但是这可能仅仅是因为我们给Scala设置的条件是协变数组。

Artima:您能否就Java的协变数组详细说明一下该问题?

Martin Odersky:当Java刚出现时,Bill Joy和James Gosling以及其他Java组成员都认为,Java应该有泛型,只是他们没有足够的时间做出详细设计。所以由于Java中没有泛型,至少最初阶段没有,他们就认为,数组不得不是协变的。例如,这意味着一个字符串(String)数组是一个对象(Object)数组的子类型。其原因是他们希望能够重写,比如,一个“通用”排序方法,采用了一个对象数组和一个用来排序该数组的比较器,然后让你传送一个字符串数组的参数给它。通常情况下这属于类型不健全。这就是为什么在Java中你会获得一个数组存储例外。这实际上也证明,这种同样的事情引起了对于数组泛型实现的需求。这就是为什么在Java中泛型并不好使。你不能定义一个字符串的列表数组,这是不可能的。你只能被迫使用难看的原始类型,永远都只能是一个列表数组。因此,这有点类似原罪。他们对此做出了非常迅速的回应,认为这是一个快速破解。但随后实际上每一个设计决定都被毁灭了。因此,为了不陷入同样的陷阱,我们不得不中断,并提出现在我们将不向上兼容Java,我们也想做一些不同的事情。

编者后记

Scala到目前为止还是一个相对小众的语言,在TIOBE每月的排行榜上都在20到30之间浮动,与每月排名第一的Java在流行程度上仍有很大的差距。然而Scala在数年之间已经得到了越来越多开发者的关注,在国外的开发者讨论区中常常会看到有Scala的专区。Scala在现在以及未来的开发界绝对是一个不可忽视的语言。

Scala将成为现代Web 2.0的发起语言编辑本段回目录

一个 Twitter 的开发人员说过,Scala 将会成为现代 Web2.0 的发起语言。LinkedIn 也用这种语言。同样许多其他大的公司如 Sony Picture, EDF, SAP 也开始使用这种语言。

Scala 名字的含义

Scala 意为可扩展的(scalable)语言,意味着开始时很小但是可以长久发展。对于新接触 Scala 的人来说,它看起来也许像脚本语言。但是 Scala 并不是真正的脚本语言,这也不是 Scala 主要的特性。实际上,它能够做到 Java 能做到的一切事情并且能提供超出 Java 能力范围之外对于大系统的支持。Scala 设计的标准之一就是希望创造一种能够适于任何从小程序发展到大系统却不需要变更架构的语言。

Scala 的发展

90 年代 Martin Odersky 加入到开发 Java 语言和他的编译器。他和 Philip Wadler 研究员一起开发了最终成为泛型 Java( GJ ) 的 Pizza, 后来又加入到 Java 5 的开发中。Martin Odersky 一直从事编写 javac 编译器。GJ 的编译器也就是他们做的扩展,先于 SUN 公司接纳 GJ 到标准的 Java 中很长时间 —— 因为 SUN 公司先接纳了编译器。

1999 年 Martin Odersky 到瑞士从事一些更基础的课题工作。他开始尝试将面向对象和函数很好的结合起来。他们已经在 95/96 年在 Pizza 上做过尝试,但是只成功了一半,因为那时候他们将 Java 作为基础语言将要处理很多不精细的地方。Java 的扩展性并不理想。所以在 2000 初, Martin Odersky 和他的小组在 EPFL 开发了一门新语言能够和 Java 互操作但是能够有效地将面向对象和函数编程技术结合起来。

他所尝试的这些语言中,第一次被叫做 Funnel, 第二次的叫做 Scala. 第二次试验的结果非常漂亮,所以他们将其打包作为实验版发布,这样 Scala 就成为一个真实的语言产品供人们试用。他们将一些粗糙的边缘进行抛光,做了一些小的语法变化,重写了 Scala 的工具以确保 Scala 语言和它的工具能够维持大量的运用。他们在 2006 年发布了 Scala 第二版,然后它迅速地获得了人气。

结合面向对象和函数编程的优势

函数编程让你能够通过运用简单的部件构建你感兴趣的内容,因为它能够提供强有力的粘合力。函数以一种有趣的方式运用你程序的元素并且将他们和其他的元素进行粘合。函数编程的一个好处就是你能够想运用一个数据那样运用函数。一种几乎在所有编程语言中都能有典型的数据类型就是 ”int”: 你可以在任何地方申明一个 int 值,包括在一个函数中,你可以将它传递给一个函数,将它从一个函数中返回或者将它存储在一个字段中。这些特性提供给你一个构建自己结构的强有力的方式,定义真正高层级的库,或者去定义新的领域特殊语言(DSL)。

从另一个方面来说,面向对象编程提供了构建系统组件和变更复杂系统的优秀解决方式。继承和多态提供了灵活的方式去构建和组织命名空间。并且已经拥有比较好的编程工具,比如在 IDE(集成开发环境)中当打下一个点时弹出的用作提示有何种方法可用的上下文提示。

Scala 开发中的困难和解决方式

将面向对象和函数式编程结合存在的挑战是,如何将这两边有效的组织起来让他们看上去是一种语言而不是两种。因此如何将这两种编程方式中特性去除一部分成为重头戏。

如果将两种编程方式完整地结合,最终只可能得到的是交互很少的两种子语言。挑战在于,如何从两种构造中定义构造。举个例子来说,在函数编程语言中一个函数值对应于面向对象中的一个对象。你可以说,这是一个拥有 “apply” 方法的对象,因此我们能将一个函数值说成是一个对象。另外一个例子,函数编程中的基本代数类型可以对应成面向对象中的多重继承,Java 中静态字段和方法也存在同样的问题。因此,Scala用将其替换成单例对象的成员的方式消除这种冲突。像这样的例子还有很多,Scala 的开发团队正在致力于消除语言中类似的冲突并且统一构建成别的东西。

Scala 开发过程中遇到的最大的困难

开发编译器的技术是最大的挑战。有趣的是,这些困难更多的来自于面向对象这边。因为面向对象中高级的静态类型系统十分罕见,并且他们中没有一个是主流。Scala 比 Java 或者和 Java 类似的语言在类型系统上拥有更强的表现力,所以需要通过开发出一些新颖的类型和为组件构建更多抽象类来开辟新的领域.。这带来了一些开发 Scala工作的困难也带来了一些研究成果。

另一个困难的部分和交互有关。为了取得非常好的交互效果必须将 Java 中的一切都映射到 Scala 中。在想要将 Java 库完全映射到Scala 中和避免 Java 中的多重构造之间总是存在紧张的状况。这是一个永久的有挑战里的工程问题,虽然经过了不少的工作但是最终的结果还是令人满意。

Scala 设计的目的

为了将编程变成一种享受,Martin Odersky 和他的同事做了不少工作。Scala 尽可能多的移除了传统高级协议编程语言中类似于咒语的语法,Scala 拥有强大的表现力因此开发者可以以自己喜欢的方式来描述事情。Martin Odersky 在开发 javac 的时候就领悟到 Java 程序员需要做的多少无用功,很多样本是不需要的。

Scala 语言的灵活性是一件强有力的工具但是这也有两面性。它赋予了程序员书写自由的同时也赋予了避免错误的责任。从哲学的意义上来说,这是 Scala 和 Java 最大的不同之处。Java 拥有非常强的概念规范,因此任何一个 Java 程序都和周围其他任何一个 Java 程序非常相似,并且这样能够方便的进行程序员交替。但是 Scala 并没有这样的统一性,因为这是一门很有表现力的语言。

你可以用很多种方式书写 Scala 程序,如果你是一个刚刚开始 Scala 的 Java 程序员,你也可以写成 Java 程序那样。这让编程小组非常容易的迁移到 Scala, 并且将项目风险降低。程序员可以先在非关键的部分试用然后在他们觉得合适的时候再迅速的扩展到其他的部分。

同样你也可以把 Scala 程序写成完全的函数式风格,和 Java 程序一点也不像。通常这样的话,程序看起来会更简洁。这种方式带来的好处就是,你可以在 Scala 中构建类似于高层次的库的或者领域特殊语言(DSL)成你自己的俗语。通常你需要混合几种不同的语言或者配置标注来达到相同大的目的。所以最终,Scala的单语言做法会带来简单的解决方案。

Twitter 使用 Scala

Twitter 使用 Scala 作为后台编写语言最终运行良好。Twitter 已经持续增长,并且稳定性日益成为其增长的瓶颈,它使用 Scala 也是 Scala 语言的一次良好测试。当一个引人注目的网站比如 Twitter, 用了一个新语言,对于这个语言来说是一次酸性测试 —— 主要的问题会被迅速发现并且被强化出来。

还有一些其他的知名公司使用 Scala. Sony Picture Imagework 用 Scala 写它的中间层软件,欧洲最大的能源公司 EDF 在它的贸易部门用 Scala 构建合同模式。SAP 和 西门子在他们的开源 ESME 工具上用 Scala。这仅仅只是许多例子中的三个而已。

Scala 将成为现代 Web2.0 发起者

Twitter 并不是惟一一家使用 Scala 的公司,LinkedIn 也用 Scala.

Scala 提供了在稳定的高性能平台(Java 虚拟机)上生成的能力同时也是一门敏捷性语言。这一类型的语言也有其他的选择,例如 Jython, JRuby, Groovy 和 Clojure, 但是这些都是运行在 JVM 上的动态类型语言。

问题是对静态类型的设定是否习惯,这样问是因为这将在早些时候带来更多的问题,它给了你一个安全的重构网络,或者它帮助提高了性能。或者你需要一个完全动态的语言因为想用元程序做一个喜欢的东西。如果你偏向使用静态类型的语言,Scala 绝对是一个最适合的选择。

Scala 语言的特性

Scala 语言的特性有许多,例如高阶函数和对象、抽象类型绑定,actor 使得函数在 Scala 中能是一个子类成为可能,Scala 中的设计模式使得面向对象和函数编程无缝结合。

Scala 的发展方向

Scala 的下一个版本 Scala 2.8 将致力于高性能的数组操作,重新界定集合和快速永久的数据结构等。Scala 2.8 将在今年的下一个季度发布。

长久来看,Scala 对并发和并行有兴趣,因此正在支持多核处理器和其他并行系统上寻找新的道路。Scala 已经有一个受欢迎的 actor 系统,它能够高水平的表现并发,这已经在 Twitter 的消息传递上已经得到证实。有趣的事情是,actor 并不是 Scala的语言特性,它完全是 Scala 的一个库。这是 Scala 灵活性的良好的见证者:只要用对了原语和库中的抽象,你可以在程序中编写像语言特性的东西。

Scala 将在数据并发和流编程上提供和 actor 一样良好的表现。在未来我们极有可能需要一些并发抽象来利用多核因为不同的并行和并发情况需要不同的工具。Scala 库的基础的做法正是与此相关,因为它让我们将混合和匹配的概念实现成为类和对象,这样能够快速前进而不是将所有的这些都放入一个语言和一个编译器。在未来的 5 年内,Scala 都将致力于此。

Java以外的选择 Scala编程语言简介编辑本段回目录

摘要:在历史上,Java平台一直属于面向对象编程的领域,但是现在Java 语言的坚定支持者也开始注意应用程序开发中的一种新趋势:函数编程。在这个新的系列中,Scala抓住了很多开发者的眼球,Scala是一种针对 JVM 将函数和面向对象技术组合在一起的编程语言。在本文中,将向你简单介绍编程语言——Scala。

Scala编程语言近来抓住了很多开发者的眼球。如果你粗略浏览Scala的网站,你会觉得Scala是一种纯粹的面向对象编程语言,而又无缝地结合了命令式和函数式的编程风格。

Christopher Diggins认为:不太久之前编程语言还可以毫无疑义地归类成“命令式”或者“函数式”。Scala代表了一个新的语言品种,它抹平了这些人为划分的界限。

根据David Rupp在博客中的说法,Scala可能是下下一代Java。这么高的评价让人不禁想看看它到底是什么东西。

一种可伸缩语言

Scala 的名称表明,它还是一种高度可伸缩的语言。

Scala 是一种函数对象混合的语言,具有一些强大的优点:

◆ 首先,Scala 可编译为 Java 字节码,这意味着它在 JVM 上运行。除了允许继续利用丰富的 Java 开源生态系统之外,Scala 还可以集成到现有的 IT 环境中,无需进行迁移。

◆ 其次,Scala 基于 Haskell 和 ML 的函数原则,大量借鉴了 Java 程序员钟爱的面向对象概念。因此,它可以将两个领域的优势混合在一起,从而提供了显著的优点,而且不会失去我们一直依赖的熟悉的技术。

◆ 最后,Scala 由 Martin Odersky 开发,他可能是 Java 社区中研究 Pizza 和 GJ 语言的最著名的人,GJ 是 Java 5 泛型的工作原型。而且,它给人一种 “严肃” 的感觉;该语言并不是一时兴起而创建的,它也不会以同样的方式被抛弃。

Scala有几项关键特性表明了它的面向对象的本质。例如,Scala中的每个值都是一个对象,包括基本数据类型(即布尔值、数字等)在内,连函数也是对象。另外,类可以被子类化,而且Scala还提供了基于mixin的组合(mixin-based composition)。

与只支持单继承的语言相比,Scala具有更广泛意义上的类重用。Scala允许定义新类的时候重用“一个类中新增的成员定义(即相较于其父类的差异之处)”。Scala称之为mixin类组合。

Scala还包含了若干函数式语言的关键概念,包括高阶函数(Higher-Order Function)、局部套用(Currying)、嵌套函数(Nested Function)、序列解读(Sequence Comprehensions)等等。

Scala中常用的一些设计模式:

◆ Singleton(单体模式)

◆ Strategy(策略模式)

◆ Factory(工厂模式)

◆ Vistor(访问者模式)

◆ Decorator(装饰模式)

与许多最近开始在 Java 平台上占有一席之地的动态语言不同,Scala 是静态类型的,这就允许它提供泛型类、内部类、甚至多态方法(Polymorphic Method),正如 Java 代码一样。但是,与 Java 平台不同,Scala 大量利用了类型推断(type inferencing),这意味着,编译器深入分析代码以确定特定值的类型,无需编程人员干预。类型推断需要较少的冗余类型代码。另外值得一提的是,Scala被特意设计成能够与Java和.NET互操作。Scala当前版本还不能在.NET上运行(虽然上一版可以-_-b),但按照计划将来可以在.NET上运行。

大量的其他函数功能(比如模式匹配)已经被引入到 Scala 语言中,但是将其全部列出超出了本文的范围。Scala 还添加许多目前 Java 编程中没有的功能,比如操作符重载(它完全不像大多数 Java 开发人员所想象的那样), 具有 “更高和更低类型边界” 的泛型、视图等。与其他功能相比,这些功能使得 Scala 在处理特定任务方面极其强大,比如处理或生成 XML。

Scala可以与Java互操作。它用scalac这个编译器把源文件编译成Java的class文件(即在JVM上运行的字节码)。你可以从Scala中调用所有的Java类库,也同样可以从Java应用程序中调用Scala的代码。用David Rupp的话来说,它也可以访问现存的数之不尽的Java类库,这让(潜在地)迁移到Scala更加容易。

这让Scala得以使用为Java1.4、5.0或者6.0编写的巨量的Java类库和框架,Scala会经常性地针对这几个版本的Java进行测试。Scala可能也可以在更早版本的Java上运行,但没有经过正式的测试。Scala以BSD许可发布,并且数年前就已经被认为相当稳定了。

说了这么多,我们还没有回答一个问题:“为什么我要使用Scala?”Scala的设计始终贯穿着一个理念:

创造一种更好地支持组件的语言。(《The Scala Programming Language》,Donna Malayeri)

也就是说软件应该由可重用的部件构造而成。Scala旨在提供一种编程语言,能够统一和一般化分别来自面向对象和函数式两种不同风格的关键概念。

藉着这个目标与设计,Scala得以提供一些出众的特性,包括:

◆ 面向对象风格

◆ 函数式风格

◆ 更高层的并发模型

Scala把Erlang风格的基于actor的并发带进了JVM。开发者现在可以利用Scala的actor模型在JVM上设计具伸缩性的并发应用程序,它会自动获得多核心处理器带来的优势,而不必依照复杂的Java线程模型来编写程序。

◆ 轻量级的函数语法

a. 高阶

b. 嵌套

c. 局部套用(Currying)

d. 匿名

◆ 与XML集成

a. 可在Scala程序中直接书写XML

b. 可将XML转换成Scala类

◆ 与Java无缝地互操作

Scala的风格和特性已经吸引了大量的开发者,比如Debasish Ghosh就觉得:我已经把玩了Scala好一阵子,可以说我绝对享受这个语言的创新之处。

总而言之,Scala是一种函数式面向对象语言,它融汇了许多前所未有的特性,而同时又运行于JVM之上。随着开发者对Scala的兴趣日增,以及越来越多的工具支持,无疑Scala语言将成为你手上一件必不可少的工具。

参考文献编辑本段回目录

→如果您认为本词条还有待完善,请 编辑词条

词条内容仅供参考,如果您需要解决具体问题
(尤其在法律、医学等领域),建议您咨询相关领域专业人士。
0

标签: Scala

收藏到: Favorites  

同义词: Scala语言

关于本词条的评论 (共0条)发表评论>>

对词条发表评论

评论长度最大为200个字符。