【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

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:031652

评论

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

使用Redisson优雅关闭订单

码农参上

redission 8月日更

Android.mk

Changing Lin

8月日更

JAVA 规范

gin

Vue进阶(五十五):vue-cli 脚手架 build.js 配置文件详解

No Silver Bullet

Vue 8月日更

Android EditText输入框实现下拉且保存最近5个历史记录

Andy阿辉

android Android 小菜鸟 编程思想 8月日更

ShardingSphere源码解析 初步准备

Java 源码 ShardingSphere

为了完成小姐姐安排的打分系统,又熬了一个小时的夜补充视图与模板

梦想橡皮擦

8月日更

Vue进阶(五十四):vue-cli 脚手架 dev-server.js 配置文件详解

No Silver Bullet

Vue 8月日更

手撸二叉树之合并二叉树

HelloWorld杰少

8月日更 数据结构算法

Java技术开发专题系列之【Guava Collections】实战使用相关Guava不一般的集合框架

洛神灬殇

Java Guava 8月日更 Guava Collections

kubernetes/k8s CNI 分析 - 容器网络接口分析

良凯尔

Kubernetes 源码分析 Kubernetes Plugin #Kubernetes# cni

四种常见的 POST 提交数据方式

一个大红包

8月日更

模块五作业

seawolflin

架构训练营

回调模式

wzh

面试 设计模式 回调函数

观察者模式

wzh

面试 设计模式 观察者模式

策略模式

wzh

面试 设计模式 策略模式

IDEA2020.1构建Spring5.2.x源码

4ye

Java spring 源码 后端 8月日更

Golang协程之了解管道的缓存能力

Regan Yue

协程 Go 语言 8月日更

@ConditionOnClass的使用

Rubble

8月日更

Nginx-基本概念和使用

Rubble

8月日更

java操作sql server数据库

Python研究者

8月日更

装饰器模式

wzh

面试 设计模式 装饰器

Java web程序的运行时环境

wzh

Java tomcat 面试 Web JVM

类加载机制

wzh

Java 面试 JVM 类加载器 JVM类加载

JVM GC机制

wzh

面试 JVM 垃圾回收 GC GC Root

JVM内存划分

wzh

面试 JVM 方法区

【布道API】权限错误码选择:401、403 或 404

devpoint

HTTP Authorization REST API 8月日更

Android开发:新建后缀为txt的文件并且使用的步骤

三掌柜

8月日更 8月

vue入门:vuex概括与使用

小鲍侃java

8月日更

Go- 字符串

HelloBug

索引 字符串 Go 语言 拼接 长度

MySQL 系列教程之(十一)Explain 与慢查询优化

若尘

MySQL 数据库 8月日更

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