Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

Perlで私が好きなところ ● コーディングスタイルの自由度が高い ● 書き捨てのコードも書きやすい ● 資産が豊富 ● XSである程度早く実行することもできる ● 正規表現が楽 ● 言語レベルまでハックできる 触ってて面白い言語だと感じてます。もしあなたがこの辺に好 感を感じるなら、そんなあなたにおすすめしたい言語がありま す。

Slide 6

Slide 6 text

Kotlin

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

今日話したいこと ● Kotlin/Nativeで何? ● Kotlin/Nativeで今どこまでできるのか

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

Kotlin/JVM Kotlin/Native Kotlin/JS

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

Kotlin/MPPによってどんな嬉しい ことがあるのか

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

更にサーバもKotlinにしてしまえば APIの型中間表現とか不要になっ て。。 とか考えると夢が膨らみますね。

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

A: Androidは問題なく動く

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

不可侵 領域

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

不可侵領域: バックグラウンドスレッド Kotlin 1.3 ではバックグラウンドスレッドはサポートされていな い。 KotlinにはMPPをサポートする非同期処理として Coroutine がある。これを使用してスレッドを切り替えることはもちろん、 バックグラウンドスレッドで実行されている Swiftコードから呼 び出すのもダメ。 これは、後述するfreezeルールと関連する。

Slide 22

Slide 22 text

freezeルール

Slide 23

Slide 23 text

不可侵領域: freezeルール class Sample { var value: Int = 0 fun increment(): Int { value++ Log.d("incremented: $value") return value } } 問題: increment() メソッドは必ず元の値から +1された値を返 すでしょうか?

Slide 24

Slide 24 text

答え: NO

Slide 25

Slide 25 text

不可侵領域: freezeルール class Sample { var value: Int = 0 fun increment(): Int { value++ Log.d("incremented: $value") return value } } メンバ変数はスレッド間で共通のため、トランザクション分離レ ベルを意識する必要がある。 この間に別Threadで increment()が走るかもし れない

Slide 26

Slide 26 text

不可侵領域: freezeルール K/Nではこのメンバ変数のトランザクション分離レベルの問題 を回避するためにfreezeの制約が存在する。 メンバ変数に実体を置く時は、freezed内部フラグを立てて、 変数をimmutableにしないと、他のスレッドで触ることが出来 ない。

Slide 27

Slide 27 text

不可侵領域: FAQ ● シングルトンの場合freezeルールどうなるの? ○ そこが、Mainスレッド以外で動作が保証されない理由 ○ 副作用の無い処理なら問題ないが、副作用がある処理の 場合、適切に処理されていないと、シングルトンを instantiateしたスレッドでしか触れなくなる ● どのK/Nライブラリでシングルトンを使っているかわからない ○ Kotlin 1.3では、K/NはMainスレッド以外は動作対象外な ので全部諦めよう。 ● 非同期処理(Coroutine等)は使えないの? ○ Mainスレッドで遅延実行すればできるよ

Slide 28

Slide 28 text

不可侵領域要約: Kotlin 1.3 の現状では、Mainス レッド以外が厳しみ

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

Android/iOSビジネスロジック共通化 アプリインターフェースパッケー ジ(Kotlin/Android) アプリインターフェースパッケー ジ(Swift) バックエンドライブラリ(Kotlin/MPP) ビジネスロジック リソースロジック Appサーバ OS Firebase Activity, Fragment View ViewControll er View バックエンドを共通化し たいのにバックグラウ ンドスレッドでうまく動か ないとはこれ如何に

Slide 31

Slide 31 text

まとめ ● 普通にJVMで使う分には何も問題無い ● Kotlin/Nativeに手を出すとKotlin 1.3現在ではまだ早 い ● KotlinいいよKotlin

Slide 32

Slide 32 text

詠みます

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

ありがとうございました