Kotlin/Wasmでサーバサイドアプリケーションを開発するフレームワーク「KoWasm」が登場。WebAssemblyのガベージコレクションやコンポーネントの活用を想定
今回は「Kotlin/Wasmでサーバサイドアプリケーションを開発するフレームワーク「KoWasm」が登場。WebAssemblyのガベージコレクションやコンポーネントの活用を想定」についてご紹介します。
関連ワード (今後、図左、環境等) についても参考にしながら、ぜひ本記事について議論していってくださいね。
本記事は、Publickey様で掲載されている内容を参考にしておりますので、より詳しく内容を知りたい方は、ページ下の元記事リンクより参照ください。
JetBrainsでKotlinの開発を担当するZalim Bashorov氏と、VMwareでSpring Frameworkのコミッタとして働くSébastien Deleuze氏は、Kotlinで書かれたコードをWebAssemblyバイナリにコンパイルする機能を備えた「Kotlin/Wasm」を用いて、WebAssemblyベースでサーバサイドアプリケーションを開発するフレームワーク「KoWasm」を発表しました。
KoWasmの開発にはKotlinおよびKotlin/Wasmの開発元であるJetBrainsのKotlin/Wasmチームと協力しているとのことです。
Kotlin/WasmはWebブラウザ上のアプリを想定していた
KoWasmの説明の前にKotlin/Wasmについて説明しましょう。Kotlin/Wasmは、Kotlinで書かれたコードをWebAssemblyバイナリとするコンパイル機能を搭載した、Kotlinのマルチプラットフォーム対応プロダクトの1つです。
今年(2023年)2月のKotlin 1.8.20ベータ版で、KotlinにKotlin/Wasmが加わりました。
参考:KotlinからWebAssemblyバイナリを生成するコンパイラ搭載、「Kotlin/Wasm」が試験的プレビュー公開。Kotlin 1.8.20ベータ版で
ただし現時点でKotlin/Wasmを利用するには、WebAssemblyのガベージコレクション機能が要求されます。そのため、Google ChromeもしくはFirefoxで開発者向けのフラグを操作してWebAssemblyのガベージコレクション機能を設定する必要があります。
- WebAssemblyにガベージコレクション機能が登場、Chrome 111で試験的実装に。Dartなど高級言語のWebAssembly対応へ前進
- FirefoxもWebAssemblyのガベージコレクション機能を実装中であることが明らかに
KotlinはもともとJavaVM言語の1つとして登場し、2017年にAndroidの正式な開発言語になったことで急速に注目度を高めました。
その後、Kotlinの開発元であるJetBrainsは、iOSやWindowsアプリケーションの開発に対応するKotlin/Nativeや、サーバアプリケーションの開発に対応するKotlin/JVM、Webアプリケーションの開発に対応しJavaScriptを生成するKotlin/JSなどマルチプラットフォームに対応した言語への進化を進めてきました。
Kotlin/WasmはそうしたKotlinのマルチプラットフォーム戦略の1つであり、Webブラウザ上で実行されるWebAssemblyアプリケーションをKotlinで開発することが想定されていました。
WebAssemblyのガベージコレクションやコンポーネントの活用を想定
しかしガベージコレクション機能がChromeやFirefoxなどのWebブラウザだけでなく、Node.jsのJavaScriptエンジンであるV8や、スタンドアロンのWebAssemblyランタイムであるWasmtimeやWasmEdge、Wasmerでもサポートされることを想定すると、Kotlin/Wasmを用いてサーバサイドのアプリケーション開発が現実味を帯びてきます。
KoWasmはWebAssemblyのガベージコレクション機能だけでなく、OSなどのプラットフォームを抽象化してアクセスできるWASI(WebAssembly System Interface)やWebAssemblyのコンポーネント機能など、現在仕様策定や開発が進められている技術が機能し始める状況を想定したサーバサイド向けのフレームワークだと説明されています。
参考:WebAssemblyの「WASI Preview 2」で、WebAssemblyコンポーネントの組み合わせによるアプリケーション開発を実現へ
下記はそのビジョンを示した図で、次のような想定がなされていることを示しています。
- WebAssemblyのガベージコレクションが機能するようになればKotlinを始めとしたJava言語での利用がはじまる(図右)
- Webブラウザだけでなくクラウドやエッジサーバなどの環境でスタンドアロンのWebAssemblyランタイムが稼働することで、WebブラウザのフロントエンドとクラウドやエッジのバックエンドのどちらでもWebAssemblyのアプリケーションが実行可能になる(図左)
- バックエンドではWASIによってファイルシステムなどプラットフォームの機能が抽象化されてアクセスできるようになる
- WebAssemblyコンポーネントによって、Node.jsのnpmのように、さまざまな言語(主に低レベル)で作られたWebAssemblyベースのさまざまなコンポーネントが利用可能になる
- WebAssemblyコンポーネントのリポジトリとしてWargが使われる
KoWasmは、Kotlinのマルチプラットフォーム対応のライブラリを基盤に、HTTPルーティング機能やKotlin DSLによるHTMLコンテンツの生成機能などが含まれる見通しです。
現時点ではKoWasmのアプリケーションはWASIとWebAssemblyガベージコレクションが試験的に実装されているNode.jsを用いてデプロイします(下図左)。
今後スタンドアロンのWebAssemblyランタイムにもWebAssemblyガベージコレクションが実装されるようになれば、WASIを使ってHTTPを実装できるようになるため、Node.jsに依存せず、さまざまなスタンドアロンのWebAssemblyランタイムにデプロイできるようになることが想定されています(下図右)。
代表的なコンテナランタイムであるcontainerdには、WebAssemblyランタイムをコンテナとみなすインターフェイス「runwasi」が統合されているため、Kubernetesなどのコンテナ環境にもそのままWebAssemblyサーバアプリがデプロイできそうです。
参考:コンテナランタイムのcontainerdに、WebAssemblyをコンテナとして扱うための「runwasi」が統合。これからのコンテナランタイムはWebAssemblyと統合されていく
KoWasmは5月にバージョン0.1のリリースを目指しているとのことです。