Scala兴衰史:暂时的没落或许是一个新的开始

5年前,Scala 似乎曾要成为编程语言中下一个佼佼者,因为它能够优雅得使用面向对象编程范式进行函数编程。

现如今,随着像 LinkedIn 和 Yammer 这些公司的弃用,Scala 的光环正逐渐黯淡。

2012 年的 TIOBE 编程语言受欢迎度排行榜上,Scala 排名第 13 位;2016 年 8 月竟下降到第 32 位,现在只有不到 6% 的编程社区在使用它。

不祥的预兆:Lightbend,Scala 的母公司,在先前的 Scala 版本上发布了一款使用 Java API 的新框架。

有趣的是,作为一家领先的软件产品工程公司的 CTO,我见了很多软件开发主管,我知道的至少有两个人,曾经在使用了 Scala 一年多后,便痛苦的决定放弃使用它。这是为什么呢?

最初是什么给了 Scala 如此高的知名度呢,而如今又是什么导致了它的衰退呢?

有没有一些案例,能够证明使用 Scala 仍然是最好的选择呢?

想要知道 Scala 最初是如何火起来的,就要先了解现代编程范式的演变。首先,程序化编程,程序被视为是应该被一个接一个执行的一系列声明。然后是面向对象编程,知道如何执行对象上的操作,以及如何与相互交流,从而完成任务。

相比之下,函数式编程将一个程序作为数学函数来评估,以生成一个结果值。该函数可以调用嵌套函数,而嵌套函数又可以调用更多的嵌套函数。一个嵌套函数求出一个结果。然后,该结果会被传递给封闭的函数,这是使用嵌套函数值来计算它自己的返回值。为了使函数能够方便传递数据,并且从其他函数中,函数编程通常作为一个集合,以最可能的方式定义数据结构。它们还允许函数间传递,就像它们是数据参数一样。在这个参数内的一个例子是不允许产生任何副作用,像修改一个全局变量保持状态信息。相反,它只允许接收参数,并且为了生成其返回值,会对它们进行一些操作。执行一个函数程序包括评估最外层的功能,这反过来又导致了对所有的嵌套函数评估,而最基本的功能递归向下是没有嵌套功能的。

为什么函数式编程如此重要?

· 清晰:没有副作用的编程能创建出更容易有规律可循的代码 - 一个函数通过输入和输出完全被描述出来。一个函数今天可以生成正确答案,明天也会生成正确答案。这样创建的代码更容易调试,测试和重用。

· 简洁:在函数语言中,数据通过通用集合数据类型从嵌套函数隐式传递到其父函数。

· 高效:由于函数没有副作用,运算可以重新排序或并行执行,以优化其性能,或者,如果它们的结果没有被其他任何函数使用,则可以完全跳过。

函数编程语言已经存在了几十年,开始于 John McCarthy 的 LISP 语言,这是20世纪50年代在麻省理工学院创建的。然而,这些总是被视为细分语言,感兴趣的主要是院士和理论家。Scala 开始还作为一个学术项目,2001年由 Martin Odersky 创建于 Ecole Polytechnique Federale de Lausanne。随之,Scala 的设计者做出了几个重要决定,将 Scala 定位为函数编程到主流的突破性语言。

· Scala 代码在 Java 虚拟机(JVM)中运行。这意味着它可以轻松部署在任何运行 Java(大约85%的PC)的机器上。还意味着,Scala 代码在理论上可以与 Java 代码相互操作,为 Java 开发团队提供了一个桥梁,以轻松进入 Scala。

· Scala 在语法上和 Java 相似,并且像 Java 一样,在编译时执行类型检查而不是在运行时,从而消除了由类型不兼容而导致运行错误的可能性。这些相似之处减少了 Java 程序员的初始学**曲线。

· Scala 内置对模式匹配的支持,可以基于值模式来匹配任意数据类型,以便于对每个匹配模式执行不同的操作。

· Scala 将 Akka 作为一个标准库,支持丰富的并发模型。这使得程序员很容易的就可以实现流数据的复杂创建或处理。

看到这里,也难怪 Scala 当时那么受欢迎,被视为引领函数编程的主流语言。然而用 William H. Calvin 的话来说,“你总是可以通过背后的箭头发现先驱者。”毫无疑问,Scala 便是函数编程得以普及的先驱。那么,为什么现在的趋势又转向 Scala 了呢,今天它的开发者们是又如何到了稳步缩减的地步?

· Java 编程语言引入了函数式编程结构,始于2014年初发布的 Java 8。Scala 和 Java 支持的函数编程方式有着微妙的差别,有争议的是,Scala 的方法更胜一筹。但是,作为优秀的函数编程语言,Java 已经超越了Scala,因为程序员们对 Java 已经很了解了。这让人联想到 Adobe Flex 和 Microsoft Silverlight,它在 Web UI 程序员中有相当大的跟风性,直到发布了 HTML 5,HTML 5 提供了足够的 Web UI 特性,使其成为主流技术。

· Scala 是一门很难掌握的语言,因为它的规则是基于数学类型理论下的,只有最具学术和数学天分的程序员才能够完全理解。此外,Scala 的很多语言特性,包括隐性和宏,可能导致程序控制意外流到代码库的其他部分,这使得大多数程序员难以跟踪或调试其代码。一个能够领会这一切的优秀程序员,使用 Scala 会比使用 Java 更高效,但是一个普通程序员的生产力,从功能实现上来看,效率则会相反。这不仅仅是由于学**曲线的短期下降 — 这是一些开发团队使用 Scala 一整年后的观察结果。

· 不像 Java,Scala有一个灵活的语法,通常会提供很多方法来达到相同的结果。除了让 Scala 为更多的程序员所用外,Scala 社区似乎花了很多时间来讨论,这个几个功能解决方案哪个是正确的。这些争论聚集了很高的热度,并且防止出现在其他更具限制性的语言(如Java)中存在的尝试和真正的实现模式。

· Scala 还没有做好保持兼容性的工作,无论是早期版本的 Scala 还是 Java。

鉴于这些问题,Scala 很可能永远不会演变成 Java 这样的主流编程语言,但仍然会有一些特殊案例,选择 Scala 这种编程语言才是最合适的:

· 大数据处理:Scala 的优势非常适合大数据编程模型,其中任务采用了不可变集合作为输入,使用 map 和 reduce 处理转换集合,并生成新的结果集合。对于 Spark 等大数据工具,使用 Scala 的优势是压倒性的,因为一个程序的 Scala 版本通常比等效的 Java 程序缩短 5 到 10 倍。

· 创建特定领域的语言:通过为用户提供可用于编写脚本的特定领域的语言(DSL),可以很好的解决许多问题。例如,假设你的用户要求用一个工具,使他们能够安排和运行自动化质量检测。由于你不能预测所有需要运行的测试组合,因此你需要为他们提供一种脚本语言,以便于他们为任何场景定义这些测试的顺序和位置。由于其模式匹配,语法灵活,操作符重载等特性,使 Scala 能够独特地适用于 DSLs 开发。

总结

Scala 在函数编程普及的过程中起到了关键性的催化剂作用,它对 Java 中的函数式编程设计产生了很大的影响。Scala 可能永远不会成为下一个巨星编程语言,但是,在未来几年内,它将成为大数据编程等细分问题领域的首选语言。

英文原文:The Rise and Fall of Scala

译文作者:DevStore-糖果果

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏专注研发

poj-1006-Biorhythms

人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如...

10710
来自专栏牛客网

阿里 Java研发工程师[内推] 电话面试

3月20号 阿里巴巴 Java研发工程师[内部推荐] 电话面试 1. 自我介绍(问了我哪里人、去杭州工作有没有问题、什么时间可以去实习) 2. 介绍一下自己做过...

49390
来自专栏Aloys的开发之路

关于强制式(命令式)语言和声明式语言的区别

在阅读Alfred V.Aho等的大作Compilers Principles,Techniques and Tools是看到如下一段话: Another  c...

32550
来自专栏平凡文摘

国外大神总结的 10 个 Java 编程技巧!

14020
来自专栏python学习之旅

测试工程师的一些面试题目(python)和总结

    1、输入:JSON {"a":"aa","b":"bb","c":{"d":"dd","e":"ee"}}   输出:字典 {'a': 'aa', 'b...

61320
来自专栏同步博客

工厂模式

  定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

12920
来自专栏企鹅号快讯

编程世界的沟沟坎坎

我相信每一个想学习编程或者经历过编程实践的人,在刚开始的时候都会遇到一些沟沟坎坎,尤其是对编程里面的一些概念,比如说Java语言是面向对象的、C语言是面向过程的...

24590
来自专栏小樱的经验随笔

hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)

#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满...

28740
来自专栏Coding01

浅谈 Laravel Collections

这两天看了两本书《Laravel Collections Unraveled》和 《Refactoring to Collections》。

36020
来自专栏IT笔记

聊聊JAVA中 String类为什么不可变

前言 "我的风格比较偏传统和经典" 小明说,"我们在打扮自己的问题上还是蛮冒险的...我觉得当你是只狗的时候,穿什么都hold的住!" ? 哈哈哈,脱离单身狗快...

432190

扫码关注云+社区

领取腾讯云代金券