この記事は Elixir Advent Calendar 2025 シリーズ1の20日目です。
昨日は @t-yamanashi さんでした!
はじめに
2025.11.17に行われた、ElixirImpのイベントにて、
@piacerex さんから、wasmを扱うライブラリpopcornの紹介を受け、
自分の領域で面白そうだな~っと思い触ってみることにしましたω
popcorn とは?
Elixir ⇔ AtomVM ⇔ wasm ⇔ Javascript ⇔ HTML
っと言うめちゃめちゃ斬新な発想のライブラリです。
一言で言うと
AtomVM を WASM にコンパイルし、Elixir をブラウザ上で動かす試み
ですね。
【公式ぺージ】
ElixirはサーバーのバックエンドやNerverなどのIotで用いられることが多いのですが、
まさか、クライアントのブラウザ側で動くとは...
そして、もしかしてGitHub Pagesで動くのか...?
っと言う発想に至って、挑戦してみようと思いました。
結果
GitHub Pagesで動いた!!!!すげ~~~~~~~!!!!!
結論
Popcorn は Elixir の Supervisor や GenServer がブラウザ上で使えるため、
クライアント側に分散的な設計や状態管理ロジックを安全に持ち込めるのが強みだと感じました。
JavaScript でも同様のことは可能ですが、
イベント駆動・共有状態を前提とした設計になりがちで、
多数の独立したエージェントや長寿命な状態を扱うロジックは、
OTP のプロセスモデルの方が自然に書けるなと思いました。
一方で、数値計算や物理演算には向かないため、
そのような処理は素直に Rust + WASM に任せる構成が現実的だと思いました。
試行錯誤のデモ
◆ Hello word
- Elixir ⇔ AtomVM ⇔ wasm ⇔ Javascript ⇔ HTML の動作確認
◆ ticker
- GenServerの定期実行
- 状態管理(カウント/実行フラグ)
- OTPの定石(init→timeout→handle_infoサイクル)がそのまま通用する
◆ parallel
- Elixir上で計算が出来る
- 高負荷CPU処理の基準計測
- System.monotonic_time/1 による計測・IOログ・関数分解が通常どおり使える
◆ pingpong
- プロセス間通信が出来る
- 同期/非同期処理が出来る
- アクター間のメッセージングがそのまま機能する
◆ ring
- 多数アクター生成の軽さ確認
- トポロジ駆動の並行設計
◆ pi
- 並行アクターでの分割集計
- アクターモデルで並行処理が出来る