標籤:

kotlin和scala兩種語言的對比?

kotlin和scala都是很有趣的語言,請對這兩門語言的差異進行對比,可能的話請談談細節(長篇細論)。


The main goal of the Kotlin team is to create a pragmatic and productive programming language, rather than to advance the state of the art in programming language research. Taking this into account, if you are happy with Scala, you most likely do not need Kotlin.

--Comparison to Scala

很認同這句話


事實上,Scala 在功能上接近於 Kotlin 的超集。

相比 Scala,Kotlin 中少了很多功能,包括類型系統上帶名參數下邊界的指定,路徑依賴類型(Path-dependent type),高階類型(higher-kinded types)等等,語言上的隱式轉換,隱式等功能,而 Kotlin 獨有的功能大多能在 Scala 中用其他方式進行模擬。所以實際上 Scala 是比 Kotlin 強大了許多。

不過功能強大同時 Scala 語言的複雜性也非常高,學習成本也遠高於 Kotlin。並且 Scala 與 Java 的集成沒有 Kotlin 密切,互操作起來 Kotlin 還是強於 Scala 的。


雖然是個比較古老的問題了,但是出現在我的時間線上那就回答下吧。

首先,將兩門語言對比,個人覺得還是因為兩門語言的語法比較像,讓人有對比的慾望,兩者都有現代化的語法、都有多範式的編程能力、很多語言上的設計有相似之處、並且都可以在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對android 開發幫助蠻大的,然後....

就沒有然後了。


kotiin保證了99%的java交互能力, 代碼優美,複雜度和功能取捨合理。

因為安桌的原因它算是個次官方語言。

spring5全面支持kotlin.

不用spark就別瞎折騰scala了。學生除外。


上個月學了Kotlin,這個月學了Scala。談談體會。

Kotlin雖然風格和Java不一樣,但是感覺都很熟悉。如Kotlin函數,在Java程序員看來就是一個實現函數式介面的對象。其他如data class、by關鍵字等,就是將一些設計模式語法化了。寫起來很舒服,此外新增的就是infix,inline,tailrec等比較有意思的優化,這可能是借鑒了Scala的吧。總之,學起來比較舒服。

Scala就......還讓不讓人好好寫for了......隱式類型轉換,這東西有啥意義嗎?泛型的逆變能用來幹啥?Traits和抽象類的區別在哪?吐槽完畢。

Scala有好多沒見過的新概念,看來還是我的認知太落後了,不過對我來說,短期也不太可能去學習類型系統什麼的,所以Scala我學不會......

不過Scala的操作符都是函數,而且函數全能寫成中綴。這不僅使得科學計算會很容易,寫一個像SQL語句的dsl也不會很難。這是我覺得Scala最有意思的一點。

此外,模式匹配也特彆強大,不過我覺得Kotlin的模式匹配一般夠用了。

最後說一下,我最近遇到一個坑,Java AtomicReference有個accmulateAndGet方法,接受一個初始值和一個(T, T) =&> T的函數式介面。在Kotlin裡面可以直接傳匿名函數,如下{ a, b =&> a + b}。但是Scala不行,必須要傳一個實現這個介面的對象。。。

所以,我選Kotlin


瓜園耕讀 - 初見Kotlin


我更偏向,Kotlin,因為Kotlin讓我很舒服的編碼。我回頭會做一個Kotlin的小作業,請關註:Kotlin+ Springboot 簡介


推薦閱讀:

如何看待TIOBE2016年預測scala將停留在前20內?
模式匹配是語法糖嗎?
如何評價scalaz這個庫?
scala 和 haskell哪個更適合 新人去學習?
F# 是比 Scala 更好的語言嗎?

TAG:Scala | Kotlin | Dotty |