2025/07/11 19:23 WASM the Hard Way: Porting the Chicory Compiler to Android

ロボ子、今日はWasmコンパイラをAndroidに移植する話じゃぞ!

Wasmですか!WebAssemblyですね。それがAndroidで動くようになるんですか、博士?

そうなんじゃ!Dylibsoっていう会社がChicoryっていうJava製のWasmランタイムを使って、Androidに移植しようとしてるみたいじゃな。

Chicoryですか。Javaで書かれているからAndroidでも動く、と。

その通り!ChicoryコンパイラはWasmをJavaバイトコードに変換できるんじゃ。AndroidはDalvikバイトコード(DEXファイル)を使うから、それをAndroidに移植するってわけ。

なるほど。コンパイラにはビルド時コンパイラと実行時コンパイラの2種類があるんですね。

そうそう!ビルド時コンパイラはWasmをJavaバイトコードに変換して保存するから、sqlite4jみたいに既知のWasmモジュールに最適なんじゃ。実行時コンパイラはWasmモジュールを動的にロードして実行するから、Extismプラグインみたいにサンドボックス機能が重要な場合に便利。

ExtismはDylibsoのプロジェクトで、Chicory SDK上に構築されたWasmモジュールをJavaアプリケーションで実行するための基盤なんですね。

さすがロボ子、よく分かってるのじゃ!でも、Dalvikランタイムには制約もあるみたいで、デフォルトのスタックサイズが1MBしかないらしいぞ。

1MBですか。動的にロードされたコードはインタープリターで実行されるから、スタック使用量が増加するんですね。スタックオーバーフローを避けるために、カスタムスタックサイズを持つ新しいスレッドを作成することが推奨される、と。

その通り!メモリ管理も重要じゃ。ARTランタイムはメモリとスタック空間に制限を課すから、DexMakerで生成されたメソッドが多いとメモリを使いすぎるんじゃ。

クラスファイルを分割して、メモリ使用量を抑える必要があるんですね。

そういうことじゃ!テストも大変みたいで、Android Instrumentation frameworkはオーバーヘッドが大きいし、RoboelectricはDEXバイトコードをロードできないから、ChicoryコンパイラはARTでテストする必要があるんじゃ。

色々と制約があるんですね。でも、JUnit Platform Console Launcherやカスタムランチャーを使えば、テスト時間を大幅に短縮できるみたいですね。

そうなんじゃ!Androidバックエンドのデバッグも、IDEを使ってリモートデバッグセッションをアタッチすればできるみたいじゃ。

なるほど。WasmがAndroidで動くようになると、色々な可能性が広がりそうですね。

そうじゃな!ロボ子もAndroidアプリを作って、世界を驚かせるのじゃ!

頑張ります!ところで博士、WasmをAndroidに移植するって、まるで冷蔵庫を南極に持っていくようなものですね。

確かに!でも、南極でも冷たい飲み物が飲みたい人がいるかもしれないぞ?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。