kotlin和scala两种语言的对比?
Posted 国民程序员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kotlin和scala两种语言的对比?相关的知识,希望对你有一定的参考价值。
每天满满的干货
出处:
https://www.zhihu.com/question/40772903/answer/208372868
虽然是个比较古老的问题了,但是出现在我的时间线上那就回答下吧。
首先,将两门语言对比,个人觉得还是因为两门语言的语法比较像,让人有对比的欲望,两者都有现代化的语法、都有多范式的编程能力、很多语言上的设计有相似之处、并且都可以在JVM平台上运行,可以和Java互相配合的语言;但是从语言角度来说,Scala无疑是要比Kotlin强大和复杂的,Kotlin的功能可以说Scala都是直接或间接地提供了的,但反过来Kotlin缺少Scala的很多特性。
可以说Kotlin是一个经过精挑细选,筛掉了部分功能的Scala。也可以说是一个填了无数大坑,经过精心强化版的Java。
从设计角度来说,Scala虽然顶着多范式编程的大旗,但是无疑她就是一门非常偏FP的语言,如果是把她当成换了语法的Java来写,那肯定会写出风格诡异,可读性很差的代码来,至少从我的实践来看,Intellij IDEA的转换功能,从Java转换出来的Scala代码可以说可读性还不如Java,而人肉转换的话甚至可以转成和人思维完全一致的形式,代码读一遍就和读了一段自然语言一样,一目了然。相比之下Kotlin几乎也可以做到这种地步,但是在一些比较特殊的情况下,有的Scala的写法可能就需要一些“魔改”的手段来实现;
从语法设计角度来讲,个人比较欣赏Scala的“万物皆表达式”的思想,例如function实际都是以“=”来连接,语句块、表达式、函数都是有返回值的,而Kotlin看起来就有点像“表达式只是个设计好的语法点”,不具有语义的泛化性,例如fun如果函数体是一个表达式,那么就可以用“=”连接,如果是多行的语句块,就不能加“=”,如果在两门语言之间互相切换的话,写Kotlin这点经常会觉得不爽。
而对比起来Kotlin的一大亮点就是语法层面强制Nullable,这点从实际工程角度来说还是非常有利的。虽然Scala可以用Option,也可以自己封装更人性化的库出来,但是无奈绝大多数人都是C系语言出身,对“null”都有思维上的偏好,如果不强制的话,有时候在Scala里包装下会觉得很麻烦,而用null的话稍不小心就会给运行时留下坑,实际上问题是完全可以在编译阶段设计上解决掉的。而Kotlin这个地方设计很高糖,写起来很舒服,并没有Scala的Option、Java的Optional的不适感。所以Kotlin从语法层面和便捷层面设计的Nullable还是要给一个大大的赞的。
而Scala还有Kotlin不具备的强大的类型系统、强大的模式匹配、任意方法名来代替有限的运算符重载等功能,以及还有一个迭代多年、精心设计过的强大类库;这些都是Scala比Kotlin功能更加强大的证明。
当然Scala的强大直接带来的一点就是复杂度爆炸,学习曲线陡峭,如果没有经过长期的实践和理论学习,恐怕Scala肯定会写成一个“换了语法的Java出来”,而且这样写你绝对不会觉得比Java好用。
另外Scala非常致命的一个缺陷就是兼容性实在不敢恭维,一个寿命有十多年的语言,而且还是运行在JVM上的语言居然到现在都有大版本升级二进制互相不兼容的问题,使用第三方库还要考虑下对方是什么版本的?支不支持我的版本?这个版本在目前这个项目能不能用?拿源码升级的话我能不能跨版本编译过去等蛋疼的问题。
而这个兼容性从另一个角度看,个人认为Scala编译器编译出来的字节码完全就只是为了能运行在JVM上,然后顺便考虑了下与Java的交互。因为同一个功能上字节码差异太大(比如伴随对象编译出来的$那是个什么鬼?2.11以及以前版本的lambda编译的实现又是个什么鬼?),跨语言使用起来就会遇到各种各样的坑。而如果你敢再用Kotlin和Scala交互一下,相信我,坑数量绝对再翻一倍。
而相比之下Kotlin的字节码就明显更偏向Java一些,如果需要跨语言和Java交互,就不会觉得那么奇怪,只要公开需要互相调用的API注意不要出现个别的几个特性就好。
总而言之,在我个人看来,我觉得Scala更像是C++:拥有各种复杂的特性、无比强大的扩展性、十分陡峭的学习曲线;
而Kotlin更像是C#:限制了一些可能滥用的特性,提供了高糖的语法、人性化的API、多范式编程、填了很多开发中实际容易遇到的坑,而且拥有Scala不可比拟的兼容性。
Scala正如其名,她是一门扩展性很强大的语言:“咱没有啥功能、特性,咱可以想办法写出来,而且包装的和就是咱自带的一样”。
Kotlin更像是为了兼容Java强大的生态的同时给Java注入年轻、灵活、高糖的语法;Kotlin的出现填掉了Java开发经常遇到的坑,而且兼容性很好,难度适中还适合Java开发人员切换。
私以为未来Kotlin的前景肯定比Scala要好,因为Scala的难度和兼容性已经把一大批人挡在了外面,变成了“小众语言”,而Kotlin没有Scala那么“高冷”,难度上是可以适合绝大多数开发人员的,加上和Java的兼容性很好,又被Google钦点,未来替代Java作为主语言开发都不是不可能。
●
●
●
以上是关于kotlin和scala两种语言的对比?的主要内容,如果未能解决你的问题,请参考以下文章