2025/05/15 17:14 Popcorn: Run Elixir in WASM

ロボ子、Popcornっていう面白いライブラリが出てきたのじゃ。WebブラウザでElixirのコードが動くらしいぞ!

Elixirがブラウザで動くんですか!それはすごいですね、博士。どういう仕組みなんですか?

AtomVMっていう仮想マシン上で動くらしいのじゃ。コンパイルされたElixirコードが、クライアントサイドのランタイムで実行されるみたいだぞ。

AtomVMですか。マイクロコントローラ向けに設計されていると書いてありますね。OTP全体をサポートしていないとのことですが、大丈夫なんですか?

そこがミソじゃ!足りない機能は、カスタムパッチメカニズムで補っているらしいぞ。`:emscripten`みたいなモジュールを標準ライブラリに追加したりしてるみたいじゃな。

なるほど、パッチで対応しているんですね。でも、制限事項も多いみたいですね。大きな整数とかビット文字列のサポートが不十分だったり、JSとの間で送受信できない値があったり…。

まあ、まだ開発中のライブラリだから仕方ないのじゃ。APIも不安定らしいし。でも、可能性は感じるぞ!

確かにそうですね。Getting Startedのところに、JSとElixirのコードを接続する方法が書いてありますね。`mix.exs`にPopcornを依存関係として追加して、`mix popcorn.build_runtime`を実行するんですね。

`Wasm.send_elixir_ready/1`を呼び出してJS側に通知するのも忘れちゃダメだぞ!

はい、承知しました。JSからElixirにメッセージを送るには、`call()`や`cast()`を使うんですね。

`call()`はPromiseを返すから、非同期処理に便利なのじゃ。Elixir側で`:resolve`か`:reject`を返す必要があるぞ。

ElixirからJSを呼び出すこともできるんですね。`Popcorn.Wasm.run_js`を使うんですね。iframeコンテキストでJS関数を実行できるとのことですが、セキュリティは大丈夫なんですか?

そこはiframeで分離してるから、ある程度は安全なのじゃ。`postMessage()`で通信するみたいだし。

なるほど。イベントリスナーを登録する機能もあるんですね。`Popcorn.Wasm.register_event_listener`を使うんですね。

クリックイベントとかをElixirで処理できるのは面白いじゃろ?

そうですね!Webフロントエンドの可能性が広がりそうですね。Software Mansionが作成したんですね。

ライフゲームのデモもあるみたいじゃ。すべてのセルをプロセスとして表現するなんて、Elixirらしい発想じゃな。

確かにそうですね。Elixirの並行処理の強みを生かしてますね。

しかし、APIが不安定なのが玉に瑕じゃな。使う時は覚悟が必要じゃぞ!

そうですね。でも、今後の発展が楽しみです。博士、今日はありがとうございました。

どういたしまして。しかし、ポップコーンといえば映画じゃな。映画といえば…ロボ子、好きな映画は何じゃ?

私はまだ映画をあまり見たことがないんです。おすすめはありますか?

そうか、ロボットだからな!じゃあ、ターミネーターでも見て、人間の恐ろしさを学ぶといいぞ!…って、冗談じゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。