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

kotlinxライブラリの歩き方 〜 Kotlin公式エコシステムを使いこなす〜 /

Avatar for jsoizo jsoizo
October 10, 2025
17

kotlinxライブラリの歩き方 〜 Kotlin公式エコシステムを使いこなす〜 /

Avatar for jsoizo

jsoizo

October 10, 2025
Tweet

Transcript

  1. 6 CONFIDENTIAL - © 2022 CoDMON Inc. 6 突然ですが、kotlinxライブラリ山手線ゲーム Kotlin

    GitHub orgのリポジトリのうち、 名前にkotlinxを含むものはどれだけある??
  2. 7 CONFIDENTIAL - © 2022 CoDMON Inc. 7 こたえ: 17個

    kotlinx-atomicfu kotlinx.serialization kotlinx-kover kotlinx-rpc kotlinx.coroutines kotlinx-benchmark kotlinx-browser kotlinx.collections.immutable kotlinx-io kotlinx-datetime kotlinx.html kotlinx.reflect.lite kotlinx-knit kotlinx-cli kotlinx-nodejs kotlinx.dom kotlinx.support https://github.com/orgs/Kotlin/repositories?language=&q=kotlinx&sort=&type=all グレーの背景はdeprecatedなものです
  3. 8 CONFIDENTIAL - © 2022 CoDMON Inc. 8 kotlinxのまえに, Kotlin

    stdlibのスタンス Kotlin言語の標準ライブラリ方針 (v1.0リリースノートより) “Kotlin has an extensive standard library that makes everyday tasks easy and smooth while keeping the bytecode footprint low.” ≒ 日常的な(頻出の)コードを簡単に書けるが、バイトコードを小さく
  4. 9 CONFIDENTIAL - © 2022 CoDMON Inc. 9 実用性(Pargmatism) Kotlin言語の標準ライブラリ方針

    (v1.0リリースノートより) For us, pragmatism is about creating a user experience, not a language or a library alone. Many of the language design decisions were made under constraints like “Won’t this impede incremental compilation?”, “What if this increases APK method counts?”, “How will the IDE highlight this as you type?” ≒ 開発者体験や制約(Androidのメソッド数64K上限)をもとに言語設計する
  5. 10 CONFIDENTIAL - © 2022 CoDMON Inc. 10 なぜkotlinxが存在している? stdlibには入らないが便利な言語拡張。という立ち位置。以下の特徴をもつ

    (何がkotlinxなの?という明確な定義は公式ドキュメントには見つからず) • stdlibには入らないがスコープ限定で実用的な機能を提供する ◦ シリアライズ : serializaiton ◦ コルーチンの”実装” : coroutines ◦ 並行処理用プリミティブ : atmicfu • Kotlin開発の支援ツールの提供 • KMPで開発をしたいときの実現性不足を埋める • Kotlin言語と独立した各ライブラリの機能改善サイクル
  6. 11 CONFIDENTIAL - © 2022 CoDMON Inc. 11 Multiplaformサポート よく使われるものはNativeな環境でも使えるようになっており、

    クロスプラットフォームでKotlinを使うメリットを享受しやすくしている。 JetBrains製のAIエージェントフレームワークのKoogもKMP製 ↓は各ライブラリのサポート状況をLLMでまとめたもの
  7. 12 CONFIDENTIAL - © 2022 CoDMON Inc. 12 ktorやexposedはkoxlinxではない あくまで個人の解釈だが、

    いわゆるJetBrains謹製FW, ライブラリたちとは明確に線引きがある。 kotlinxライブラリは基本的にkotlin.stdlibにのみ依存することが多く、 ランタイムの固有の標準パッケージ以外への依存を少なくしている。  (benchmarkとかrpcとかすべてがその限りではない)
  8. 14 CONFIDENTIAL - © 2022 CoDMON Inc. 14 実際どういう物がある? kolitnxシリーズはおおよそ以下に分類される。

    • Kotlinアプリケーション実装のためのライブラリ ◦ serialization, coroutines, atmicfu, immutable collection, html, rpc, browser, io, datetime, cli • Kotlinアプリケーション開発支援のライブラリ(やGradleプラグイン) ◦ kover, benchmark, knit 次頁から独断と偏見で選んだものをご紹介
  9. 15 CONFIDENTIAL - © 2022 CoDMON Inc. 15 kotlinx.serialization •

    @Serializableなどのアノテーションを付与してKotlinの値を 任意のフォーマットに対してシリアライズ/デシリアライズする • コミュニティ製も含めて様々な フォーマット に対応している ◦ 公式かつstableなのはJSONのみ ◦ 拙作ですがPHP Serialize用をOSSとして公開しています • コンパイラプラグインによりシリアライズ処理を生成する ◦ リフレクション不要である点がJacksonやGson比で良い部分 ◦ これによりMultiplatformで同じコードが動くという恩恵が得られる
  10. 16 CONFIDENTIAL - © 2022 CoDMON Inc. 16 kotlinx.serialization @Serializable

    data class User(val id: Int, val name: String) val user = User(1, "John") !/ JSON val jsonEncoder = Json() val encoded = jsonEncoder.encodeToString(user) !/ {"id": 1, "name": "John"} !/ PHP val phpEncoeder = PHP() val encoded = phpEncoeder.encodeToString(user) !/ "O:4:\"User\":2:{s:2:\"id\";i:100;s:4:\"name\";s:4:\"John\";}"
  11. 17 CONFIDENTIAL - © 2022 CoDMON Inc. 17 kotlinx.coroutinesの前にstdlibのcoroutinesの話 Kotlin言語としては非同期処理に関する低レベルAPIを最小限だけ持つ

    • suspend 修飾子による中断可能な関数の定義 • Continuationインターフェースによる継続の表現 • suspend 関数の中断/再開時のスレッドへの割当(dispatch) これらを完全に理解したうえでコードを書かないといけないの?? → No. そこでkotlinx.coroutines 参考: 内部実装から理解する Kotlin Coroutines:suspend関数・Continuation編
  12. 18 CONFIDENTIAL - © 2022 CoDMON Inc. 18 kotlinx.coroutinesの前にstdlibのcoroutinesの話 coroutineの機能を簡単に使えるようにし、

    複雑なことを実現可能にするための高レベルなAPIを提供するライブラリ • coroutineの概念を知らなくても非同期処理が書ける ◦ launch, async/await • 非同期処理を実装するための周辺領域 ◦ テストの仕組みの提供(runTest, TestScope等) ◦ デバッグツールの提供(DebugProbes)
  13. 19 CONFIDENTIAL - © 2022 CoDMON Inc. 19 kotlinx.coroutines !/

    launch: 結果を返さない並行実行 launch { delay(1000); println("タスクA完了") } launch { delay(500); println("タスクB完了") } !/ async/await: 結果を取得する並行実行 val user = async { delay(800); "User: Alice" } val order = async { delay(600); "Order: #12345" } println("結果: ${user.await()}, ${order.await()}") !/ awaitで結果取得 !/ 複数API並行呼び出し val results = listOf( async {fetchData("foo")}, async {fetchData("bar")} ).awaitAll()
  14. 20 CONFIDENTIAL - © 2022 CoDMON Inc. 20 kotlinx.coroutines coroutineの機能を簡単に使えるようにし、

    複雑なことを実現可能にするための高レベルなAPIを提供するライブラリ • 非同期なストリーミング処理(Flow) • 複数コルーチンの利用(Channel) • スレッドプールの管理(Dispatchers) • etc…
  15. 21 CONFIDENTIAL - © 2022 CoDMON Inc. 21 kotlinx.coroutines !/

    複雑な例: リアルタイムセンサーデータの処理パイプライン 適当に華氏で生成した気温値を間引いて出力 fun sensorDataFlow() = flow { repeat(10) { emit((-20!.120).random()); delay(50) } } sensorDataFlow() .filter { it > 50 } !/ 閾値フィルタ .map { (it - 32) * 5 / 9 } !/ 摂氏→華氏変換 .buffer(10) !/ バックプレッシャー .take(5) !/ 最初の5件のみ .collect { println("気温: $it°C") } !/ 複数Flowの合成 val flow1 = flow { repeat(3) { emit("A$it"); delay(100) } } val flow2 = flow { repeat(3) { emit("B$it"); delay(150) } } merge(flow1, flow2).collect { println("マージ: $it") }
  16. 22 CONFIDENTIAL - © 2022 CoDMON Inc. 22 kotlinx-datetime •

    おなじみjava.timeパッケージを参考にしたKotlin版 ◦ JVM用の実装はjava.timeのラッパー ◦ 他プラットフォーム用はそれぞれjava.timeと仕様が揃うように実装 • kotlinx.serializationでシリアライズ可 ◦ クライアント, サーバでそれぞれKotlinであれば型が揃えられる ◦ Android x JVMだと使う旨味はないのでjava.timeで充分 ▪ java.timeのほうが機能が多かったはず(未確認)
  17. 23 CONFIDENTIAL - © 2022 CoDMON Inc. 23 kotlinx.collections.immutable •

    いわゆるイミュータブルなコレクション • listOf(): List<T> で配列を宣言するとき... ◦ JVMの場合だと実装はjava.util.Arrays.ArrayList<T>となる ◦ mutableListOf(): MutableList<T> も同様
  18. 24 CONFIDENTIAL - © 2022 CoDMON Inc. 24 kotlinx.collections.immutable data

    class Order( val items: List<OrderItem> ) { init { require(items.isNotEmpty()) !/ 最低1つの商品が必要 } } val order = Order(listOf(item1, item2)) !/ 外部からルールを破ることができてしまう (order.items as MutableList).clear() order.items.isEmpty() !/ true
  19. 25 CONFIDENTIAL - © 2022 CoDMON Inc. 25 kotlinx.collections.immutable data

    class Order( val items: ImmutableList<OrderItem> ) { !/ itemsの条件は同じなので省略 !/ 追加 fun add(item: OrderItem): Order { return copy(items.add(item)) } !/ 削除 fun remove(orderItemId: OrderItemId): Order { val newItems = items.filter{ it.id != orderItemId }.toPersistentList() return copy(newItems) } }
  20. 26 CONFIDENTIAL - © 2022 CoDMON Inc. 26 kotlinx-atomicfu (beta)

    • アトミックな値の更新をするためのライブラリ ◦ JavaでいうAtomicIntegerなどと同じ目的 ◦ JVMで動かすならAtmicIntegerなどをそのまま使えば充分 ◦ ないしstdlibのkotlin.concurrent.atomics/AtomicInt ▪ AtomicIntはJVM実行時に内部にAtmicIntegerのフィールドを持つ • コンパイル時に最適化されたコードに変換を行う ◦ kotlinx.coroutinesの内部で利用しており、メモリ効率が求められるためstdlibの Atomicではなくこちらを利用している(自信ない)
  21. 28 CONFIDENTIAL - © 2022 CoDMON Inc. 28 kotlinxライブラリを使うシチュエーション •

    Kotlin開発用ツールが必要 ◦ テストカバレッジ計測(kover) ◦ マイクロベンチマーク(benchmark) • Full Kotlinスタックである ◦ 非同期処理をする場合にcoroutineが第一の選択肢となる ◦ JSON変換も同様でserializationを使うのが手っ取り早い • モバイルアプリ等でKMP(≒iOS)を利用している ◦ データ型のFrontend-Backend間での共有 ◦ serialization, rpc • Kotlin製ライブラリ開発者である(後述)
  22. 29 CONFIDENTIAL - © 2022 CoDMON Inc. 29 Java製のアレでよくない? Spring

    Boot等Java製フレームワーク(FW)を使っている場合 デフォルトでJava製のライブラリが選択されがちである。 • AutoConfigureまわりがいい感じに動く • starterエコシステムの存在 ◦ ライブラリを組み合わせるのではなくFWが提供するものを選ぶスタイル 非同期処理などもFWの文化に応じてReactor使ったり、 強い目的意識がないとkotlinxなライブラリを積極的に使う必要もない。 いい意味でBetter JavaとしてJava資産を使うほうが合理的。
  23. 30 CONFIDENTIAL - © 2022 CoDMON Inc. 30 だけど、いちkotlinエンジニアとして 極論、”Kotlinらしいコードが好きだから”

    という理由だけで選択しても良い デバッグ時やサンプルコードなど、 実際の業務においてはコードを書く時間より読む時間のほうが長い。 その時もっとも開発者が読みやすいコードで実装されていることは重要 僕の場合はJavaを業務で書いたことがなく KotlinやScalaのコードに慣れているのでKMPを使わないとしても積極的に Kotlin製ライブラリを選択する意思が強い。
  24. 31 CONFIDENTIAL - © 2022 CoDMON Inc. 31 Kotlinコミュニティとして ~OSS開発の観点から~

    kotlin-csvの例 • 当初はKotlin/JVM専用でファイルIO周りがjava.ioと結合した状態 • コミュニティからKMP対応が求められる • 互換性をある程度維持しながらkotlinx-ioベースへ変更を計画中 ◦ https://github.com/jsoizo/kotlin-csv/issues/149 ◦ なかなか時間が取れていないので仲間募集中...
  25. 32 CONFIDENTIAL - © 2022 CoDMON Inc. 32 Kotlin Native,

    Wasmなら活きそう Kotlinを用いた開発のイメージをくつがえして tooling, ホビー用途でKotlin(Native, Wasm)を選択することができる • 簡易CLIツール作る : kotlinx-cli + 諸々 ◦ Kotlinの”実用的な”言語としてのメリットを活かす ◦ Goで良くないか?とは言わない • エッジコンピューティング x SQLite互換DBaaS ◦ Cloudflare Containers x D1, turso ▪ Scalaだと先行事例がある ◦ Next.jsで良くないか?とは言わない
  26. 33 CONFIDENTIAL - © 2022 CoDMON Inc. 33 まとめ •

    kotlinxはstdlibに含まれない言語としての公式な拡張 • 並行処理やシリアライゼーション等のライブラリを提供 しておりFull Kotlin環境においてはファーストチョイス • Kotlin/JVMにおいて絶対的な選択肢ではない... • が、ホビー用途などの他のサーバサイドの可能性が広がる