本セッションの登壇者
セッション動画(YouTubeチャンネル登録もお願いします。)
Kotlin Experimentalという題でレッドハットだるまが発表します。
KotlinのExperimental Featuresとは
KotlinのExperimental Featuresとは、構文からスタンダードライブラリ、ビルドツール設定まで広く適用される段階的公開のしくみです。次の言語バージョン仕様のEarly Previewもこのしくみで配信されます。
Kotlinではオープンにフィードバックを収集して議論がなされており、バグ報告はもちろんのこと、新しいユースケースの追加によってシンタックスの改善や新しい機能が追加されたことも少なくありません。
明示的にオプトインをしないと使えないため、誤って使うことはないでしょう。
Experimentalの例 − Context Receivers
Exprimentalの例として、Context Receiversというものが最近公開されました。呼び出しコンテキストを宣言的に書くことで、コンパイラがレシーバを暗黙的に解決するというものなのですが、こちらはちょっと説明を省きますが、既存の拡張関数という仕組みで似たようなことが書けます。
それよりも責務をきっちり分離して書けるとか、ひとつのレシーバしか設定できない拡張関数に対して複数設定できるといったアドバンテージがあり、非常にエンハンスメントして実装されている感があります。
また目的はScalaのimplicit valとは違うので、Propertyのみの束縛はしないということも、オープンに議論し結論が出されています。
Experimental Featuresの探し方
このようなExperimental Featuresなんですが、探し方があります。
まず一般的な探し方としては、Kotlin Blogで言及されるまで待って、言及されたら使ってみるというものですね。ただ、待ちきれない方もいらっしゃると思うので、そういう場合はパワーで解決する必要があります。
KotlinではオープンにKEEPというGitHubリポジトリでプロポーザルを管理していたり、Issue Trackerを使ったり、ほかにもオープンコミュニティの
Skackを使っていたりしているのですが、そこでのステータスがわかりづらいです。そういうときはコンパイラのソースコードを見に行くのが一番早いです。言語設定の一覧には、unstableやexperimentalといったマーキングががされているので、それを参考に利用可能なコンパイルオプションを探します。その後、コンパイルオプションを設定し、実際にその機能を有効化して試してみることができます。
現在のバージョン1.6のExprimentalなものを抜粋してみると、PrototypeやAlphaといったprodの利用を非推奨としています。プレリリースバイナリであって、コンパイラが読み込むと残念ながらcompilation errorが起こるような形で出力をすることがあるのですが、今回のContext RecieversやK2Compilerという新しいコンパイラで生成したものもそうです。
またBeta / Previewと呼ばれるABIは安定していますが、APIは変わるかもしれないといわれています。たとえば1.4からContractで実際にシンタックスが変わったり、一部の命令文に関してはExprimentalは完全にオプトインしないといけないなど、そういったものがあります。
またUnsigned typesについても一部だけがstableで実装されていたり、Definitely non-nullable typesについては、1.7の先行配信として1.6で使えるようになった機能となっています。
Experimental Featuresを使うリスク
これらのExperimental Featuresは基本的には便利なんですが、使うかどうかは状況に応じて判断するしかないということになります。
ABIの変更リスクがある場合はライブラリとしての配布物みたいなものなので、絶対に入れるべきではないですし、APIが変わるのであれば横断的に適用してしまうと後で直すのが面倒になります。あとはライブラリのパブリックAPIに使ってしまうと、後でユーザに対して変更を要求しなきゃいけなくなるので、そういうのは避けましょう。
また、既存の機能によってワークアラウンドが存在するのであれば、無理してExperimental Featuresを使う必要はないでしょう。
また、プロダクトの性質もリスク計算に入れるべきですね。Androidなどはデプロイしてもすぐにインストールされて修正が反映できるわけではないので、そういった場合はリスクとしてみなしたほうが良いでしょう。
予定されているExperimental Features
近いうちに入ってくるExperimentalとして一部抜粋したものがこちらになります。
たとえば一番上は、sealed classのsubclassをコンパイルタイム順に列挙することができるしくみです。これはわりとあたりまえなのでは?と思われるかもしれませんが、今はReflectionを使わないとそれができません。Androidで使っていると、Reflectionをなぜか解析できず、空配列が毎回返ってくるみたいなことがあるので、このへんが解決するととても嬉しい機能となっています。
またマルチプラットフォームの側面では、Kotlinは現在、WebAssemblyの対応が進んでいて、Kotlinネイティブを使ってLLVMを通してWebAssemblyにするワークアラウンド
があるのですが、直接ターゲティングできるようになります。
またSwiftについても直接バインディングを吐いて、Objective-Cを返さないことができます。
まとめ
まとめです。
Experimentalのしくみによって新しい機能を試すことができます。コンパイラのソースコードから探しましょう。現状の実装ステータスを知ったうえで実際に試してみてください。
Have a nice Kotlin!