プログラミングとソフトウェア開発

Emscriptenの実験的ターゲットを通じて、CloudflareがWorkers上でネイティブRustアプリケーションの実行を可能に

Cloudflareは、wasm-bindgenおよびRust WorkersにおけるEmscriptenの実験的ターゲット ‏wasm32-unknown-emscriptenへの対応を発表し、RustライブラリとWorkersプラットフォームの互換性を拡大した。この取り組みにはTokioの統合、TCP・UDP・Unixソケットのサポート、Durable Object内でMinecraftサーバーを実行する実用的なデモが含まれる。

2026-09-28
1 分で読めます
10 閲覧数
certi.news Editorial Team
Emscriptenの実験的ターゲットを通じて、CloudflareがWorkers上でネイティブRustアプリケーションの実行を可能に

Cloudflareは、wasm-bindgenツールチェーンおよびRust Workers環境におけるコンパイルターゲットwasm32-unknown-emscriptenの初の公開実験プレビューを発表した。この経路により、従来のWebAssemblyモデルとあらかじめ互換性を持つライブラリだけに限定されず、より多くのネイティブRustアプリケーションおよびライブラリをWebAssembly形式で構築し、Workersのグローバルプラットフォーム上で実行できるようになる。

この取り組みは、ネイティブコードをウェブ環境に接続し、ファイルシステム、タイマー、ソケットなどの機能をエミュレートする層を提供するEmscriptenと、RustとJavaScriptの間のバインディングを生成するwasm-bindgenの統合を意味する。今回の変更により、RustコンパイラーとEmscriptenコンパイラーは、同じビルドプロセス内で互いのバインディング層を利用できる。

Rustライブラリの互換性を拡大

Cloudflareによると、初期テストでは、低レベルライブラリを含むRustライブラリとの互換性が向上した。libc、socket2、Mioなどのライブラリでは、プラットフォーム条件にEmscriptenターゲットを追加するための限定的な変更が必要だった。最も複雑なライブラリはTokioだった。WorkersはJavaScriptイベントループ内で単一スレッドで動作する一方、Tokioは従来、入出力操作を待機する間にスレッドを停止することに依存しているためだ。

この違いに対処するため、Cloudflareは2つの経路に取り組んでいる。1つ目はWebAssembly JavaScript Promise Integrationを使用する方法で、WebAssemblyスタックを一時停止し、制御をJavaScriptイベントループに戻すことができる。この方法では、スタックを一時停止して再開する際に、スレッドローカルコンテキストを慎重に管理する必要がある。2つ目の経路は、Tokio向けのLocalEventLoopパターンを提案するもので、準備が整ったタスクをdrive()処理によって実行し、待機の代わりにホストのイベントループへ通知シグナルを送る。

ソケットとTCPネットワークのサポート

ネットワークのサポートも追加の課題だった。TokioはMioを介してepoll_wait()に依存している一方、Emscriptenはpoll()の限定的なサポートと、WebSocketをエミュレートする層を提供していた。そのためCloudflareは、-sNODERAWSOCKETS層を追加するため、Emscriptenに40件を超えるマージリクエストを貢献した。この層は、node:netインターフェースを通じてepoll、TCP、UDP、Unixソケットをサポートする。

WorkersはNode.jsインターフェースとの互換性を提供しているため、EmscriptenとCloudflareの間に別個の専用インターフェースを追加せず、同じブリッジをプラットフォーム内で利用できる。これらの機能は依然として実験的であり、Tokioの一部のパッチも、プロジェクトに最終的に統合される前のレビュー段階にある。

Minecraftサーバーによる実用テスト

互換性の範囲を検証するため、CloudflareのエンジニアであるDan Lapidは、Pumpkinとして知られるRust製のMinecraftサーバーをDurable Object内で実行した。Durable Objectは単一スレッドで動作するため、ゲームループ、リージョンのスケジューリング、Rayonのタスクは、独立したオペレーティングシステムのスレッドに依存するのではなく、Tokioループ内の協調的なタスクへ変換された。

サーバーはNode.jsインターフェースを通じてファイルシステムを利用し、worker-fs-mountライブラリによってファイルをDurable ObjectのSQLiteに保存した。また、プレイヤーの接続はTCP ingressを経由してオブジェクト内のTCPサーバーへ渡された。Cloudflareによると、これにより、状態を保存し、保存されたワールドからオブジェクトを再起動できるマルチプレイヤーMinecraftサーバーの実行が可能になった。

なぜこの進展が重要なのか

この変更の実用的な価値は、単に新しいコンパイルターゲットを追加することではなく、Workers上で動作させるために書き直す必要のあるライブラリやアプリケーションの数を減らす点にある。ただしCloudflareは、このサポートを実験的かつプレリリースと説明している。また、新しいTokioの設計、JSPIのサポート、一部のEmscripten統合は、依然として開発中であり、upstreamでレビューされている。そのため、この経路はネイティブRustアプリケーションの実行実験への道を開くものの、従来のすべての実行環境に対する完全かつ安定した代替手段であることは、まだ証明されていない。

ニュースの出典
Cloudflare Blog
原文を開く ↗
c
著者

certi.news Editorial Team

同じカテゴリー

おすすめ記事

すべてのニュースを見る