科技: 人物 企业 技术 IT业 TMT
科普: 自然 科学 科幻 宇宙 科学家
通信: 历史 技术 手机 词典 3G馆
索引: 分类 推荐 专题 热点 排行榜
互联网: 广告 营销 政务 游戏 google
新媒体: 社交 博客 学者 人物 传播学
新思想: 网站 新书 新知 新词 思想家
图书馆: 文化 商业 管理 经济 期刊
网络文化: 社会 红人 黑客 治理 亚文化
创业百科: VC 词典 指南 案例 创业史
前沿科技: 清洁 绿色 纳米 生物 环保
知识产权: 盗版 共享 学人 法规 著作
用户名: 密码: 注册 忘记密码?
    创建新词条
科技百科
  • 人气指数: 6566 次
  • 编辑次数: 1 次 历史版本
  • 更新时间: 2009-10-04
方兴东
方兴东
发短消息
相关词条
戴夫·海厄特
戴夫·海厄特
最佳编程语录大全
最佳编程语录大全
程序员笑话大全
程序员笑话大全
下一代程序员
下一代程序员
女程序员
女程序员
彼得·诺维格
彼得·诺维格
Russ Cox
Russ Cox
15名程序员界性感的奇葩
15名程序员界性感的奇葩
Mike Kruzeniski
Mike Kruzeniski
Jeff Fong
Jeff Fong
推荐词条
希拉里二度竞选
希拉里二度竞选
《互联网百科系列》
《互联网百科系列》
《黑客百科》
《黑客百科》
《网络舆情百科》
《网络舆情百科》
《网络治理百科》
《网络治理百科》
《硅谷百科》
《硅谷百科》
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社交游戏架构

Martin Odersky 发表评论(0) 编辑词条

Martin Odersky在2001年开始创立Scala语言,最初的动机是因为对Java的一些特性感到不满,想要创建一个比Java更高级的语言。他基本达到了这个目的:Scala成为了Java的首选替代之一。

Martin Odersky (born 5 September 1958) is a professor of programming methods at the EPFL. He specialises in code analysis and programming languages.

He designed the Scala programming language and Generic Java.

He was programme Chair of ECOOP 2004. In 2007 he was inducted as a Fellow of the Association for Computing Machinery.

个人主页:http://lampwww.epfl.ch/~odersky/

目录

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

标签: Martin Odersky

收藏到: Favorites  

同义词: 暂无同义词

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

对词条发表评论

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