Kotlin/Native v0.9 來啦!

bennyhuo發表於2018-09-05

Kotlin Native v0.9 釋出啦,不要看到數字就覺得這只是一個普通的版本,實際上,它是一次編譯工具鏈、Gradle 外掛、IDE 外掛等等重大版本更新。

其中這版最重要的更點內容如下:

  • 編譯器和標準庫遷移到 Kotlin 1.3-M2
  • 標準庫支援無符號型別
  • 對 C/Objective-C/Swift 相容也支援無符號型別
  • 支援協程的穩定版本
  • 修訂併發支援
  • 引入kotlin.native

支援 Kotlin 1.3-M2

為了迎接即將釋出的 Kotlin 1.3,Kotlin/Native v0.9 的編譯器和標準庫已經遷移到了 Kotlin 1.3-M2上。所有新版本引入的特性和功能(包括內聯類、無符號型別等等)我們都可以在 Kotlin/Native 當中體驗到。

支援無符號型別

Kotlin 從 1.3 開始所有的後端都支援無符號型別,包括 JVM、Native 和 JS。例如下面的程式碼:

在所有的平臺上都可以正常執行,並輸出 4294967295。 標準庫當中很多主流的運算也都已經支援了無符號型別。

無符號型別與平臺型別的相容和對映

我們不僅在 Kotlin 內部支援無符號型別,在於平臺語言相容時,還會將這些型別對映成合適的 C、Objective-C 和 Swift 型別。例如,我們可以看一下下面的網路程式碼示例,其中演示瞭如何將資料從 socket 當中讀到 Kotlin 的ByteArray當中 :

需要指出的是,我們可以看到有些地方明視訊記憶體在潛在不安全的有符號和無符號型別轉換的可能(這些地方呼叫了內部的convert()函式)。POSIX API
ssize_t recv(int socket, void *buffer, size_t length, int flags);
則可以正確的對映成 Kotlin 簽名如下:

穩定的協程支援

考慮到協程在 Kotlin 1.3 中會結束實驗狀態,我們在 Kotlin/Native v0.9 中支援新的協程 API。 包kotlin.coroutines.experimental 當中的實驗狀態的協程 API 不再支援。

修訂併發支援

Kotlin/Native v0.8 中引入了單例物件的凍結(freeze),這樣允許我們建立一個執行緒安全的全域性物件來共享狀態。v0.9 當中我們仔細的重做了所有的併發邏輯,並將它們移入了kotlin.native.concurrent當中。重要的更新點包括:

  • 重做AtomicInt, AtomicLong, AtomicNativePtrAtomicReference
  • lazy代理支援凍結的物件

  • 新增DetachedObjectGraph類,用於封裝遊離的物件。

例如:

在 macOS 上,可變物件 Data 的控制權可以轉移給另一個非同步佇列。

另一個重要的方面,之前全域性變數是 thread-local 的,現在它們除非被 @SharedImmutable 或者 @ThreadLocal 標註,否則只允許主執行緒訪問,其他執行緒訪問它們時會丟擲執行時異常;如果被 @SharedImmutable 標註,那麼這個全域性變數會在初始化完成之後凍結,如果被 @ThreadLocal 標準,那麼每個執行緒都會持有一份自己的副本,詳細請參見:Kotlin/Native 的併發 – 全域性變數和單例

kotlin.native

為了讓標準庫有一個更好的結構以便於跨平臺專案的開發,所有的原包 konan 的內容都移到 kotlin.native 當中,並且所有的介面都重做以貼合 Kotlin 通用框架的風格。通用標準庫當中的一些 Native 特定的內容都置為 internal 或者 private,以此讓我們的程式碼更標準化更容易移植。

如何吃螃蟹

詳細資訊請看這裡 GitHub release page,當然您也可以下載二進位制檔案直接安裝:macOSLinuxWindows。Linux Snap 包 在這裡.

相關文章