Kotlin Updates in LL20192019-08-24 @eyasuyuki1
View Slide
説明することKotlin 1.0から1.3までの新機能マルチプラットフォーム対応コルーチン契約(Contracts)2
説明しないことKotlinの基本的な⽂法c.f.)書籍『Kotlinスタートブック』チュートリアル "Kotlin Koans"3
Kotlinとは(1/3)https://kotlinlang.org/4
Kotlinとは(2/3)JetBrainsが開発したコンパイラ⾔語JVMバイトコードへのコンパイルJavaScriptへのトランスパイルLLVM中間表現へのコンパイルNull安全スマートキャストデータクラス (ボイラープレートからの解放)⾼速なコンパイル (Scalaに対する優位性)5
Kotlinとは(3/3)関数型⾔語からの影響ラムダ式⾼階関数末尾再帰多値パターンマッチ型推論ifなどが構⽂ではなく式(値を返す)中値記法6
KotlinのTutorialKotlin Koanshttps://play.kotlinlang.org/koans/overviewKoan=禅の公案7
Kotlin躍進のきっかけ2017年のGoogle I/OでAndroidの開発⾔語として正式に採⽤された8
Kotlinの歴史(1/3)バージョン1.0未満は省略しました。年⽉ バージョン 主なトピック2016年2⽉ 1.0Javaとの完全互換Java6バイトコードへのコンパイル2017年5⽉ Androidの開発⾔語として正式採⽤9
Kotlinの歴史(2/3)年⽉ バージョン 主なトピック2017年3⽉ 1.1JavaScript対応コルーチン(実験的)async/await,yieldJava9サポートコンパイル速度の向上2017年11⽉ 1.2マルチプラットフォームプロジェクト(実験的)10
Kotlinの歴史(3/3)年⽉ バージョン 主なトピック2018年11⽉ 1.3コルーチンKotlin/Native契約(Contracts)11
1.0から1.3までの⼤きなトピックマルチプラットフォーム対応コルーチン契約(Contracts)12
マルチプラットフォーム対応(1/2)当初はJavaとの完全互換が⼤きなメリットだったJavaとKotlinが混在しても動作するので部分的に移⾏することも可能次いでJavaScriptへの対応が⾏われ、フロントエンドもKotlinで開発出来るようになった13
マルチプラットフォーム対応(2/2)Kotlin/Nativeのリリースでネイティブコンパイルが可能になりJavaに依存しない道が開かれた適⽤分野:当初はAndroid開発が主な⽤途現在ではサーバーサイドからフロントエンドまで全てKotlinで開発できる14
マルチプラットフォームプロジェクト(実験的)1つのプロジェクトで複数ターゲットのビルドが可能build.gradleなどに記述gradle initでプロジェクトが作れる訳ではない(テンプレートがない)参考⽂献:https://kotlinlang.org/docs/reference/building-mpp-with-gradle.html15
Java対応当初のメリット:Java6でもラムダ式や関数型⾔語的なプログラミングができるJava8以降が広く使われるようになり当初のメリットは薄れたKotlin⾃体もJava8以降のバイトコードに対応できるようになった16
JavaScript対応とりあえずKotlinからJavaScriptにトランスパイルはできるTypeScriptやDartと⽐べて便利かというと...Kotlin/NativeでWebAssemblyにコンパイルする⽅が有望...?参考⽂献:https://speakerdeck.com/subroh0508/jstoge-dou-sinagarakotlinfalseiketeruwen-fa-woxue-bu17
Kotlin/Native(1/2)KotlinからLLVM中間表現へコンパイルLinuxWindowsAndroid NDKiOSmacOSWebAssembly18
Kotlin/Native(2/2)当然ながらJavaのライブラリは使えないKotlinで記述した標準ライブラリの整備が進んでいるメリット: iOSアプリがKotlinで書ける参考⽂献:https://www.slideshare.net/TakakiHoshikawa/kotlinnati19
コルーチン(1/2)Kotlinのコルーチンはノンブロッキングで実⾏される関数関数の途中で処理を中断したり再開したりできるasyncDeferredを返すコルーチンビルダー関数コルーチンビルダー関数の中はノンブロッキングで実⾏されるawaitDeferredのサスペンド関数サスペンド関数はコルーチンの実⾏を中断する20
コルーチン(2/2)yield , yieldAllサスペンド関数。その時点で中断して値を返すChannelコルーチン間で値を送受信できるキュー (likeGolang)21
async(1/2)実⾏結果:start asyncend async22
async(2/2)実⾏結果:start asyncInside asyncend async23
await(1/2)コンパイルエラー:24
await (2/2)実⾏結果:start runBlockingHello world.end runBlocking25
asyncな関数(1/2)26
asyncな関数(2/2)使い⽅:実⾏結果start async functionHello, async.end async function27
契約(Contracts)スマートキャストの判定を改善するための宣⾔関数が呼び出された後の状態を制約してスマートキャストが効くようにする28
スマートじゃないキャスト(Java)29
スマートキャスト30
Kotlin 1.3以降の書き⽅契約(Contracts)によってString#isNullOrBlankがfalseならnullでないことごが保証されるのでcapitalize()が呼べる参考⽂献: https://speakerdeck.com/ntaro/kotlin-contracts-number-m3kt31
Kotlin 1.2以前の書き⽅name != nullを書く必要がある32
契約(Contracts)のおさらいスマートキャストの判定を改善するための宣⾔関数が呼び出された後の状態を制約してスマートキャストが効くようにする参考⽂献: https://speakerdeck.com/ntaro/kotlin-contracts-number-m3kt33
Kotlinの書籍(1/2)⻑澤太郎「Kotlinスタートブック」2016 (通称⾚べこ本)⻑澤太郎「Kotlin Webアプリケーション」201734
Kotlinの書籍(2/2)Dmitry Jemerov/Svetlana Isakova "Kotlin inAction" 2017 (訳書あり)Pierre-Yves Saumont "Joy of Kotlin" 201935
このスライドのソースとサンプルコードhttps://github.com/eyasuyuki/KotlinUpdates36