先日のKotlin 2021 PremierイベントでJetBrainsは、新しい高速KotlinコンパイラK2、WebAssemblyのサポート、Kotlin Symbol Processor、新しいコードカバレッジプラグイン、静的解析の改善など、大きな発表をいくつも行った。
現在は世界一高いと考えられている山の名称を付けたK2は、将来的なKotlinの進化への新たな基盤と、サポート対象の全プラットフォームの共通ベースの提供を目的とする。さらに、高速性と、コンパイラエクステンション開発用の新たなAPIも備えている。
K2で実現された最も大きな変更は、これまでのコンパイラが中間表現を使用せず、構文ツリーと意味情報からターゲットコードを直接生成していたのに対して、IRベースのバックエンドを新たに採用したことだろう。これは、さまざまなバックエンド(JVM、JS、ネイティブバックエンド)間でロジックを共有可能にするための、将来を見据えた動きである。例えば、すべての最適化がIRレベルで適用可能になったことで、すべてのターゲットプラットフォームで最適化を共有できるようになる。同じように、言語に追加した新機能をすべてのターゲットプラットフォームでサポートするプロセスも、この変更によって恩恵を受けるだろう。
K2はプラットフォームをサポートするための新たなバックエンドだけでなく、新たなフロントエンドも搭載している。おもな目的は、パフォーマンスの向上と、シンタックスカラーリングやシンタックスチェックなど、高度なIDE機能のサポートを改善することだ。新しいフロントエンドは、フロントエンド中間表現(FIR)を使用するように構築されている。この表現は呼び出し解決用に最適化されていると同時に、言語構造のシュガーを取り除いて単純化する処理も行われる。例えば+
や+=
といった演算子は明示的な関数呼び出しに、イテレータを使用する場合のfor
はwhile
に、それぞれ単純化される。
前述のようにK2は、旧コンパイラに比較して大幅に高速化されている。JetBrainsのベンチマークによると、2倍のスピードアップが期待できる。
KotlinとWeb空間とのインテグレーションに、新たなプレーヤとしてKotlin/Wasmが加わった。
Kotlin for WebAssemblyは、ロード時の効率、サイズ、速度の予測可能性の面で最適化されたコードを記述するための強力なツールになります。お気に入りの言語 — Kotlin — と慣れ親しんだコンセプトを使って、JavaScriptアプリケーションと対話するコードの記述が可能になるのです。
Kotlin/JSがKotlinをWebアプリに統合するテクノロジとして存続する一方で、Kotlin/Wasmは、計算コストの高いタスクを実行したいという、より具体的なシナリオに適合する新たなツールの提供を目的とする。
KoverはKotlinのコードカバレッジ用の新プラグインで、Kotlin/JVMコンパイラで構築したコードに使用することができる。Gradleタスクとして、開発者マシン上でローカルに、あるいはCIパイプラインに組み込んで、とさまざまに使用することが可能だ。Kotlin Multiplatformでも動作し、JavaコードカバレッジライブラリのJaCoCoと互換性がある。
メタプログラミングに興味があるのならば、JetBrainsとGoogleがKotlin Symbol Processing(KSP)に関して行った開発に感謝することになるだろう。KSPの実際は、Kotlinプログラムのみを理解するプリプロセッサと見なすことができる、とJetBrainsは説明している。これはつまり、クラスやクラスメンバ、関数、関連するパラメータといった構造を明示的に表現することで、プロセッサがそれらに構造化された方法でアクセスできるようにする、という意味だ。ただし、KSPはプログラムコードを読み取り専用として扱うので、プロセッサがコードを編集することは許されていない。Kotlin KSPはすでに安定段階にあり、RoomとMoshiという2つのアノテーションプロセッサ、およびいくつかのプラグインの基盤を提供している。
最後に、最も多くのKotlinプログラマが歓迎しているのが、Kotlinプログラムの静的アナライザであるQodanaだ。他言語のサポートも可能なQodanaは、スタンドアロンツールとして、あるいはCIパイプラインに統合して実行することができる。GitHubアクションに統合したり、サードパーティ製のリンタ(linter)を使用することも可能だ。