硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

Scala 复合但不复杂,简单却不容易

  • 2020-04-21
  • 本文字数:1819 字

    阅读完需:约 6 分钟

Scala复合但不复杂,简单却不容易

编者按:本文节选自华章科技出版的 《Kotlin 核心编程》一书中的部分章节。


Scala 是洛桑联邦理工大学的马丁(Martin Odersky)教授创造的一门语言。他也参与了 Java 语言的发展研究工作,在 Java 5 中引入的泛型就是他的杰作。事实上,在 Java 刚发布的时候,马丁教授就开始了 Java 的改良工作——他在 JVM 平台探索函数式编程,并发布了一个名为 Pizza 的语言,那时就支持了泛型、高阶函数和模式匹配。


然而,在随后的探索过程中,他渐渐发现 Java 是一门具有硬性约束的语言,在某些时候不能采用最优的方式来实施设计方案。因此,马丁教授和他的研究伙伴决定重新创造一门语言,既在学术上合理,同时也具备实用价值。这就是开发 Scala 的初衷。

学术和工业的平衡

Scala 是一门非常强大的编程语言,正如它名字(Scalable,可拓展)本身一样,用 Scala 编程就像拥有了哆啦 A 梦的口袋,里面装满了各种编程语言特性,如面向对象、函数式、宏。


Scala 不仅在面向对象方面进行了诸多的改良,而且彻底拥抱了函数式。因此 Scala 也吸引了函数式编程社区很多厉害的程序员,他们将函数式编程的思想注入 Scala 社区,如此将使用 Scala 进行函数式编程提高到了新的高度。


由于 Scala 设计者学院派的背景,以及 Scala 某些看似“不同寻常”的语法,使它在发展早期(甚至现在)经常被描述为“过于学院派”,以至于马丁教授在某次 Scala 大会的演讲时,自嘲“Scala 真正的作用是将人引向了 Haskell”。


然而,真实的 Scala 却是在不断地探索学术和实用价值两方面的平衡。不可否认的是:


  • Scala 已经成为大数据领域的热门语言,明星项目 Spark 就是用 Scala 开发的,还有很多其他知名的项目,如 Akka、Kafka 等。

  • 越来越多的商业公司,如 Twitter、PayPal、Salesforce 都在大量使用这门语言。


另外,Scala 也确实是一门有着较陡的学习曲线的语言,因为它强大且灵活,正如马丁教授所言,Scala 相信程序员的聪明才智,开发人员可以用它来灵活选择语言特性。但学术和工业的平衡始终是一个难题,与 Java 严格标准相比,Scala 的多重选择也常常因复杂而被人吐槽。

复合但不复杂

那么,Scala 真的复杂吗?我们不知听了多少次类似这样的抱怨。在搞明白这个问题之前,我们需要先弄清楚到底什么是“复杂”。在英文中,复杂一词可以联想到两个单词:complex 和 complicated。实际上它们的含义截然不同,更准确地说,complex 更好的翻译是“具有复合性”。


Nicolas Perony 曾在 Ted 上发表过一次关于“复合性理论”的演讲。


什么是复合性?复合并不是复杂。一件复杂的事物是由很多小部分组成的,每一部分都各不相同,而且每一部分都在这个体系中有其自身的确切作用。与之相反,一个复合的系统是由很多类似的部分所组成的,而且(就是因为)它们之间的相互影响形成了一种宏观上一致的行为。复合系统含有很多互动的元素,它们根据简单的、个体的规则行动,如此导致新特征的出现。


马丁教授曾发表过一篇名为《简单还是复杂》的文章,表达过类似的观点。如果对搭积木这件事情进行思考,摩比世界提供了固定的方案,而乐高则提供了无穷的选择。然而,前者的零件种类和数量都比后者要多得的。类似的道理,编程语言可以依靠功能累加来构建所谓的语法,同样也可以通过简单完备的理论来发展语言特性。在马丁教授看来,Scala 显然属于后者,它并不复杂,而且非常简单。

简单却不容易

事实上,函数式编程最明显的特征就是具备复合性。函数式开发做得最多的事情就是对需要处理的事物进行组合。如果说面向对象是归纳法,侧重于对事物特征的提取及概括,那么函数式中的组合思想则更像是演绎法,近似于数学中的推导。


“简单”的哲学也带来了相应的代价:


  • 这是一种更加抽象的编程范式,诸如高阶类型、Typeclass 等高级的函数式特性虽然提供了无比强大的抽象能力,但学习成本更高。

  • 它建立了另一种与采用 Java 面向对象编程截然不同的思维模式。这种思维方式上的巨大差异显然是一个极高的门槛,同时也是造成 Scala 令人望而却步的原因之一。


Scala 在选择彻底拥抱函数式的同时,也意味着它不是一门容易的语言,它无法成为一门像 Java 那样主流的编程语言。事实上,即使很多人采用 Scala 来进行开发,也还是采用类似 Java 的思维模式来编程。换句话说,Scala 依旧是被当作更好的 Java 来使用的,但这确实是当今主流编程界最大的诉求。


在这种背景下,Kotlin 作为一门 JVM 平台上新兴的编程语言,悄悄打开了一扇同样广阔的大门。


图书简介https://item.jd.com/12519581.html?dist=jd



2020-04-21 10:031977

评论

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

聊聊那些小而美的开源搜索引擎

代码先生

搜索引擎 elasticsearch meilisearch

淘宝网能抗住“千亿级”并发量的奥秘是什么?

Java架构师迁哥

测试开发网络篇-网络协议简介

禅道项目管理

软件测试 自动化测试 测试开发

基于 Qt Quick Plugin 快速构建桌面端跨平台组件

网易云信

音视频 qt

Why WebRTC|前世今生

声网

WebRTC RTC

520 表白,因一个分号被拒

悟空聊架构

520单身福利

iOS 面试策略之系统框架-并发编程

iOSer

ios 并发编程 系统框架

高可用 Keycloak,K8s

Zhang

MySQL k8s keycloak

看完了京东年薪150万的大佬扔给我的“阿里内部Java 成长笔记”,差距不止一点点

Java 程序员 架构 面试 计算机

包容的回答者

王辉

个人成长 沟通 团队文化 批判性思维 正念

分库分表 springboot+dubbo+mybatisPlus+shardingSphere

try catch

dubbo 分库分表 springboot ShardingSphere MyBatisPlus

Serverless:这真的是未来吗?(二)

Serverless Devs

Serverless 运维 云原生 后端 无服务器

SparkStreaming知识点总结

五分钟学大数据

大数据 5月日更

Flume的负载均衡load balancer

大数据技术指南

flume 5月日更

膜拜!Github访问量破百万,阿里内部首次公布的Java10W字面经有多强?

Java 程序员 架构 面试

基础设施设施即代码(IaC)平台 Pulumi | 混合云管理利器

郭旭东

基础设施即代码 IaC

CompusBulider (模模搭)学习笔记7:3D场景中第一人称行走

ThingJS数字孪生引擎

3D可视化 数字孪生

采用DevOps的7个主要障碍,你一定不知道!

禅道项目管理

DevOps

【干货分享】开放原子超级链动态内核XuperCore核心技术揭秘

百度开发者中心

区块链 超级链

测试开发专题-开篇

禅道项目管理

软件测试 自动化测试 测试开发

官方出手,一针见血!Spring Boot官方手册来袭:从入门到实战

Java架构之路

Java 程序员 架构 面试 编程语言

UCloud一站式智能大数据平台USDP免费版正式发布!

UCloud技术

hadoop CDH

HIVE跑个insert into select xxx 为什么CPU飙高

InfoQ_Springup

hadoop

阿里内部百亿级高并发系统(全彩版小册开源):基础篇、数据库篇、缓存篇、消息队列篇、分布式服务篇、维护篇、实战篇;带你从基础到实战

Java 程序员 架构 高并发

GitHub标星235k!这份阿里P9纯手写的Java并发核心手册堪称无敌了

Java架构之路

Java 程序员 架构 面试 编程语言

致我的青春我的感情故事

Changing Lin

520单身福利

阿里分布式大神亲码“redis核心技术笔记”,没有废话,全是干货!

Java架构追梦

Java redis 阿里巴巴 架构 架构分布式

520 单身福利|获奖名单公布~

InfoQ写作社区官方

520单身福利 热门活动

BitMap 转置算法:不一样的 Count 求解方式

GrowingIO技术专栏

BitMap

3、深潜KafkaProducer核心架构

杨四正

kafka 消息队列 kafka架构 kafka源码分析

普通代码块 静态代码块 构造代码块......傻傻分不清

麦洛

Java

Scala复合但不复杂,简单却不容易_大前端_水滴技术团队_InfoQ精选文章