NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

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

关注

评论

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

即刻报名|Kyligence 指标平台产品发布会

Kyligence

数据分析 指标平台

IntelliJ IDEA 2023.1 版本可以安装了

HoneyMoose

c4d超强三维动画设计:CINEMA 4D Studio R2023.2.0 中文激活版

真大的脸盆

Mac Mac 软件 C4D

ChatGPT 开源了第一款插件,都来学习一下源码吧!

Python猫

pytest学习和使用5-Pytest和Unittest中的断言如何使用?

Python 自动化测试 pytest 测试报告 Allure

软件工程高效学 | 实践工具:Microsoft Office Visio

TiAmo

开发工具 Visio绘图注释工具

避免使用CSS @import 影响页面加载速度

南城FE

CSS css3 前端

应对网络不可靠挑战,用 OpenYurt 实现边缘业务连续性

阿里巴巴云原生

阿里云 开源 云原生 openyurt

让创新更多元,让世界更美好,2023女性影响力峰会圆满举办

创业邦

Scrum 管理工具哪个好?国内知名工具的 Scrum 管理过程体验

PingCode

Scrum 敏捷开发管理 敏捷开发管理工具

微软云与 OpenAI 竞争 ChatGPT 企业级客户:安全性、老客户、多云、模型迭代效率

B Impact

java实现布隆过滤器

小小怪下士

Java 程序员 布隆过滤器

ShareSDK Android SDK API

MobTech袤博科技

机器学习实战系列[一]:工业蒸汽量预测(最新版本上篇)含数据探索特征工程等

汀丶人工智能

数据挖掘 机器学习 决策树 LightGBM

文心一言更大的故事是在云计算

百度开发者中心

百度智能云 文心一言

面向 Web、微服务应用的 Serverless 托管平台云应用引擎 CAE

宇宙之一粟

云服务器 CAE 云应用

周鸿祎谈“360GPT”两翼齐飞战略;SaaS生态百家接入、120万家企业用户、2千万终端用户

B Impact

kafka Log存储解析以及索引机制

石臻臻的杂货铺

kafka

Nautilus Chain 首个生态基础设施 Poseiswap,公布空投规则

EOSdreamer111

履约核心引擎低代码化原理与实践

京东科技开发者

低代码 规则引擎 企业号 3 月 PK 榜 履约中心

软件测试 | 从手工转到测试开发,是种什么样的体验?

测吧(北京)科技有限公司

测试

百度数据可视化Sugar BI:问卷数据收集、分析与展现

百度开发者中心

大数据 百度智能云 sugar

一种自平衡解决数据倾斜的分表方法

京东科技开发者

数据倾斜 分布分表 企业号 3 月 PK 榜 B 端产品 数据分表

出手即不凡,一年共投408个公司,人均退出近5个 | 创业邦2023女性投资人榜单发布

创业邦

数字云南的那山,那水,那些人

脑极体

5G

又见版本升级!一句话概括 Milvus 2.2.4:资源隔离、多云、高效

Zilliz

非结构化数据 Milvus Zilliz

Nautilus Chain 首个生态基础设施 Poseiswap,公布空投规则

股市老人

AI训练性能提升30%,阿里云发布GPU计算裸金属实例ebmgn7ex

云布道师

弹性计算

不降功能只降资源,六个应用场景带你了解OCP Express

OceanBase 数据库

数据库 oceanbase

【4月8日】Elastic 中国开发者大会 2023 议程预告

极限实验室

大数据 elasticsearch elastic 开源 开发者大会

魔法诗~~~一套基于Vue开发的实用、高端、炫酷的响应式前端网页!!!

京茶吉鹿

Vue 前端 网页设计

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