2017-05-22 (月)
* Kotlinでコンパイルした後の生成物を眺める
apkやjarを作るとき,*.kotlin_builtins と kotlin_module ファイルが含まれてるので何だろうと思ったけど,前者はkotlinの組み込み型をリフレクションやIDE上から扱うためのインターフェイスの情報が入っているっぽい.後者は,クラス外のトップレベルの関数がどこにあるか等をモジュール(?)単位で持つためのファイル.
kotlin-reflectを使って何かするとかでなければapkに含める必要は無さそう.とりあえずgradleでビルド時に除外して様子見.将来的にProGuardあたり?でこの辺も不要なの消してくれないかな.
kotlin_builtinsの中身がよく見る何かだと思ったけど,Kotlinの実装見てみると気のせいじゃなくてやっぱりProtocol Buffersだった.
ついでなので,Kotlin独自のクラスの情報をどうやって持ってるのか調べる.コンパイル後は一見普通のclassファイルだけど,リフレクションでもKotlinとしてのの型情報取れるみたいなので.
kotlin_moduleとkotlin_builtinsの他にもMetadataアノテーションとして,クラスファイルに埋め込んだ情報を利用している.ScalaにもScalaSignatureというのがあったけど,それっぽいもの?
d1,d2とか謎のStringフィールドしか無いけど,これもProtoBufでエンコードされてkotlinとしてのメソッドのシグネチャや型情報っぽいものが色々入っている.
コレクションクラスにfoldとか生えててとてもうれしいけど,単純な場合はちゃんとforループに展開されているのも確認した.