This post describes early experimental work from JetBrains and Google. You can learn more in the session on WebAssembly at Google I/O 2023.
アプリケーション デベロッパーは、できるだけ多くのプラットフォームのユーザーに可能な限り多くリーチしたいと考えています。これまで、この目標が意味してきたことは、Android、iOS、ウェブのそれぞれでアプリを構築すること、そしてそれに使うバックエンド サーバーやインフラストラクチャを構築することでした。
それに必要な労力を軽減するため、マルチプラットフォームに対応した言語やフレームワークでアプリのビジネス ロジックや UI を開発しているデベロッパーもいます。以前は、ウェブでこういったマルチプラットフォーム アプリを使うには、共有アプリケーション コードを、ブラウザで実行できる遅い JavaScript 版に「コンパイル」する必要がありました。あるいは、アプリを JavaScript に書き換えたり、単にウェブユーザーにネイティブ モバイルアプリをダウンロードするように求めたりすることもよく行われています。
ウェブ コミュニティでは、それよりも優れた代替手段の開発が進められています。これは WebAssembly GC と呼ばれる新しい技術を使い、ウェブでモダン言語を直接サポートするものです。この新しいウェブ機能を使えば、サポートされる言語で書かれたクロスプラットフォーム コードを、すべての主要ブラウザでネイティブ並みのパフォーマンスで実行できます。
この新しい機能の試験運用版サポートを、ウェブ用の Kotlin に導入します。これにより、Android とウェブのデベロッパーが高パフォーマンスのコードを新たに共有できるようになります。
Kotlin は生産性の高い強力な言語で、Android アプリトップ 1,000 の 95% で使われています。デベロッパーは、Kotlin に切り替えると生産性が上がり、バグが減ると述べています。
JetBrains の Kotlin Multiplatform Mobile と Compose Multiplatform フレームワークを使うと、Android と iOS のアプリでコードを共有できます。この 2 つのフレームワークで、Kotlin を WebAssembly にコンパイルする機能を試験運用版として提供します。初期の実験では、JavaScript の代わりに WebAssembly を使うことで、ウェブの Kotlin コードが最大 2 倍速くなることが示されています。
JetBrains は、詳細を K2 コンパイラのバージョン 1.18.20 のリリースノートに記載しています。また、アプリで Kotlin/Wasm を試す方法を説明したドキュメントも共有されています。
Kotlin のような最新のモバイル言語をウェブに導入するにあたっては、多言語ガベージ コレクションや JavaScript の相互運用性といった困難な技術的問題を解決する必要がありました。詳細は、今年の Google I/O カンファレンスの新しい WebAssembly 言語に関するセッションで確認できます。
この作業は、ブラウザ ベンダー、学界、ウェブのサービス プロバイダが W3C WebAssembly コミュニティ グループに参加してオープンに連携し合うことがなければ、実現しなかったでしょう。この革新的な作業の技術的詳細は、今後数週間のうちに V8 ブログで共有する予定です。
デベロッパーは数十前から、ウェブが一種の「ユニバーサル ランタイム」となることを夢見てきました。しかし同時に、ネイティブ プラットフォームと比較すると、特定の機能やパフォーマンスにギャップがあることも認識していました。そのため、長い間、ウェブとネイティブ モバイルアプリのどちらで作業するかを切り替えなければなりませんでした。
しかし私たちは、皆さんがウェブとネイティブ エクスペリエンスの両方を一緒に扱えるようにしたいと考えました。それにより、作業の労力を減らせるだけでなく、ウェブにしかないスーパーパワーを活用できるようにもなります。
オープンウェブでは、新しいユーザーはアプリをクリックするだけで利用でき、ウェブページを共有するのと同じくらい簡単にアプリを探したり共有したりできます。アプリストアが入り込んでくることもなく、収益に影響を与える収益分配もありません。
WebAssembly が愛される理由は、クロスプラットフォーム開発の生産性、ネイティブ モバイルアプリのパフォーマンス、ウェブのオープン性にあります。
皆さんが次に作るものを楽しみにしています。