Upgrade to Pro — share decks privately, control downloads, hide ads and more …

How useful Kotlin/Native in Kotlin 1.3

How useful Kotlin/Native in Kotlin 1.3

6b37e5c21ba723dacede78124b25d5a8?s=128

Masaya Yashiro

July 21, 2020
Tweet

Transcript

  1. Kotlin/Nativeで今どこまで できるか 2020-07-20 吉祥寺.pm #23 @yashims85

  2. 誰? 名前: 屋代昌也 会社: 株式会社モバイルファクトリー Twitter: @yashims85 Github: yashims

  3. None
  4. 皆さんPerlのどういったところが好 きでしょうか?

  5. Perlで私が好きなところ • コーディングスタイルの自由度が高い • 書き捨てのコードも書きやすい • 資産が豊富 • XSである程度早く実行することもできる •

    正規表現が楽 • 言語レベルまでハックできる 触ってて面白い言語だと感じてます。もしあなたがこの辺に好 感を感じるなら、そんなあなたにおすすめしたい言語がありま す。
  6. Kotlin

  7. Kotlinではどの程度カバーできるか コーディングスタイルの自由度が高い 常識の範囲内で高い 書き捨てのコードが書きやすい スクリプトとして実行できる 資産が豊富 Javaの資産を使える(JVMでは) XSである程度早くできる Kotlin/Nativeで機械語出力もできる 正規表現が楽

    特段楽ではない 言語レベルまでハックできる できない
  8. 今日話したいこと • Kotlin/Nativeで何? • Kotlin/Nativeで今どこまでできるのか

  9. Kotlin/Native • もともとJVM言語として作られたKotlinの拡張 • Kotlin 1.3 からpreview版として使用可能 • KotlinのコードをLLVMでクロスコンパイルして機械語を 吐き出そうという試み

    • Kotlin/NativeとともにKotlin/JS拡張も平行で進行中
  10. Kotlin/JVM Kotlin/Native Kotlin/JS

  11. Kotlin/MPP(Multi Platform Project) Kotlin/MPP Kotlin/JVM Kotlin/Native Kotlin/JS Kotlin/Android ServerSide Kotlin

    Kotlin/iOS Kotlin/MacOS Kotlin/X86 Kotlin/WinGW Kotlin/Common
  12. Kotlin/MPPによってどんな嬉しい ことがあるのか

  13. 設計をコードレベルで共有できるよ うになる

  14. Android/iOSビジネスロジック共通化 アプリインターフェースパッケー ジ(Kotlin/Android) アプリインターフェースパッケー ジ(Swift) バックエンドライブラリ(Kotlin/MPP) ビジネスロジック リソースロジック Appサーバ OS

    Firebase Activity, Fragment View ViewControll er View
  15. 更にサーバもKotlinにしてしまえば APIの型中間表現とか不要になっ て。。 とか考えると夢が膨らみますね。

  16. で、実際のところその設計はどの程 度まで実現できるの?

  17. A: Androidは問題なく動く

  18. A: iOSは不可侵領域に踏み込まな ければ動く 以降のiOSの場合の話はKotlin/Native(以降K/N)の 厄介さの話です。 Kotlin/JVMを触ってる限りは考慮に入れるひつようは ありません。

  19. 不可侵 領域

  20. バックグラウンドスレッド

  21. 不可侵領域: バックグラウンドスレッド Kotlin 1.3 ではバックグラウンドスレッドはサポートされていな い。 KotlinにはMPPをサポートする非同期処理として Coroutine がある。これを使用してスレッドを切り替えることはもちろん、 バックグラウンドスレッドで実行されている

    Swiftコードから呼 び出すのもダメ。 これは、後述するfreezeルールと関連する。
  22. freezeルール

  23. 不可侵領域: freezeルール class Sample { var value: Int = 0

    fun increment(): Int { value++ Log.d("incremented: $value") return value } } 問題: increment() メソッドは必ず元の値から +1された値を返 すでしょうか?
  24. 答え: NO

  25. 不可侵領域: freezeルール class Sample { var value: Int = 0

    fun increment(): Int { value++ Log.d("incremented: $value") return value } } メンバ変数はスレッド間で共通のため、トランザクション分離レ ベルを意識する必要がある。 この間に別Threadで increment()が走るかもし れない
  26. 不可侵領域: freezeルール K/Nではこのメンバ変数のトランザクション分離レベルの問題 を回避するためにfreezeの制約が存在する。 メンバ変数に実体を置く時は、freezed内部フラグを立てて、 変数をimmutableにしないと、他のスレッドで触ることが出来 ない。

  27. 不可侵領域: FAQ • シングルトンの場合freezeルールどうなるの? ◦ そこが、Mainスレッド以外で動作が保証されない理由 ◦ 副作用の無い処理なら問題ないが、副作用がある処理の 場合、適切に処理されていないと、シングルトンを instantiateしたスレッドでしか触れなくなる

    • どのK/Nライブラリでシングルトンを使っているかわからない ◦ Kotlin 1.3では、K/NはMainスレッド以外は動作対象外な ので全部諦めよう。 • 非同期処理(Coroutine等)は使えないの? ◦ Mainスレッドで遅延実行すればできるよ
  28. 不可侵領域要約: Kotlin 1.3 の現状では、Mainス レッド以外が厳しみ

  29. さて皆さんこの状況お気づきでしょう か。

  30. Android/iOSビジネスロジック共通化 アプリインターフェースパッケー ジ(Kotlin/Android) アプリインターフェースパッケー ジ(Swift) バックエンドライブラリ(Kotlin/MPP) ビジネスロジック リソースロジック Appサーバ OS

    Firebase Activity, Fragment View ViewControll er View バックエンドを共通化し たいのにバックグラウ ンドスレッドでうまく動か ないとはこれ如何に
  31. まとめ • 普通にJVMで使う分には何も問題無い • Kotlin/Nativeに手を出すとKotlin 1.3現在ではまだ早 い • KotlinいいよKotlin

  32. 詠みます

  33. “ 僕らは何度も共通化の夢をみる 徒花と知りつつも

  34. ありがとうございました