12.25 Android 首選開發語言 Kotlin 又有新花樣?

Kotlin 已經很成熟了。有多成熟呢?Kotlin Team 現在的重心已經是在為各個領域內的 Kotlin 實踐提供支持了。


Android 首選開發語言 Kotlin 又有新花樣?


新特性

KotlinConf 在 12月5日前後的那幾天開完了。Kotlin 1.4 有什麼新特性嗎?還真有一個,那就是 Kotlin 接口的 SAM 轉換(KT-7770)

<code>interface Action {
fun doAction()

}
fun runAction(action: Action){

}
}

fun main(){
runAction {
//action here
}
}

/<code>

哈哈,終於在新的類型推導到來時,這個特性被支持了。前不久我在錄製 《Kotlin 入門到精通》這門課的時候講到這個點的時候還說“我也不知道什麼時候,會不會支持這個特性”,好了,Kotlin Team 終於聽到了人民的呼聲。

新形勢

Kotlin 1.0 發佈到現在已經快 4 年了,我推廣 Kotlin 差不多也 4 年多了。在 Google 開始決定扶持 Kotlin 之前,我們社區的小夥伴的內心感覺大概跟之前的 Rust 社區的小夥伴差不多吧,然後 Google 從 2017 年把 Kotlin 確定為 Android 的一級語言(表示會從官方提供支持,開發者可以使用)到 2019 年轉變為首選語言(表示官方推薦你用 Kotlin),社區小夥伴們最初得到這樣的消息大概也許相當於 Rust 社區的小夥伴們聽到微軟決定要用 Rust 來重寫部分操作系統模塊一樣吧(激動)。

我們來看看現在 Kotlin 的排名情況,第一個是大家用的比較多的:

TIOBE Index for December 2019

Android 首選開發語言 Kotlin 又有新花樣?

這個排名上 Kotlin 上升的還是比較緩慢的,不過也已經不錯了,兩年前的時候還在 50 名那兒呢。當然,這個排名其實也有一些爭議,因為它是按照互聯網上現有的某一門語言的網頁數來計算排名的,排名前幾的某些語言其實有很多網頁都大概都沒什麼人訪問。

第二個是我覺得比較能反映現在大家對待一門語言的態度的排名:

PYPL PopularitY of Programming Language

Android 首選開發語言 Kotlin 又有新花樣?

(我把圖截得大了一些,主要是想把我同樣也很喜歡的 Lua 截進來,(~ ̄▽ ̄)~)

這個索引比較科學的地方主要在於它關注的是大家搜索這門語言的教程的頻次,這個表明今年 12月大家學習 Kotlin 的熱度比起去年上升了 0.5%,名次上升了 4 位。

也就是說,這兩個索引一個反應存量,一個反應增量,數據上就能看出 Kotlin 的潛力還是非常巨大的,儘管現在開發者群體還比不上當紅的 Java Python 這類“發達”語言,但這個增速絕對就是“發展中”語言中一道亮麗的風景線。

Android 首選開發語言 Kotlin 又有新花樣?

PYPL 的排名確實能夠比較真實的反映時下大家的態度,Java 已經被唱衰了好幾年,Python 近幾年火熱到一下冒出特別多新書。Kotlin 在 Native 領域存活自然需要直面 Go,在 JavaScript 上當然也離不開 TypeScript,正好我們也對比下它們各自的發展,Kotlin 作為後起之秀真實有後來居上的氣勢。

新發展

事實上,Kotlin 的主要應用領域當然就是 Android 了。可以說 Kotlin 簡直運氣好到了極點(也可以說是 Kotlin Team 的決策高明),選擇從 Android 撕開一道口子切入市場,道理很簡單啊,搞後臺的人選擇面太廣了,Android 端除了忍受 Java,實在沒有什麼辦法,我當時嘗試了 Groovy 和 Scala 寫 Android,結果標準庫方法數一個 3W ,一個 5W,幾年前我們還在飽受方法數的折磨,大家應該懂我是什麼意思。可是 Kotlin 就很聰明,我不造輪子,標準庫方法數 7k ,而且一直到現在都沒怎麼增加太多,所以大家就開始嘗試。到現在,很多人都還覺得 Kotlin 一定是給 Android 開發者準備的 —— 怎麼會呢。不過要說支持的比較好的,當然還是 Android,KTX 的庫已經非常豐富,Lifecycle、Room 這樣的組件也已經支持協程(前者提供 scope,後者的 Dao 支持 suspend 函數),第三方的 Retrofit 早在 2.6.0 就支持 suspend 函數,OkHttp 4.x 已經完全用 Kotlin 重寫等等。就連我們公司年初開源的(實際上這個項目在內部也早就開源)插件化框架 Shadow 也有很多模塊是使用 Kotlin 開發的。數不勝數。

其次自然就是 Java 所覆蓋的其他領域。印象中 Spring 5.0 就開始支持 Kotlin,前不久試了下 WebFlux 都已經支持 suspend 函數作為 RestController 的 API ,也提供了各種 Flux 與 Flow 的互轉操作,使用體驗真實不要太贊。Kotlin Team 的親兒子 Ktor 就更不用說了,函數式的 Route 聲明,讓我一度以為自己在寫 Node.js,但又顯然不是,Node.js 哪裡會提示有什麼 API 呢;原生的協程支持,讓我們幾乎處處可以寫 suspend 調用,感覺空氣都新鮮了。

不甘寂寞的 Kotlin Team 很早就開始支持 Js,不過工具鏈卻一直沒有跟上,今年還是重點迭代的 Dukat 項目就是為了解決 Kotlin 與 JavaScript 交互時,Kotlin 的強類型問題。這個項目可以把現有的 JavaScript 界類型的事實標準 *.d.ts 文件轉成 Kotlin 聲明,這樣就很好的解決了類型問題,省得我們以前寫 Kotlin 調用 JavaScript API 的時候要麼自己手動在 Kotlin 源碼中聲明對應的 API,要麼就是各種類型都聲明為 dynamic 逃過編譯器檢查。聽說 WASM 也要獨立門戶了,過去一直都在 Kotlin Native 當中,後面也許也是一個重點的發力方向。

Kotlin Native 最早比較讓人難受的就是編譯慢的問題了。最開始編譯 Hello World 都需要 40s,後來終於縮短到了 10s 以內(我的筆記本是 2015 mbp),當然這個時間隨著代碼量的增加也並不會有特別顯著的增長,所以對於大型項目來講,編譯時間已經不再是問題。還有就是調試麻煩的事兒,如果是寫獨立的 Kotlin Native 項目,可以直接 CLion 中調試,也可以在 IntelliJ 中安裝 Native Debug 插件調試,可是最近很流行的 Kotlin Native 寫 iOS 程序呢,貌似不太好辦 —— Kotlin Team 宣佈會在明年開始 preview 一款運行在 Android Studio 上的插件用來調試跑在 iOS 上的 Kotlin Native 代碼,這就有點兒秀了。哦,對了,Kotlin Native 的協程只能跑在一個線程當中的問題也應該很快就能解決,期待一下。

還有 Kotlin 的腳本,在 3.0 時代就開始嘗試支持 Kotlin 的 Gradle 在 5.0 正式宣佈支持 Kotlin,並且官方文檔都配備了 Kotlin 和 Groovy 兩個版本,寫過 Gradle 插件的都知道,Gradle API 本來就比較複雜,用 Groovy 寫沒有 IDE 提示的日子有多痛苦,用 Kotlin 就完全不同了。

更重磅的是,來看看新鮮出爐的 kotlin-jupyter,官方博客也剛剛更新了 Kotlin 對科學計算支持的介紹文章。看來,Kotlin Team 的野心真的不小啊,我現在就是有點兒擔心 Kotlin Team 人手不夠了 —— 玩笑話,Kotlin 已經不再是 Kotlin Team 自己的了,而是我們所有開發者的。

稍微提一下,在函數式編程方面,Kotlin Team 目前沒有(明面兒上)專門支持,不過開源項目 Arrow 已經頗具規模,由於 Kotlin 1.4 有公開編譯器插件的 API 的計劃,Arrow 團隊也在積極引進編譯器層面的支持來加強某些特性的實現(例如 typeclass,目前在 Java 平臺上主要靠 APT)。

建議

儘管發展趨勢日新月異,不過建議卻一直沒變。現如今的 Kotlin 的發展形勢越來越好 ,如果現在你還沒有趁早用起來,難道要等到幾年後後悔嗎?當然也有很多小夥伴說用 Kotlin 的時候“巨坑”,然後我問他們都哪兒坑了,說出來之後結果發現都是因為對 Kotlin 甚至是對 Java 不熟悉造成的。其實大家只要認真閱讀官方文檔,稍微練習上幾天,一定會逐漸熟悉起來的,如果英文吃力,可以關注下中文 Kotlin 官網,有問題可以到Kotlin 中文論壇提問。


分享到:


相關文章: