「一场值回票价的演讲」将重现QCon? 了解详情
写点什么

为什么选择 Scala?

  • 2008-01-10
  • 本文字数:2172 字

    阅读完需:约 7 分钟

在回答“为什么选择 Scala?”这个问题之前,我们首先需要回答“什么是 Scala?”。从 Scala 网站上,可以找到如下概述:

Scala 是一门现代的多范式编程语言,志在以简练、优雅及类型安全的方式来表达常用编程模式。它平滑地集成了面向对象和函数语言的特性。 - Scala 是面向对象的:Scala 是一个纯面向对象语言,在某种意义上来讲所有数值都是对象。对象的类型和行为是由 class 和 trait 来描述的。Class 的抽象可由子类化和一种灵活的基于 mixin 的组合机制(它可作为多重继承的简单替代方案)来扩展。

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

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

  • Scala 是可扩展的:Scala 的设计承认了实践事实,领域特定应用开发通常需要领域特定语言扩展。Scala 提供了一个独特的语言组合机制,这可以更加容易地以类库的形式增加新的语言结构:

    • 任何方式可以被用作中缀(infix)或后缀(postfix)操作符
    • 闭包按照所期望的类型(目标类型)自动地被构造

    两者结合使用可方便地定义新语句,无需扩展语法,也无需使用类似宏的元编程工具。

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

对于某些开发者来说,这些刺激已足以引诱他们脱离 Java 进入 Scala 世界。但对另外一些开发者来说,它们并没有为 Java 世界里当前正在演绎的日复一日的编程活动提供更多好处。

在一篇名为“Scala:集 Ruby 和 Java 之所长”的博文中,Ian 讲述了或许不应在 Java 和 Scala 之间做出选择,相反,相对于选择其它语言如 Ruby,选择使用 Java 和 Scala 的混合物是的另一种选择:

许多开发者热爱 Ruby,不过他们不能从中获取足够的东西。它可能是最具侵略性的语言之一,因为 Java 才是第一个到场的。人们总是引证 Ruby 的灵活而可扩展的语法、闭包等特性,以及其代码如何简明和具有表现力。

例如,你可以用一个简单语法创建一个 Map(Ruby 称之为“hashes”,尽管 hashtable 只是 map 一种可能的实现方式),如:

numberMap = {"one" => 1, "two" => 2, "three" => 3}Java 与之对等的语句显得颇为冗长:

Map<String, Integer> numberMap = new HashMap<String, Integer>(); numberMap.put("one", 1); numberMap.put("two", 2); numberMap.put("three", 3);那么 Scala 怎么样呢?让我们看看 Scala 中 map 的例子:

var numberMap = Map("one" -> 1, "two" -> 2, "three" -> 3)你会注意到它看上去非常类似等价的 Ruby 代码,但是这儿有一些重要区别。特别是,就像 Java,Scala 编译器知道 numberMap 使用 String 作为键,Integer 作为值。与 Java 不同的是,你无需告知,它本身就能领会这一点!这称为“类型推理(type inference)”。

这意味着如果你试图给 numberMap 增加一个新的键值对,但是要使用 Integer 作为键,String 作为值,Scala 将在你试图编译它时立刻报错(或者你的 IDE 将立刻警告你)。使用 Ruby,只有当你运行你的软件并试图从该 Map 中找回该键和值时,得到的分别是 Integer 和 String 而不是所期望的 String 和 Integer,这时才会导致报错。

过分强调编译时类型检查节省多少多少时间是困难的,但它消除了所有类在执行时将会产生的 bug。Scala 给你带来了这一好处,而且代码并不繁琐。

为更进一步在一个小例子中展现代码量的缩减,Ted Neward 研究了开发同一个类,用 Java、C#、Virual Basic、Ruby 和 Scala 的区别。请参考其博文 Scala pt 2:简短

Ian 继续指出:

Scala 还有一连串其它好的 Ruby 特性(Java 所缺乏的),包括闭包,以及非常适合“领域特定语言”的可塑性语法。它拥有所有这些特性,而且结合了静态类型好处。

David MacIver 在其博文说正经的,为什么选择 Scala?中分享了他对于面向对象编程、面向模块编程、静态类型、函数编程以及该语言中他所喜欢的未言明特性的观点。他补充道:

Scala 离完美还差得远。它有一些语法缺陷,一些由 Java 带来的问题,一个有适度问题的编译器以及一堆你记不住的琐碎特性和边界情况(edge case)。然而,我发现这些问题除了烦你之外并不真正产生什么后果。如果只是想坐下来书写好的代码,该语言的核心是强大的和非常有用的。

为了提供一个均衡的观点,David 在其博文中接着探讨了为什么不选 Scala ,文中他阐述了一些边界情况(edge case)。作为总结,David 有如下评论:

总而言之,我发现这些只是增加了一些烦心事。它仍是我最喜欢的 JVM 语言,但是你的看法将取决于你怎样搁置那些对你来说可能是更重要的需要优先考虑的事情。

为了展现 Scala 是一门不断成熟的语言, Programming in Scala 一书很快将会出版。如果等不及,Artima 网站上有该书 PDF 格式的预印版。

做出自己的决定,或想学习更多关于 Scala 内容,请关注他们的网站

查看英文原文: Why Scala?

2008-01-10 21:137928
用户头像

发布了 150 篇内容, 共 44.9 次阅读, 收获喜欢 10 次。

关注

评论

发布
暂无评论
发现更多内容

冬奥金牌冲击!为冬奥助力加油!

InfoQ写作社区官方

话题讨论 冬奥会 热门活动

凡泰极客积极参与信通院“5G消息应用数据安全标准”落地工作

FinClip

5G消息 中国信通院

利用鸿蒙JavaUI 框架的 WebView 加载本地冰墩墩网页

宇宙之一粟

鸿蒙开发 2月月更

低代码OR零代码,企业如何选择自身所需的软件开发平台?

WorkPlus

恒源云(GPUSHARE)_替代MLM的预训练任务,真的超简单吗?

恒源云

人工智能 自然语言处理 深度学习

用户体验超好的堡垒机哪里有?咨询电话多少?

行云管家

等保 堡垒机 网路安全 等级保护

[架构实战营]第七模块

Vincent

「架构实战营」

Camtasia卡点相册视频教程

淋雨

Camtasia 录屏软件

【等保测评】广西等保安全测评有限公司有哪些?

行云管家

网络安全 广西 等保 等级保护 等级测评

MySQL 是如何实现RC事务隔离级别的

华为云开发者联盟

MySQL ReadView 事务隔离 RC事务隔离 Read Committed

延迟任务场景,该如何提高吞吐量和时效性

华为云开发者联盟

redis 延迟任务 低延迟 Redis 消费队列

远程办公团队如何沟通?

王字 Wannz

远程办公 wrh 居家办公 线下办公 soho

LiveVideoStackCon | 面向在线教育业务的流媒体分发演进

有道技术团队

音视频

手把手教你使用HarmonyOS本地模拟器

HarmonyOS开发者

HarmonyOS DevEco Studio

分布式进阶(二十三):Nginx 服务器应用详解

No Silver Bullet

nginx https 正向代理与反向代理 SSL证书 2月月更

【连接平台」企业告警信息通过机器人同步至钉钉群

钉钉开发者

连接器 钉钉应用开发 钉群

圆桌会议:如何避免踩到移动研发中,效能提升那些坑

王字 Wannz

移动开发 迭代

小程序框架与平台编译对比

王字 Wannz

小程序 百度智能小程序 头条小程序 finclip 小程序框架

如何通过云效进行函数计算(FC)发布

阿里云云效

阿里云 云原生 CI/CD 持续交付 研发提效

让工程师拥有一台“超级”计算机——字节跳动客户端编译加速方案

字节跳动终端技术

ios 字节跳动 DevOps 客户端 火山引擎MARS

OpenHarmony移植案例:如何适配服务启动引导部件bootstrap_lite

华为云开发者联盟

开发板 OpenHarmony startup子系统 bootstrap_lite

理论+算法+实战,教你如何实现亿级流量下的分布式限流

华为云开发者联盟

高并发 服务器 分布式限流 限流 计数器

springboot3+r2dbc——响应式编程实践

麒思妙想

Reactive Java web spring-boot

阿里云EMAS 1月产品动态

移动研发平台EMAS

阿里云 程序人生 移动开发 #EMAS

数蛙科技百亿级物流标签轨迹时序数据压测

dgiot

物联网 2月月更 2月日更 dgiot dgiot物联网

各项结果排名第一!百度内容技术架构团队在国际向量检索大赛BigANN中斩获佳绩

百度Geek说

百度 内容 前端 后端

FinClip 与 uniapp:轻应用平台与前端开发框架

王字 Wannz

小程序 uniapp 移动开发 finclip

填问卷赢豪礼,吐槽 NGINX 顺便中个 AirPods 新款耳机~

InfoQ写作社区官方

nginx 热门活动

2022年了循环是什么?

謓泽

循环语句 C'语言 2月月更

灵活地横向扩展:从文件系统到分布式文件系统

博文视点Broadview

FinClip 与 mPaaS:轻应用平台与移动应用开发平台

王字 Wannz

小程序 移动开发 mPaaS finclip 小程序容器

为什么选择Scala?_Java_Ian Roughley_InfoQ精选文章