在JVM生态下流行的语言有好几种,最出名的应该就是Scala和Kotlin了。最近准备除了Java本身之外在学习一种JVM生态下的语言,Scala和Kotlin都是候选语言。
我在写Spark相关程序时用过Scala,在我自己的业余项目中在尝试Kotlin和Go,两者都在不同的方向创出了一片天,Scala已经成了大数据领域的明星,Kotlin最开始在Android平台得到了官方的大力支持。
Java的诟病
Java作为一直排在语言排行榜第一的语言,其有强大的生态优势,但是随着发展其本身被枷锁了巨大的历史包袱,特别是从PC到移动,从服务端编程到云原生,巨大的编程场景的变化,Java已经慢慢的臃肿,对于一些编程场景来说,他的解决方案已经不再“性感”和“时髦”了。
随着多核时代的到来,函数式编程越来越时髦,Scala,Clojure这种多范式编程语言越来越收到开发者的喜爱。
Scala和Kotlin出现时都是为了解决同样的问题:提供更好的Java。
Scala最初诞生为想要对函数式编程和混合不同编程范式的尝试的酷想法。Kotlin设计师则更关心编译时间和强大的工具支持(IDE厂家对于工具的热情)。
Scala是基于Jvm构建另一种静态语言,代表了可扩展语言,完全是一种新语言,Kotlin则是对Java本身做了改进。
Scala明显的缺点就是编译速度非常慢,Kotlin在这方面表现则是更好一些。
Kotlin面世时出现的两个主要目标是:
- 和Java一样的运行时速度
- 在语言简洁基础上提升易用性
语法简洁也是Kotlin一直拿来和Java对比的主要特点,Java中烦人的空指针,缺少函数式编程的支持等。
相比之下Scala更奔放但是更复杂,Kotlin聪明而克制,没有Scala门槛那样高。
之前有人说过Scala和C 一样被认为是最复杂的语言,这一定程度上体现了其陡峭的学习曲线,也让很多人打了退堂鼓。
Kotlin则在尽可能保持了和Java一样的语法严苛性前提下大幅精简了Java代码的编写。
函数式编程
函数式编程对于Java程序员似乎陌生些,但是相信在未来一段时间函数式编程将会更盛行(尽管函数式编程语言已经出现了几十年)。我身边一些在我看来更Geek一些的同学早已经走上了函数式编程的康庄大道,我时常觉得身边这帮“小众语言玩家”们太酷了。
Java8开始支持了函数式编程,但是其他语言对于函数式编程可能5年前之前早就已经支持了,真不知道哪门编程语言还不支持函数式编程。
当然函数式编程带来的问题是阅读性更差一些,比如阅读java写的开源框架很顺畅,看过一些js写的框架就一脸懵比。相比下支持了函数式编程的Kotlin因为是强类型语言,函数的参数和返回值类型固定,读起来比一些更加“开放”的函数式语言来说还是好一些,并不难读。
Java8的其他新特性还有:
- Lambda:将之前类作为头等公民变为支持函数进行传递,结合lambda语法,改变了现有程序的设计模式。
- Stream API:引入了简洁的集合操作方式,赋予了强大的业务表现能力,增加了代码的可读性。
- Optional类:消除了null带来的NullPointerException问题,提供了系统层面的思路。
Scala最开始出现时是为了探索在JVM之上做一个函数式编程语言,支持泛型,高阶函数和模式匹配。
Scala彻底拥抱了函数式,我身边几个函数式编程爱好者都是Scala的忠实粉丝。但是不可否认Scala的学习曲线相当陡峭,支持的多种特性让其过于复杂了。
Kotlin一眼看上去和Scala很像,都是源于对于Java的改良,同时在面向对象和面向函数之间做了桥梁,Kotlin作为后来者不可否认在Scala身上学到了很多。
Kotlin本身具有实用性特点,没有像Scala一样热衷于在编程语言本身做研究和探索,在功能选择上相当克制。
Kotlin本身的定位可能相当清晰,就是要做一个高效编程的语言,不是为了重造Java,而是为了让Java更好用。
并发编程
在并发编程角度来说我们有很多选择,比如Scala的Future模式,如果想要替代他我们有很多选择:
- Netty Future:语法复杂些,已经过时
- JavaRX/Guava/其他Future库:需要额外的依赖
- Java8兼容Future:需要我们依赖Java8
- Kotlin deferred:主要基于coroutine协程
当然也可以采用CompletableFuture替换掉Scala的Future和Promise。
当然Kotlin最让我上心的还是其“协程”特点,在Golang引入“协程”概念之后,我一直在尝试寻找基于JVM的“协程”实现方式,大部分是基于第三方类库,但是这种在语言层面没有支持的“协程”都是耍流氓,根本用不起来,直到Kotlin这种JVM层次的“协程”才算是真正的有意义。
总感觉Java8似乎对于之前版本的迭代不太满意,在Java8引入了一大堆的新概念,但是很多让人挠头,Kotlin实现了Java8的各种特效,并引入coroutines支持,实现更强大的功能,语法具有表现力,更加简洁。
Java8的确表达很有意思,但总感觉过于繁琐。
Web开放
Web开发是Java的主要阵地,在Kotlin最开始出现的时候其主要阵地还是Android平台,慢慢的Kotlin支持了Web开发,这样Kotlin和Scala才可以在系统开发角度有的一比。
在针对一个较为简单的面向数据库的CRUD操作的场景中Java,Kotlin,Scala在实现角度互相做了比较。
Kotlin本身简洁的语法,可以在代码对象设计角度节省很大的代码量,相比之前Java的冗余则清爽许多。
Scala的实现则略感失望,实现起来似乎和Java一样冗长。
所以对于Web系统或者是面向业务场景的系统中使用易读及简洁的Kotlin似乎是个首选。
Kotlin通过Spring 5支持了web开发,某些体验上比Java更好。
最后
如果在Kotlin和Scala之间做选择的话,我毫无疑问会选择Kotlin。
作为自家孩子Kotlin永远是IDEA的头等公民,得到IDE的相当大的支持。同时由于我主要做系统开发,对于Spring本身的依赖,Kotlin在实现上比Java更简洁,可读性更强。Spring本身对于Kotlin的支持比对于Scala的支持也更强,当然如果你是大数据编程方向,Scala很长时间还会是你的首选。
当然如果进一步推荐的话,还是Kotlin Go都尝试下吧。