30
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Kotlin Fest 2024 で驚いたところメモ

Posted at

多分聞き間違えたりしているところがあると思いますが、面白かったり驚いたところを太字にしたりして、共有します。

Kotlinを愛でようというコンセプト。

KotlinConf 2024 を後から256倍楽しむためのヒント

@ masaruhr さん

キーノートは?

K2:
コンパイル時間、ハイライトまでの時間が短くなる。文法的な変更は最小限に。"K2のKotlin IDEプラグインの中を覗いてみよう♪"で聞けそう。

Multiplatform:
Fleetという多言語対応のIDEを出している。Swiftとかも触れる。

IDEの生成AIの機能など

どうやって見るか?

タイトルとChatGPTのサマリーを見て、良さそうだったら動画を見るというのがおすすめ。以下にまとまっている。

JetBrainsはコミュニティ支援を色々やっているという話。イベント開くとライセンスがもらえるなど。

今こそ始めたい!Compose Multiplatform

Kotlin Multiplatform Wizardで始めるのがダウンロードして始めるのが簡単でおすすめ

Previewできない問題。
androidMainにPreview置くか、commonMainにPreviewをおいてFleetを使う。
(以下のような方法もある。)

iOSではBackHandlerやDeeplinkは未サポート。
以下のようなツイートもあった。

iOSのUIAlertControllerをComposeから表示したりもKotlinで書いて実装できる。

DIはinterfaceをcommonMainにおいて、プラットフォームで実体を入れたりして行う。

サーバーサイドKotlin

最近のサーバーサイドKotlinで使えるフレームワーク

Ktor

軽量。プラグイン機能により、柔軟な機能追加ができる。

Micronaut

マイクロサービス、サーバーレスアプリケーションのためのJavaフレームワーク。Ktor構文もサポート。

gRPC-Kotlin。

protobufからKotlinコードを作って、使うことができる。
gRPCを使わない場合はMicronautとか考えられる。

(Ktorを選択、軽量高速。アップデート追従など。発展途上ではある。)

DI

Daggerは複雑などがあり、Koinを選んだそう。

こんなツイートも。

O/Rマッパー

Exposed: JetBrainsのO/Rマッパー

SQLっぽくかけるDSLか、DAOか2つのアクセス方法がある
昔からあるが、今年中に1.0に

JOOQ: もともとJavaのフレームワーク。

テーブルスキーマからコード生成できる。Kotlinも生成可能。
R2DBCによるノンブロッキングI/O対応。

Ktorm

JDBCに基づいたKotlin用の軽量 O/Rマッパー

どれを選んだか?JOOQ。テーブルスキーマからコード生成できるのが大きい。成熟している。
Exposedは今後有力な選択肢になるかもしれない。

テストフレームワーク

Kotest

裏側はJUnit
データ駆動テストなど強力な機能がある。
DescribeSpecを使うと階層化して、テスト書ける。良さそう。

Spek

BDD形式で書ける
Spek 2.xではマルチプラットフォームも念頭において開発された。
ただ、最新リリースが2年前。
DescribeSpecと同じものが使える。

(技術選定をした理由を話しているいいセッションだったので、サーバーサイドの開発をKotlinでしている人は一回見ておくと参考になりそうです)

Kotlinの未来

サーバー開発において、一番人気ではない。
言語の利便性やクオリティが高い
やっていき

KotlinのLinterまなびなおし2024

detektはルールがKtLintの3倍ぐらいある。

detektのフォーマッターは拡張機能で、detektのformatはissueで議論されているので気をつけたほうが良さそう。

Composeのカスタムルールセット: Jetpack Compose Rulesというがある。KtLintでもDeteKtでも使える。(30種)。もともとのTwitter社のものはアップデートされていないので注意が必要。

大きな規模ではDetektでそれ以外はKtLintがいいのではということだった。

Konsistはアーキテクチャや宣言の検査。
例えばUseCaseのクラス名や、クラス内にメソッドは一つ。パッケージ間の依存関係など。
Konstは別でモジュールを作ってそこから参照して、管理するのがおすすめらしい。

Building Kotlin Multiplatform Libraries in 2024

なぜKotlin Multiplatformでライブラリを作るか? ライブラリが、Android専用かーみたいになってしまう。

Library authors guidelineというKotlin公式のガイドが更新された。

APIの互換性。ビルド時のエラー。
ABIの互換性。実行時のエラー。
挙動の互換性。想定外の挙動。

ABIの互換性を担保するには、data classを使ってはいけなかったり、関数の引数を増やさないなど。
kotlin binary-compatibility-validator を入れて確認するのが良い。

Kotlin nativeのクロスコンパイルのissueはこれとその関連issue。現状はmacosビルドが必要でその対応が検討されている。(これ気になっている情報だったのでありがたい)
https://youtrack.jetbrains.com/issue/KT-52666/Kotlin-Multiplatform-libraries-without-platform-specific-code-a.k.a.-Pure-Kotlin-libraries-Universal-libraries

新規ユーザーはpublish方法が変わって、サードパーティのpublishのGradleを入れないといけない。このスピーカーの方が作った方法もあるそう。
ライブラリを作ったら以下で宣伝できる。
https://libs.kmp.icerock.dev/
Kotlin Foundation Grantsなどのお金がもらえるプログラムもある。

K2時代のKotlin Compiler Plugin開発

コンパイラで行われるフェーズの説明があった。

色々メモを書いたんですが、まとめると、FrontendとBackendのフェーズがあって、Extensionというのを使うとCompiler Pluginでそのフェーズの拡張ができる。例えばgreet関数を増やしたければ、functionを追加するExtensionを使うとFrontendのフェーズで関数定義を追加し、別のExternsionを使ってBackendでその関数の実装の追加を行ったりする。
おすすめのセッションです。

大きく分けてFrontendとBackendがある。Frontendは意味解決など。Backendは割と最適化やプラットフォームのためのやつが多い。

Compiler PluginはFontendもBackendも介入できる。
FirSupertypeGenerationExtensionを使うとスーパータイプの追加ができたりなど。
FrontendのSuperTypeフェーズに介入したりする。
FirDeclarationGenerationExtensionだと複数のフェーズに介入し、独自のコードをいれるなど。

FirExtensionが上のExtensionたちの基底クラス。FirSessionComponentがFir拡張の実装に必要な情報を提供する。
Predicateを基軸に実装されている。Predicate = シンボルのマッチングパターン。アノテーションベースに処理対象を特定する。

2種類のPredicate、LookupPredicateマッチするシンボルを返却。
DeclarationPredicateは宣言がマッチするかを判定 (true false)

Predicateの利用パターン。@ Markerというのを使っていたら、annotated(FqName("Maker"))で取り出せたり、parentAnnotated(FqName("Maker"))でメソッドをとりだしたりできる
Predicateはアノテーションベースで動くので、アノテーションはTYPESフェーズで動くので、COMPILER_PREQUIRED_ANNOTATIONSで先にアノテーションを登録しておく必要がある。

バックエンドに関してはIrGenerationExtensionを使って介入できる。IRノードの変換などができる。IRの改変はIrElementTransformerを使ったりする。

Pluginのアーキテクチャ。SubpluginOptionがKotlinが受け取って、CompilerでCompilerConfigurationにマッピングする。

@ Greetableをつけるとgreetメソッドが生えて挨拶してくれるPluginを例に話す。

モジュールはアノテーションとコンパイラープラグインとテストを作る。
テストのモジュールででkotlinCompilerPluginClasspPathでコンパイラープラグインのモジュールを指定する。
Frontend拡張の実装では、GreetablePredicateを定義して、DeclarationPredicate.createでアノテーションのpredicateを作る。FirDeclarationGenerationExtensionを継承して、getCallableNamesForClassを実装し、そこでpredicateをみて、アノテーションがついていればマッチするように返して、genreateFuctionも実装して、createMemberFunctionという関数で関数を生やす。
その追加した関数の中身を実装はバックエンドでやる。IrGenerationExtensionのgenerateを実装し、Transformerを渡す。Transformerの実装ではIrElementTransformerVoidを実装し、pluginContext.referenceFunctionsでprintlnのsymbolを作成し、それをvisitSimpleFunctionで、処理対象をフィルタリングして、plluginKeyっていうので、フロントエンドで生成したものを特定できたりする。
symbolにIrBuilderでirBuilder.irBlockBody {}内でprintlnを実装する。printlnの関数呼び出しはirCallを行う。

これらのExtensionをCompilerPluginRegistrarで登録する。

活用例

Composeなど
Time Travel Debuggingプラグインというのを作った、過去の状態をキャプチャして、再現できる。
これをWeb Soketで実現している。

Ask the speaker

(ここでAsk the speakerでセッションから離脱)

どうやってこのフェーズの情報得たの?

そういうコメントがたくさん書いてあるファイルが有った。

Time Travel DebuggingのあのUIのツーリングどうしている?

Flipperプラグインを使っている。つなげる仕組みが使える。依存してしまうのはややこしいがiOSでも使えそう。今はそのあたりの開発をしている。

Compiler Pluginって今IDEに読み込まれるの?

今実はgreeting関数はIDE上では赤くなったりする。
JetBrainsの方: Alphaのやつでいけるようになると思う。

(ここから"K2のKotlin IDEプラグインの中を覗いてみよう♪"の発表をしたJetBrainsの方がいらしたのでその方とのメモ)

Kotlinで公式フォーマッター作らないの?

とりあえずインスペクターだとQodanaあるので見てみて。

(スクショテストのライブラリ作ってるんだけど、)Kotlinコンパイラって割とコードダンプベースのテストだけど辛くない?

PRを小さくすることと、割と再生成することで大丈夫だよ。

K2ってmainブランチで開発したの。?

フラグ + フォルダ分けで開発されてた。

Amberって結局拡張したくなるんじゃない??

そういうのも考えてる。

K2のKotlin IDEプラグインの中を覗いてみよう♪

以前のIDEプラグインは解析エンジンを共有するのは決まっていたが、どうやって共有するのかが決まっていなかった。キャッシュして、Lazyにしてやっていた。スレッドでロックしてしまっていたりして、そのロックが外せなかったのを、解決しようとした。
フェーズ分けして、並列化できるようにした。今はlockがない。パフォーマンスが良くなった。また今までできないことができるようになった。今まではfind usageを解析している間は、ハイライトされなかったが、ちゃんとされるようになった。
今までは何かを消したときに、すべてのモジュールのグラフの情報を消して作り直していた。それが改善されたりした。ソースコードだけでなくライブラリも。
Metadataにprotobufにデータ入れて、IDEなどから受け取っていたが、それが今まではLazyで受け取っていた。ただ、Classの情報でStubだけにした。今まではメモリモリモリで開発していたが、2GBで割と動くようになった。

one more thing
Kotlin Analytics API。おそらく初めての発表。Kotlinコードを解析するライブラリ。ドキュメントがあり、マイグレーションガイドもある。 CLIでコマンドラインでも使えるようになる。KSP, Dokkaなどでもう利用されている?そう

Kotlinの歴史を可視化する

分析の原則ととして以下がある
Overview first, zoom and filter, then details-on-demand

分析手法を学べるセッション。
いつ頃からSwift対応が始まったかなどがわかる。

感想

会場での印象として、スポンサーでもかなりいたりして、意外とサーバーサイドでKotlin使っている人の割合が意外と多いのではと思いました。
Compose Multiplatformなども話題に上がっていて、Kotlinの今後の可能性に期待したいですね。

30
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?