2016 年 2 月 15 日 Kotlin 1.0 版正式發佈,以下是官網 Blog 發佈時的截圖。
我是在 Kotlin 1.0 版發佈時才知道這個程式語言,但是它其實在 2011 年 7 月就由 JetBrains 公司推出,這個專案在推出前已經開發了一年之久。
在開發 Kotlin 之前,JetBrains 公司的某個專案負責人想要找一個符合他想要的特性的程式語言,當時除了 Scala (在 2004 年時發佈的程式語言,也是很熱門的 JVM 程式語言) 之外,他找不到心中所想要的那個程式語言,但是由於 Scala 存在編譯時間過慢的問題,該專案負責人最後決定自行研發,因此才有了 Kotlin 專案。受到 Scala 的啟發,Kotlin 有些語法特性和 Scala 很相似。
早在遇到 Kotlin 之前,我就先遇上 Scala 了。有一陣子 Ruby 很熱,後來是 Python,好奇心之下稍微研究了這兩門程式語言,頓時覺得 Java 真的太囉唆了,開發上實在很沒效率。可是要開發 Android 就離不開 Java,只好試著找看看其他的 JVM 語言,那時最熱門的就屬 Scala 了。
Scala 起源於洛桑聯邦理工學院,Twitter 在 2009 年時也把後端從 Ruby 遷移到 Scala。Java 作為一門元老級的 JVM 語言,語法顯得有點過時。Scala 吸收了許多程式語言的優點,初探 Scala 時會有一種到處都是「這個語法和某語言好像」的錯覺。我當初研究 Scala 文件時,看得滿頭問號,不是看不懂語法,而是搞不懂語法為什麼設計成這樣,越看越覺得像被人拿鐵鎚不停的敲頭,最後就放棄了。
也許只是我個人的問題,對於一個啟發自 Scala 的程式語言,Kotlin 的語法顯然好懂多了。對於已熟悉 Java 的人來說,學習 Kotlin 並不難,但是由於 Kotlin 加入了函數式程式設計的特性,這部分就必須重新學習。我在 2017 年後開始逐漸大量的使用 Kotlin ,2020 年的現在,已經很少在寫 Java 了。
Kotlin 是靜態型別的 JVM 程式語言,由位於俄羅斯聖彼得堡的 JetBrains 開發團隊所開發,名稱來自附近的 科特林島。Kotlin 被設計成可以和 Java 程式碼互動,並且可以使用 Java 原有的類別庫,所以要在原有的 Java 專案中混用 Kotlin 非常容易。
JVM 是 Java virtual machine (Java 虛擬機器) 的簡稱,負責和底層的作業系統溝通。只要是能把程式碼編譯為 JVM 可讀取的位元碼的程式語言,通稱為 JVM 程式語言,這些程式語言數量非常多,目前比較熱門的有 Clojure、Groovy 及 Scala 等等,各自有不同的語言特性。
Kotlin 結合了物件導向和函數式程式語言的特性,只要充分利用兩者的優點,程式碼可以非常的簡潔。在初學 Kotlin 時,我犯了一個小錯,就是以 Java 的語法去思考 Kotlin 怎麼寫,如此一來,Kotlin 被我用得像是 Java 的 語法糖,我腦袋想的還是 Java,只是語法不同而已,完全沒有發揮 Kotlin 語言強大的特性。
直到一邊研究一邊寫了不少程式碼而更加瞭解 Kotlin 後,再回頭去重構這些舊的程式碼,往往原本 7~8 行的程式碼可以簡化成 1~2 行,不但程式碼更加穩固,語意還更清楚。在處理集合上,Kotlin 的 Collection API 也比 Java 8 才加入的 Stream 好用。在我持續寫了 Kotlin 一年左右,Google I/O 2017 年的開發者大會,竟然正式宣佈將 Kotlin 指定為官方開發語言之一,到了 Google I/O 2019 更將 Kotlin 提升為第一優先 (Kotlin-first) 的開發語言,許多功能將以 Kotlin 來優先採用。
程式語言依編譯類型概分為兩大類:編譯與直譯;型別系統也可概分為兩大類,靜態型別與動態型別。Kotlin 及 Java 都屬於編譯式靜態型別的程式語言,另一個極端就是 Python、Ruby、PHP 等屬於直譯式動態型別的程式語言。直譯式動態型別的程式語言使用上比較方便快速,缺點是執行效能較差及缺乏型別資訊較容易犯錯 (以上缺點隨著語言本身的進化,現在都有解決方案);編譯式靜態型別的程式語言效能較佳也較穩固,缺點就是指定型別等鎖碎的小事比較麻煩,有時候會覺得在撰寫上不是很有效率,閱讀上也很累人。
Kotlin 的型別推斷機制可以讓我們省略明確的指定資料型別,型別的指定方式和動態型別的語法類似,請看以下三種語言的變數宣告 (註:請暫時忽略 Array 和 List 的差異,這裡著重在宣告一個集合時的宣告語法):
# Python
a = ["A", "B", "C"]
/* Java 8 */
ArrayList<String> a = new ArrayList<String>();
a.add("A");
a.add("B");
a.add("C");
// 使用工具類別
List<String> a = Arrays.asList("A", "B", "C");
/* Java 9 */
List<String> a = List.of("A", "B", "C");
/* Java 10 */
var a = List.of("A", "B", "C");
/* Kotlin */
// 完整寫法
val a: ArrayList<String> = arrayListOf<String>("A", "B", "C")
// 經過型別推斷,可以簡寫成
val a = arrayListOf("A", "B", "C")
- Python:動態型別的 Python 宣告變數時不需要任何關鍵字,也不需指定資料型別,沒有多餘的字,不只是寫起來很快,而且一眼便知語意。
- Java:除了必須加上資料型態,並且由於 Java 8 API 不提供宣告時直接給值,因此必須宣告後一個一個加入,使用工具類別有稍微好一點,但還是有點麻煩;Java 9 提供
of()
靜態方法,Java 10 更提供區域變數可以直接使用var
關鍵字及型別推斷,幾乎快和 Kotlin 語法一樣了。 - Kotlin:完整寫法一樣很長一串,但是因為 Kotlin 可由參數的值推斷出資料型態,因此可以省略資料型態不寫,這種語法的簡潔接近 Python 但仍保有型別資訊;而且它可以透過工具函式而非直接使用類別來建立物件。
目前 (2020/04) Kotlin 在 TIOBE 上的排名升到了 30 名 (兩年多前約 45 名),PYPL (以 Google 搜尋趨勢為資料來源) 的排名則在 12 名。現在除了 Android 列為官方指定的優先語言外,也開始有以 Kotlin 為主要語言的 Web 框架,並且 Kotlin/JS 也可以輸出 Javascript,除此之外還有支援作業系統原生碼的 Kotlin/Native 正在開發,最近更增加了資料科學的相關標準庫,移動裝罝、網站、桌面及資料科學全部支援,將來如果發展成熟,也許可以使用 Kotlin 做到多個領域的開發。
繼續閱讀:Kotlin 實戰範例 (1) 為什麼要學 Kotlin
完整內容可以參考電子書:Google Play Pubu 樂天 Kobo
由 Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀
我要留言
留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。