2019年2月25日

Introduction to Kotlin

2011年7月,JetBrains推出 Kotlin 專案,Kotlin 是一種在 Java VM 上執行的靜態型別程式語言,它也可以被編譯成為 JavaScript 原始碼。它是由俄羅斯聖彼得堡的 JetBrains 開發團隊所發展出來的程式語言,其名稱來自於聖彼得堡附近的科特林島。雖然與Java語法並不相容,但Kotlin被設計成可以和Java程式碼相互運作,並可以重複使用如Java集合框架等的現有Java類別庫。

相容於 Java VM 的語言還有很多,語言特性只有 Scala 比較符合需求,然而 Scala 本身有編譯太慢的缺陷,因此 Kotlin 的設計目標就是希望能跟 Java 一樣,快速編譯。JetBrains 開發這語言的用意,是希望這個新語言能夠推動 IntelliJ IDEA 的銷售。自 2011年開始開發 Kotlin 以來,一直到了 2016年2月15日,Kotlin 才釋出第一個穩定的 1.0 版,而且官方認為在未來的更新版本,都會往前相容。

Oracle 針對 Android 侵權,對 Google 提出訴訟

Oracle 在 2010 年收購 Sun Microsystems 之後不久,在就對 Google 提起訴訟,認為他們在 Android 平台上使用 37 項 Java API 侵犯了他們的權益,求償 26 億美元,Sun Microsystems 公司是構建 Java 語言和平台的公司。到了 2016 年這個數字又再以大量成長的 Android 裝置數量來調整,求償金額高達 93 億美元,2016年五月,舊金山聯邦法庭陪審團認定安卓合理利用JavaAPI並未侵權,Oracle 再次敗訴。2016年10月,Oracle 再次向上訴至聯邦巡迴上訴法院。2018年3月,聯邦巡迴上訴法院再次裁定支持 Oracle,認定 Google 侵權。

為了解決這樣的問題,Google 在 2017 年 Google I/O 宣布正式把 Kotlin 納入 Android 程式的官方一級開發語言(First-class language),因為是全新的語言,語法不相容於 Java,有新的 API,可以編譯為 java class file,與既有的 Java Library 交互運作,這樣就可以迴避 Oracle 宣稱的 API 侵權問題。

Kotline 建構流程

Kotlin 原始程式碼是以 .kt 為副檔名儲存的,透過 compiler 編譯為 class,這個步驟跟 Java 一樣,到最後要執行時,再引用 Kotlin Runtime 就可以運作。

開發工具

Kotline 可搭配 Intellij IDEA、Android Studio 或是 Eclipse 這幾種 IDE 進行開發,也可以自己安裝 Command Line Compiler

Command Line Compiler 可直接在 github 下載,解壓縮後就可以用,如果在 Mac OS,可以用 Homebrew 或是 MacPorts 安裝。

sudo port install kotlin

簡單寫個 hello world 測試

vi hello.kt

fun main(args: Array<String>) {
    println("Hello, World!")
}

編譯時加上 -include-runtime 會將 Kotlin Runtime Library 直接包裝在 hello.jar 裡面,可直接用 java 執行。

$ kotlinc hello.kt -include-runtime -d hello.jar
$ java -jar hello.jar
Hello, World!

如果直接編譯,沒有引入 Runtime Library,則需要在執行時,透過 kotlin 執行。

$ kotlinc hello.kt -d hello.jar
$ kotlin -classpath hello.jar HelloKt
Hello, World!

另外有一個 kotlinc-jvm REPL 的 command line 工具

$ kotlinc-jvm
Welcome to Kotlin version 1.2.41 (JRE 1.8.0_152-b16)
Type :help for help, :quit for quit
>>> 2+2
4
>>> println("Hello")
Hello

Kotlin 也支援 scripting 形式的 code,以 .kts 為副檔名

vi files.kts

import java.io.File

val folders = File(args[0]).listFiles { file -> file.isDirectory() }
folders?.forEach { folder -> println(folder) }

透過 kotlinc 執行

$ kotlinc -script files.kts .

Kotlin Koans

Kotlin Koans 是個簡單的教學 tutorial,可用 IDE 以 Gradle project 方式 import project,然後就能透過 Unit Test 的方式,一步一步接受指令完成任務。

舉例來說,在 src/iintroduction/0HelloWorld/n00Start.kt 可看到第一個任務,只要把 task0 改成回傳 "OK",然後到 test/iintroduction/0HelloWorld/n00StartKtTest.kt ,進行單元測試,如果測試通過,就是完成這個任務。

fun task0(): String {
    return "OK"
}

如果不想使用 IDE,也可以在 try.kotlinlang.org 直接線上進行 Kotlin Koans。

Java-Kotlin 自動轉換

在 IDE 有個功能,可以自動將 Java 的 code 轉換為 Kotlin,這是因為 Kotlin 本身的語法就是從 Java 簡化而來的,所以能夠將 Java 的 code 直接一對一轉換為 Kotlin,但有個問題是,這樣的轉換,沒辦法轉換為 Kotlin 的最簡語法。

Kotlin Koans 第一號任務,就是在教我們如何使用這個自動轉換的功能。只要直接複製 Java code,在 IDE 中,貼到 kotlin source 中,IDE 就會自動將 Java code 轉換為 Kotlin。

Kotlin 發展哲學

  • Pragmatic 實用

    Kotlin 借用了 Scala 的一些語法概念,發展自己的語法,但跟 Scala 不同的是 Scala 是一種學院派的語言,他有著許多神奇的語法結構,導致要入門 Scala 需要一段很長的時間。

    Kotlin 不同,完全是為了搭配 IDE 而實作的,因此語法也僅止於簡化 Java,改良 Java 遇到的一些問題。kotlin 是以實用為主的語言。

  • Concise 簡潔

    簡單清楚的程式碼,減輕了開發者的負擔,增加了程式碼可讀性,也縮短了開發與除錯的時間,工作效率更高。

  • Safe 安全

    Kotlin 是一個靜態資料型別的語言,確保了程式的資料型別安全,但不需要在程式碼中指定資料型別,因為 compiler 可以自己判斷。

    Kotlin 改良了傳統 Java 的問題,移除了 NullPointerException,以及 ClassCastException,避免程式在運作期間,才出現這些 Exception 導致程式異常中斷。

  • Interoperable 互操作性

    Kotlin 能夠使用既有 Java 領域的所有 Library,同時提供了 Java code 轉換為 Kotlin 的工具,因為 Kotlin 會編譯為 Java 的 class file,運作在 JVM 上,這表示在運作過程中,跟以往的 Java Applcation 完全是一樣的。

References

Kotlin實戰(Kotlin in action)

Kotlin Koans學習筆記

Kotlin Wiki

Java 世紀侵權案甲骨文勝訴,向全球追討授權費台灣也遭殃

沒有留言:

張貼留言