阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

为什么选择 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:137862
用户头像

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

关注

评论

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

2023-08-08:给你一棵 n 个节点的树(连通无向无环的图) 节点编号从 0 到 n - 1 且恰好有 n - 1 条边 给你一个长度为 n 下标从 0 开始的整数数组 vals 分别表示每个节

福大大架构师每日一题

左程云 福大大架构师每日一题 左神

云计算时代,华为云云耀云服务器L实例为何受到企业和开发者青睐

YG科技

【我和openGauss的故事】带有out参数的存储过程及自定义函数的重载测试

daydayup

鸿蒙生态加持 华为视频AiMax影院高品质再升级

最新动态

【我和openGauss的故事】使用Ora2Pg迁移oracle数据到openGauss

daydayup

Qt搭建RTSP服务器

智趣匠

PoseiSwap 开启“Poseidon”池,治理体系或将全面开启

股市老人

想要简单上云?云耀云服务器L实例是你首选

YG科技

【我和openGauss的故事】openGauss 5.0.0企业版x86单机安装

daydayup

使用appuploader工具流程(Windows版本)

华为云耀云服务器L实例:简单上云,智能不卡顿,让你的业务飞起来!

YG科技

【我和openGauss的故事】为集群增加VIP

daydayup

倒计时2天 | 第六届openGauss技术文章征集活动最新初审合格名单(截至8.3)

daydayup

LangChain系列-01 是什么

无人之路

ChatGPT #LangChain

【我和openGauss的故事】在vm中安装openEuler及使用yum安装openGauss

daydayup

MTK 2.9.2 迁移Oracle 11g 至 openGauss 5.0.0操作指南

daydayup

PoseiSwap 开启“Poseidon”池,治理体系或将全面开启

鳄鱼视界

PoseiSwap 开启“Poseidon”池,治理体系或将全面开启

EOSdreamer111

技术赋能,在鸿蒙生态下华为互动媒体内容飞轮加速

最新动态

数字化转型与架构-规划篇|PRD也适用SMART原则?

数字随行

数字化转型

浅谈贷款的还款金额组成

萌大统领

贷款 还款

PoseiSwap 开启“Poseidon”池,治理体系或将全面开启

BlockChain先知

Go 变量

小万哥

Go 程序员 云原生 后端 开发

使用appuploader工具流程(Windows版本)

雪奈椰子

简单上云第一步,华为云云耀云服务器L实例助力中小企业与开发者轻松应对多种场景

YG科技

简单上云第一步——华为云云耀云服务器L实例

YG科技

openGauss数据库源码解析系列文章—安全管理源码解析(五)

daydayup

关于并发的一点思考

黑客不够黑

并发 异步编程

PoseiSwap 开启“Poseidon”池,治理体系或将全面开启

威廉META

【我和openGauss的故事】可视化运维平台openGauss Datakit带你轻松玩转openGauss

daydayup

揭秘bi数据分析系统:如何轻松掌握商业智能的秘密

对不起该用户已成仙‖

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