- Published on
WASMエコシステム2026 — Wasmtime・Wasmer・WasmEdge・Spin・Component Model・Extism 徹底ガイド(ブラウザを超えた汎用実行レイヤー)
- Authors

- Name
- Youngju Kim
- @fjvbn20031
プロローグ — 2008年の約束、2026年の請求書
2017年にWebAssembly 1.0 MVPがブラウザに入ったとき、約束は二つあった。「ブラウザでC/C++/Rustをほぼネイティブ速度で動かせる。」そして「いつかブラウザの外でも動かす。」9年が経った。一つ目の約束はFigma・AutoCAD Web・Photoshop Webで既に証明されている。二つ目の約束は — 正直に言えば — 2024年1月にWASI 0.2が finalized されてからやっと本当に動き始めた。
今は2026年5月。WASMは我々が気づかぬところでproductionを支えている。Cloudflare Workersの一部はV8 isolateではなくWasmtime上で走り、Shopify Functionsはマーチャントが投稿したRust/JSコードをWASMにコンパイルしてエッジで実行する。Fastly Computeは最初からWasmtimeベースだった。AWS LambdaはSnapStartの文脈で一部ワークロードのWASM化を検討中であり、Azure Container AppsはSpinKubeで正式にWASMワークロードを支える。「コンテナの次がWASM」という言葉はもう発表スライドの約束ではない — 請求書に載るホスティング単位になった。
この記事は2026年5月時点のWASMエコシステムを一気に描き出す。ランタイム4種(Wasmtime・Wasmer・WasmEdge・Spin)、標準(WASI 0.2/0.3・Component Model・WAC)、ツール(Jco・Extism・wasm-tools・Wash)、言語(Wing・Kotlin/WASM・Dart/WASM)、そして実際のproduction事例まで。どのツールをいつ使うのか、なぜComponent Modelが大変化なのか、そして韓国と日本で誰が使っているのか。
1. 2026年のWASM — どこまで来たか
まず1行サマリー。WASMはブラウザ用アクセラレータから「汎用実行レイヤー」へと成長した。 言葉は大げさだが意味は単純 — 同じ.wasmバイナリがブラウザ・サーバ・エッジ・組み込み・プラグインホストで動く。「一度書けばどこでも動く」という約束が(やっと)現実になった。
2026年時点のWASM座標。
| 領域 | 状況(2026.05) | 主要ツール |
|---|---|---|
| ブラウザ標準 WASM 1.0 | 全主要ブラウザでGA | V8・SpiderMonkey・JavaScriptCore |
| Reference Types・SIMD | GA | 同上 |
| Tail Call・Multiple Memories | GA | 同上 |
| GC提案 | 全主要ブラウザでGA(2024後半) | Kotlin/WASM・Dart/WASM実戦 |
| Exception Handling | GA | C++例外・Java例外 |
| Threads・Atomics | 部分GA(cross-origin isolated必須) | rayon・OpenMP移植 |
| サーバサイド WASI 0.1 | 安定 | Wasmtime 1+ |
| サーバサイド WASI 0.2(Component Model) | GA(2024.01) | Wasmtime 17+ |
| サーバサイド WASI 0.3(async) | GA(2025 Q4) | Wasmtime 28+ |
| ランタイム — 標準OSS | 4強+小勢 | Wasmtime・Wasmer・WasmEdge・Spin |
| パッケージレジストリ | 分断(wasmer.io / OCI / wa.dev) | wapm・warg・OCI |
| コンテナ統合 | k8sで正式対応 | containerd shim・runwasi・SpinKube |
| プラグインシステム | あらゆる言語ホスト | Extism・wasmtime embed API |
| クラウドネイティブ言語 | 登場 | Wing・Grain・MoonBit |
核心的洞察3つ。
第一に、Component Modelが最大の変化だ。 2017年のWASM 1.0は「コアモジュール」しか定義していなかった。コアモジュールはi32・i64・f32・f64・メモリ・テーブルしか知らない。文字列を受け渡せない。だからホストとゲストが文字列を交換するには毎回「メモリのアドレスXからNバイト読め」というABI協議が必要だった。Component ModelはそのABIを標準としてまとめた。Rustで書いたモジュールをPython・Go・JSのホストが個別のグルーコードなしで呼び出せる。これが本当に動き始めたのが2024年1月だ。
第二に、ランタイムが4強に絞られた。 2020年に10以上あったWASMランタイムが事実上4つに整理された。Bytecode AllianceのWasmtime(標準)、Wasmer(商用+レジストリ)、WasmEdge(CNCF・エッジ)、Spin(サーバレスプラットフォーム)。残りは組み込み特化(WAMR・wasm3)か停滞気味。
第三に、2026年のWASMは「使う」段階であって「待つ」段階ではない。 2022年までは「いつproduction-readyになるか」が話題だった。2026年は「どのツールでどのワークロードを移すか」が話題だ。自分のチームが使っていなくても、社内の別チームは使っている可能性が高い。
2. WASI 0.2 Component Model(2024.01) — なぜ大変化なのか
Component Modelを一言で言えば — 言語非依存の呼び出し規約(calling convention)+ インターフェース定義言語(IDL)+ 型システムだ。gRPCがProtobufでサービス間RPCを標準化したことを、WASMモジュール間でやったような話。
まず既存のコアWASMの限界。コアモジュールは次の型しか知らない。
i32, i64, f32, f64, v128, funcref, externref
文字列・構造体・オプション型・結果型(Result) — どれもない。だからRustモジュールがJSホストにstringを返すには、毎回「メモリのアドレスXからNバイトUTF-8で読め」という合意を再設計する必要があった。wasm-bindgenはこれを自動化したが、JS限定だった。
Component Modelが導入したもの — 4つ。
- WIT(Wasm Interface Type) — IDL。.witファイルにインターフェースを宣言する。record・variant・option・result・list・stringのような高水準型を使う。
- Canonical ABI — WIT型がコアWASMのi32・i64・メモリレイアウトにどう写るかを定めた標準ABI。すべての言語が同じ規約に従う。
- コンポーネント(component) — コアモジュール+WITインターフェース+インポート/エクスポート仕様をまとめた単位。.wasmファイルだがヘッダが異なる(layer 1 = モジュール、layer 2 = コンポーネント)。
- WASI標準インターフェース — wasi:filesystem、wasi:http、wasi:cli、wasi:clocks、wasi:random、wasi:sockets、wasi:ioなどがWITで標準定義された。
たとえばこんな.witファイル。
package example:greeter@0.1.0;
interface greet {
hello: func(name: string) -> string;
}
world greeter {
export greet;
}
Rustで実装すると:
wit_bindgen::generate!({
world: "greeter",
});
struct Component;
impl exports::example::greeter::greet::Guest for Component {
fn hello(name: String) -> String {
format!("Hello, {}!", name)
}
}
export!(Component);
要点は — このモジュールをRust・Python・Go・JS・C#のホストがすべて同じ方法で呼び出せること。wasm-bindgenはJSホストだけだった。Component Modelはすべてのホストで動く。
2026年5月現在、WASI 0.2インターフェースが定義されている領域 — wasi:filesystem(ファイル)、wasi:http(HTTPクライアント/サーバ)、wasi:cli(CLI引数・環境変数)、wasi:sockets(TCP/UDP)、wasi:clocks(時計)、wasi:random(乱数)、wasi:logging(ログ)、wasi:keyvalue(KVストア・proposal)、wasi:blobstore(オブジェクトストア・proposal)。次のステップはwasi:nn(機械学習推論)とwasi:graphics(GPU)。
3. WASI 0.3(2025 Q4) — Asyncサポート到来
WASI 0.2の最大の制約はasyncがなかったこと。wasi:httpクライアントで外部APIを呼ぶとblockingだった。サーバを書くとき、「リクエストAの処理中にリクエストBを処理する」ができなかった。
WASI 0.3はこれを解決する。2025年Q4にWasmtime 28+ と wit-bindgen 0.36+ でGA。変更の核は2つ。
- WITに
asyncキーワード追加。 関数宣言にasyncを付けるとfutureを返す。 stream<T>とfuture<T>型。 標準ライブラリレベルで非同期ストリームを扱う。
たとえば:
package example:fetcher@0.3.0;
interface fetch {
use wasi:http/types@0.3.0.{request, response};
async fetch: func(req: request) -> result<response, string>;
}
Rust実装:
impl Guest for Component {
async fn fetch(req: Request) -> Result<Response, String> {
let client = wasi::http::outgoing_handler::handle(req).await?;
Ok(client.into_response().await?)
}
}
内部的にはwit-bindgenがfuture・promiseのpollingをcanonical ABIに変換する。ホストから見ると、コンポーネントが一時停止(pause)して別作業へ譲るyieldポイントが生まれたことになる。これが重要な理由は — WASMサーバを1インスタンスで多重化できるからだ。0.2までは「リクエストごとにインスタンス」が事実上強制だった。
ただし注意 — 2026年5月時点で asyncを完全にサポートするゲスト言語はRust(wit-bindgen)・JS(Jco)のみ。Go・Python・C#は部分対応で、安定化は2026年後半の見込み。
4. Wasmtime — Bytecode Alliance標準
WasmtimeはBytecode Alliance(Mozilla・Fastly・Intel・Microsoft・Armなど)が共同開発するリファレンスランタイム。2026年5月時点でWasmtime 30+。月1回メジャーバージョンを切る運用(2024年1月の17.0 → 2026年5月の30+)なのでバージョン番号が早く上がる。
Wasmtimeの座標 — 1行サマリー。
「WASI/Component Model標準の事実上のリファレンス実装。JIT(Cranelift)コンパイラベース。安全性と正確性を最優先。」
主な特徴5つ。
- Cranelift JIT — 自前のコンパイラバックエンド。SpiderMonkeyのCranelift移植も同じコードベース。AOTコンパイル(
wasmtime compile)も対応。 - Pulleyインタプリタ — Wasmtime 25+ から導入された自前のインタプリタ。JITが使えない環境(iOS、JIT禁止ホスト)でのfallback。
- WASI 0.2/0.3 first-class — Component Model標準実装。wit-bindgenが生成するRustコードはWasmtimeのRust APIに直接マッピングされる。
- ホスト埋め込みAPIが豊富 — Rust・C・Python・.NETの埋め込み。ホスト関数をコンポーネントへ公開する方法が標準化されている。
- フォークが多い — Cloudflareは自社用フォークをV8 isolateと並行で動かし、Fastly ComputeはWasmtimeベース。
基本使い方 — CLI。
# 1. Rustでコンポーネントをビルド
cargo build --target wasm32-wasip2 --release
# 2. Wasmtimeで実行
wasmtime run --invoke 'hello("world")' \
./target/wasm32-wasip2/release/greeter.wasm
Rust埋め込みAPI。
use wasmtime::{Engine, Store, component::{Component, Linker}};
fn main() -> anyhow::Result<()> {
let engine = Engine::default();
let component = Component::from_file(&engine, "greeter.wasm")?;
let linker = Linker::new(&engine);
let mut store = Store::new(&engine, ());
let instance = linker.instantiate(&mut store, &component)?;
let hello = instance
.get_typed_func::<(String,), (String,)>(&mut store, "hello")?;
let (result,) = hello.call(&mut store, ("world".into(),))?;
println!("{}", result);
Ok(())
}
いつWasmtimeを選ぶか — ほぼ常に。標準追従が強く、新機能が最も早く入り、ドキュメントが最も厚い。迷ったらWasmtime。
5. Wasmer — 商業志向のランタイム+レジストリ
Wasmerは2018年に設立されたWasmer Inc.が作るランタイム。Bytecode Allianceには(一度入って出た後)属していない。だから標準追従よりもプロダクト化・DX・配布に重きが置かれる。
Wasmerの座標。
「実用性最優先。マルチコンパイラバックエンド(Singlepass・Cranelift・LLVM)。wasmer.ioパッケージレジストリ(=wapm後継)。Edge・Functionホスティングサービス。」
差別化4点。
- コンパイラを選べる。 Singlepass(コンパイル速い・実行遅い)、Cranelift(バランス)、LLVM(コンパイル遅い・実行速い)。サーバ起動時はLLVM、JIT環境ではSinglepassのような使い分け。
- wasmer.ioレジストリ。 npmのようなWASMパッケージレジストリ。
wasmer run wasmer/pythonで公開パッケージを即実行。これがwapmの後継。 - Wasmer Edge. 自社サーバレス/エッジホスティング。Cloudflare Workersに近いモデルだがWASMコンポーネントがfirst-class。
- WASIX. Wasmer独自のPOSIX拡張仕様。WASI 0.2 +追加システムコール(threads・fork・full sockets)。ただし標準ではなくWasmer専用 — 2026年現在、他ランタイムでは動かない。
基本使い方。
# パッケージレジストリから即実行
wasmer run wasmer/python -- -c "print('hello')"
# ローカル.wasm実行
wasmer run ./hello.wasm
Rust埋め込み。
use wasmer::{Store, Module, Instance, imports, Function};
fn main() -> anyhow::Result<()> {
let mut store = Store::default();
let wat = r#"(module
(func (export "add") (param i32 i32) (result i32)
local.get 0
local.get 1
i32.add)
)"#;
let module = Module::new(&store, wat)?;
let imports = imports! {};
let instance = Instance::new(&mut store, &module, &imports)?;
let add = instance.exports.get_typed_function::<(i32, i32), i32>(&store, "add")?;
println!("{}", add.call(&mut store, 7, 35)?);
Ok(())
}
いつWasmerを選ぶか — WASIXのPOSIX拡張が必要なとき(既存Linuxバイナリに近い環境)、wasmer.ioレジストリでパッケージ配布したいとき、またはWasmer Edgeにホスティングするとき。Component Model追従ではWasmtimeが先行する。
6. WasmEdge — CNCF、エッジ/IoT特化
WasmEdgeはCNCF Sandbox(2021)→ Incubating(2024)へ昇格したランタイム。Second Stateという会社が主導するがCNCFガバナンス下にある。座標は明確。
「エッジ・IoT・サーバレス特化。AOTコンパイル優先。小さいバイナリ・低メモリ。コンテナランタイム統合(runwasi・crun)。」
差別化4点。
- AOT first. WasmEdgeはLLVM AOTコンパイルをデフォルト推奨。起動時間が短く(コールドスタート ~ms)、メモリフットプリントが小さい。WasmtimeはJITがデフォルト。
- コンテナランタイム統合. Docker DesktopがWasmEdge経由で
docker run --runtime=io.containerd.wasmedge.v1のように.wasmコンテナをサポート。crun(OCIランタイム)にもWasmEdgeバックエンドがある。 - wasi:nn実装が豊富。 TensorFlow Lite・OpenVINO・llama.cppバックエンドを含む。エッジでLLM・ビジョン推論を回すのに使う。2026年時点でggml(llama.cpp)バックエンドにより7B/13Bモデルをエッジで動かす事例が多い。
- 言語SDKが多い。 Rust・Go・JS(QuickJS埋め込み)・Python(pyo3-asyncioアダプタ)・C/C++。JSの場合はQuickJSをWASMにコンパイルした上でJSを動かす形。
基本使い方。
# AOTコンパイル
wasmedge compile hello.wasm hello.aot.wasm
# 実行
wasmedge --dir .:. hello.aot.wasm
llama.cppバックエンドでモデル推論。
wasmedge --dir .:. \
--nn-preload default:GGML:AUTO:llama-2-7b.Q5_K_M.gguf \
llama-chat.wasm default
いつWasmEdgeを選ぶか — コールドスタートが本当に重要なとき(エッジ関数・IoT)、Docker/k8sにWASMコンテナとして統合したいとき、またはエッジでLLM/ビジョン推論を回すとき。Component Model追従はやや遅れるが、コアWASM性能は最速級。
7. Spin(Fermyon) — サーバレスWASMプラットフォーム
SpinはFermyonが2022年に発表したサーバレスWASMフレームワーク+CLI+ランタイム。2026年現在Spin 3.x。内部ランタイムにWasmtimeを使い、その上に「関数型サーバレス」抽象を載せている。Cloudflare WorkersのWASM版 — というのが近いイメージ。
座標。
「WASMコンポーネント=関数。spin.tomlでトリガー(HTTP・Redis・Cron)を宣言。CLIでビルド・実行・デプロイ。SpinKubeでk8s運用。」
中心概念 — Spin App = N個のコンポーネント。
# spin.toml
spin_manifest_version = 2
[application]
name = "hello"
version = "0.1.0"
[[trigger.http]]
route = "/hello"
component = "hello-handler"
[component.hello-handler]
source = "target/wasm32-wasip2/release/hello.wasm"
allowed_outbound_hosts = ["https://api.example.com"]
Rustハンドラ:
use spin_sdk::http::{IntoResponse, Request, Response};
use spin_sdk::http_component;
#[http_component]
fn handle_hello(req: Request) -> anyhow::Result<impl IntoResponse> {
Ok(Response::builder()
.status(200)
.header("content-type", "text/plain")
.body("Hello from Spin!")
.build())
}
# ローカル実行
spin build
spin up
# Fermyon Cloudへデプロイ
spin deploy
Spinの差別化。
- Component Model first. Spin 2以降、WASI 0.2コンポーネントがデフォルト。
- トリガーが多彩. HTTP・Cron・Redis Stream・Kafka・MQTT。各トリガーが別コンポーネントを呼び出す。
- ホストコンポーネントが豊富. wasi:keyvalue(KV・Redis・Postgres)、wasi:sqlite(SQLite・Turso)、wasi:llm(ローカルLLM推論)、wasi:mqtt(IoT)。ゲストコードは標準インターフェースだけを呼び、Spinがバックエンドをルーティングする。
- SpinKube. k8sでSpinアプリをCRDで運用。
kind: SpinAppを作るとk8sがWasmtimeノードプールで実行する。コンテナなしでWASMだけ回すk8sクラスタを作れる、という意味。
いつSpinを選ぶか — サーバレス関数をWASMで書くとき、マルチトリガーワークロード(HTTP + Cron + Redis)、またはk8s上でWASM関数プラットフォームを運用したいとき。Cloudflare Workersのセルフホスト版というのも誤りではない。
8. Extism — あらゆる言語のためのプラグインシステム
Extismはやや毛色の違うプロジェクト。「WASMをランタイムとして使うのではなく、プラグインシステムとして使おう」が1行サマリー。Dylibsoという会社が作る。
基本アイデア — ホストアプリケーションがユーザーの書いたコードを安全に実行するにはどうするか? 昔の答え:組み込みLua/JSインタプリタ。新しい答え:WASM。どんな言語で書こうと.wasmにコンパイルすればホストがsandboxで実行する。
Extismの差別化。
- 15+言語のSDK. Rust・Go・Python・Node.js・Ruby・PHP・Java・Kotlin・.NET・Elixir・Zig・C++・Haskell・OCaml・Swift。ホスト側SDKカバー範囲が最も広い。
- PDK(Plugin Development Kit). プラグイン作者側SDKも多彩 — Rust・Go・JS・AssemblyScript・Zig・C++など。
- 標準ABI. Extism独自のABI(
extism_input_length・extism_alloc・extism_log_info等)があり、ホスト-プラグイン間通信を規格化する。 - Component Model部分統合. 2025年からWASIコンポーネントもロードできる(完全互換ではないが大半は動く)。
ホスト側Go SDKの例:
import "github.com/extism/go-sdk"
func main() {
manifest := extism.Manifest{
Wasm: []extism.Wasm{
extism.WasmFile{Path: "count_vowels.wasm"},
},
}
plugin, _ := extism.NewPlugin(ctx, manifest, extism.PluginConfig{}, nil)
_, output, _ := plugin.Call("count_vowels", []byte("hello world"))
fmt.Println(string(output))
}
プラグイン側Rust PDK:
use extism_pdk::*;
#[plugin_fn]
pub fn count_vowels(input: String) -> FnResult<i64> {
let count = input.chars().filter(|c| "aeiouAEIOU".contains(*c)).count();
Ok(count as i64)
}
いつExtismを使うか — 自社プロダクトに「ユーザーコード実行」機能を入れるとき。例:SaaSのwebhook処理・DBトリガー関数・ゲームMODシステム・Notion風ワークスペースの自動化。Component Model標準への100%準拠より「いま全言語ホストで使えるプラグインABI」が重要なとき。
9. Wing(Winglang) — WASM+IaC融合言語
Wingは2022年にMonadaが発表したクラウドネイティブプログラミング言語。2024年1.0、2026年現在2.x。座標は独特だ。
「単一の言語でアプリケーションコード(ランタイム)とインフラ(コンパイル時)を同時に表現。コンパイラがTerraform・CloudFormation・k8s YAMLとWASMバイナリを同時出力。」
中心概念 — 2フェーズ(phase)モデル。 すべてのコードが preflight(コンパイル時、インフラ)または inflight(ランタイム、関数本体)のいずれかに属する。
bring cloud;
let bucket = new cloud.Bucket();
let queue = new cloud.Queue(timeout: 1m);
queue.setConsumer(inflight (msg: str) => {
bucket.put("msg-{util.nanoid()}", msg);
});
このコードを wing compile -t tf-aws でコンパイルすると — preflightコードはTerraform HCLに変換(S3 bucket + SQS queue + Lambda function)され、inflightコードは.wasmまたは.jsにコンパイルされてLambdaへデプロイされる。-t sim を使うと同じコードがローカルシミュレータで動く — AWSを立てずに。
WingがWASMエコシステムで面白いのは — inflightコードのコンパイルターゲットの一つが.wasm(主にcomponent)であること。だからWingで書いた関数がSpinKubeのようなWASMプラットフォームに直接デプロイされる。2026年のWing 2.xでは wing compile -t spin-kube が正式サポートされる。
いつWingを使うか — インフラとアプリケーションを一つの言語でまとめたいとき、マルチクラウド抽象が必要なとき、またはWASM関数プラットフォームへIaC統合でデプロイするとき。CDK・Pulumiの次世代を狙う。
10. ブラウザWASM — GC提案、Kotlin/WASM、Dart/WASM
サーバサイドの話が長かったが、WASMの出発点はブラウザだった。2024-2026年のブラウザWASMで最大の変化は — GC(Garbage Collection)提案の主要ブラウザGA。
WasmGC以前、JVM・CLR・V8のようなGC言語をWASMにコンパイルするには自前のGCをWASMの上に実装する必要があった(linear memory内にヒープを置きmark-sweepを回す形)。結果 — メモリ使用量が2-3倍、コードサイズが大きい、ブラウザのGCと衝突(JSとWASMヒープが別々に走りcross-reference非効率)。
WasmGCはWASMレイヤーでGCオブジェクト・struct・arrayを定義する。だからコンパイラはhost GC(V8・SpiderMonkey)に委譲できる。
2026年5月時点のWasmGC利用事例。
- Kotlin/WASM(JetBrains) — 2024年Beta、2025年Stable。Compose Multiplatform Webターゲットのデフォルトコンパイラ。Compose for WebアプリがKotlin/WASMでビルドされ、dart-native比30-50%小さいバンドル、ほぼネイティブ速度。
- Dart/WASM(Google) — 2024年Stable。Flutter Webの新レンダラ(impeller・CanvasKit次世代)がDart/WASMベース。Flutter Webアプリの起動時間が半減。
- Java/WASM(TeaVM・CheerpJ) — TeaVMがWasmGCバックエンドを正式サポート。既存のJava GUIアプリ(Swing含む)がブラウザで動くようになった。
- OCaml/WASM(Wasm_of_ocaml) — 2025年リリース。Js_of_ocamlの後継。
非GC言語(Rust・C/C++・Zig)は依然としてlinear memoryのみを使う — 自前のメモリ管理がある言語のため、GCは要らない。
ブラウザWASMのもう一つの大きな論点 — Component Modelをブラウザに持ち込むか。 いまのところ「ノー」。ブラウザWASMはJSとのABI統合にwasm-bindgen/Jcoで十分で、Component Modelはサーバサイド利用に最適化されている。ただしJco(JSコンポーネントランタイム)がブラウザでも動くため、結果的に迂回路は開いている。
11. 誰が実際にWASMをproductionで使っているか
理論はもう十分なので実例を見る。2026年5月時点で確認済みのproduction利用事例(公開発表・ブログ・カンファレンス基準)。
Cloudflare Workers
V8 isolateベースで知られているが、2024年から一部ワークロードはWasmtimeベースのコンポーネントで動く。特にWorkers AI、Durable Objectsの一部バックエンド、そしてWorkers for Platformsのサードパーティコード実行。Workers Component Bindings(2025年後半発表)はComponent Modelコンポーネントを直接Workersにデプロイできる。
Shopify Functions
Shopifyが2022年からマーチャントが投稿したRust/JSコードをWASMにコンパイルし、チェックアウト・割引・配送ロジックを実行している。バックエンドはWasmtime。1リクエストあたり~5ms・1MBメモリ上限。2026年時点で日次10億+ 呼び出し。
Fastly Compute
Fastlyのエッジコンピュートプラットフォーム。最初からWasmtimeベース。2026年時点でComponent Modelがデフォルト(WASI 0.2)。FastlyはBytecode Allianceのコアメンバーでもある。
Figma
Figmaのレンダリングコアは C++ で書かれ、WASMにコンパイルされる。 2017年から。Figma Desktopも同じWASMモジュールをElectron内で動かす。これが可能な理由 — WASMのSIMD・ThreadsがGAされてほぼネイティブ速度が出るから。
Adobe(Photoshop Web・Illustrator Web)
Photoshopの中核画像処理エンジン(C++)をEmscriptenでコンパイルしブラウザで動かす。2021年Photoshop Web Beta、2023年Illustrator Web。フルデスクトップPhotoshopの30-50%機能がブラウザで動作。
AutoCAD Web
AutoDeskが2018年からAutoCADのC++コアをWASMでビルド。2D/3D CADをブラウザでフル機能。
Disney+、Microsoft Office for Web
Disney+動画プレーヤーの一部(コーデック追加処理)とOffice for WebのExcel・WordコアがWASMにコンパイルされたC++モジュールに依存。
Bloomberg Terminal Web
2024年リリース。1990年代のC++ベースターミナルをWASMに移してブラウザで動作。
12. 韓国・日本のWASM活用事例
海外事例ほど頻繁に取り上げられないが、韓国・日本でもproduction利用がある。公開資料ベース。
LINE — 日本・韓国
LINEの一部エッジワークロードがWASMコンポーネントで運用されている。特にチャットメッセージのスパム・不正コンテンツフィルタリングがWasmtimeベースのサイドカーで動く。LINE Engineering Blogで2024年に発表。メリットは — ルール更新をコンテナ再デプロイなしに.wasmモジュール差し替えで済むこと。
Toss — 韓国
Tossの一部セキュリティ検証ロジック(クライアント改ざん検出)がWASMにコンパイルされたRustモジュールで動く。トスペイメンツでもPGマーチャントが投稿した検証ルールをExtismベースで実行。SLASH 2024カンファレンスで一部公開。
Coupang — 韓国
Coupangの検索ランキング推論の一部がWasmEdge + wasi:nnの上で動く — 正確にはONNXモデルをWasmEdgeに統合した形。検索レイテンシ安定性と多言語モデル統合に有利。
ZOZO — 日本
ZOZOTOWNのレコメンドシステムA/Bテスト基盤で実験的なルールをWASMモジュールとしてデプロイ。ルール変更をビルドなしのホットリロードで行うため。2025年ZOZO Tech Blogで公開。
Mercari — 日本
Mercariの決済検証の一部(特に本人確認ルールエンジン)がWASMベース。2026年初頭のMercari Engineering Blogで事例公開。
CyberAgent — 日本
CyberAgentの広告配信の一部エッジロジックをSpinKubeで運用。Spin/SpinKubeをproductionに最も積極的に投入した日本事例の一つ。
NTTドコモ・KDDI
5G MEC(Multi-access Edge Computing)ノードでWasmEdgeをコンテナ代替として実験中。小さなフットプリントと速いコールドスタートが5Gエッジに合う。2025年NTT Technical Reviewで事例掲載。
13. ツール集 — WAC・Jco・wasm-tools・Wash
最後に日常的に使うツール集。
wasm-tools
Bytecode Allianceの万能CLI。迷ったらまずwasm-tools。
# コンポーネントヘッダ確認
wasm-tools component wit greeter.wasm
# コンポーネント検証
wasm-tools validate --features all greeter.wasm
# WATへディスアセンブル
wasm-tools print greeter.wasm | less
# コンポーネント -> 組み立てたコアモジュール
wasm-tools component unbundle greeter.wasm
WAC(WebAssembly Composition)
複数のコンポーネントを合成してより大きなコンポーネントを作るツール。 Component Modelの真価はコンポジションにある。WACがそれを可能にする。
# authコンポーネント+storageコンポーネントを束ねてappコンポーネントへ
wac compose -d auth=./auth.wasm -d storage=./storage.wasm \
-o app.wasm composition.wac
package example:app;
let auth = new auth:lib { ... };
let storage = new storage:lib { ... };
let app = new app:lib {
authenticator: auth.authenticator,
store: storage.store,
};
export app...;
Jco(JavaScript Component Toolkit)
JSとComponent Modelの架け橋。 双方向対応。
- .wasmコンポーネントをJSから呼ぶ —
jco transpile greeter.wasmでESモジュールラッパーを生成。 - JSソースをコンポーネントへコンパイル —
jco componentize greet.js -w greet.witで.wasmコンポーネント生成(StarlingMonkey JSエンジン埋め込み)。
# RustコンポーネントをJSから使う
jco transpile ./greeter.wasm -o ./out
# out/greeter.js, out/greeter.d.ts, out/greeter.core.wasm が生成される
import { hello } from './out/greeter.js'
console.log(hello('world')) // "Hello, world!"
Wash(wasmCloud Shell)
wasmCloudのCLI/REPL。wasmCloudは別のWASMプラットフォームで、分散アクター(actor)モデルの上にコンポーネントを載せるアプローチ。NATSメッセージバス上でアクターが通信する。
# ローカルwasmCloudホスト起動
wash up
# コンポーネント(アクター)起動
wash start component ghcr.io/wasmcloud/components/http-hello-world-rust:0.1.0
# capability provider(HTTPサーバ)起動
wash start provider ghcr.io/wasmcloud/http-server:0.20.0
いつwasmCloudを使うか — 分散アクターモデルが合うワークロード(IoT・ゲームサーバ・分散シミュレーション)、多数のノードへコンポーネントを動的にデプロイする必要があるとき。Spinが「サーバレス関数」ならwasmCloudは「分散アクターメッシュ+コンポーネント」。
エピローグ — 2026年にWASMをどう見るか
ここまでが2026年5月のWASMエコシステム地図だ。頭に入るようにもう一度縮めると:
- 標準が固まった。 WASI 0.2(コンポーネントモデル)が2024.01 GA、WASI 0.3(async)が2025 Q4 GA。「待つ段階」は終わった。
- ランタイムは4強。 Wasmtime(標準)、Wasmer(商用+レジストリ)、WasmEdge(エッジ/IoT)、Spin(サーバレスプラットフォーム)。迷ったらWasmtime。
- WASM最大の価値はもはや「速いブラウザコード」ではない。 「一度ビルドしてブラウザ・サーバ・エッジ・プラグインホストすべてで動く」汎用実行レイヤーだ。Component Modelがそれを可能にした。
- 誰が使っているか — 大手はすでにproductionで使っている。 Cloudflare・Shopify・Fastly・Figma・Adobe・LINE・Toss・Coupang・ZOZO・Mercari・CyberAgent。
- いつ使うか — (a) ユーザーコードを安全に実行する必要があるとき(Extism)、(b) エッジ関数のコールドスタートが短くなければならないとき(Spin・WasmEdge)、(c) 多言語ライブラリをサーバサイドで呼び出すとき(Wasmtime+Component Model)、(d) 重いネイティブロジックをブラウザへ持っていくとき(Emscripten・wasm-bindgen)。
- いつ使わないか — 普通のマイクロサービス、ネイティブOS APIが深く必要なコード、GPU直接アクセス(wasi:graphicsはまだ標準化中)、既存のコンテナワークロードで満足のとき。
最後に一行。2017年にWASM 1.0がブラウザに入ったとき、9年後にCloudflare・Shopify・LINEがproductionで回しているとは誰が予想しただろう。標準が一つGAになるのに7年、市場がその標準に乗るのにさらに2年。 これがインフラが固まる速度だ。今が2026年で、自分のチームが使わないなら隣のチームが使っている。
参考文献 / References
- WebAssembly公式サイト: https://webassembly.org/
- WASI 0.2 finalized発表(Bytecode Alliance, 2024.01): https://bytecodealliance.org/articles/WASI-0.2
- WASI 0.3 — async導入: https://bytecodealliance.org/articles/wasi-0-3
- Component Model仕様: https://github.com/WebAssembly/component-model
- WITフォーマット文書: https://component-model.bytecodealliance.org/design/wit.html
- Wasmtime: https://wasmtime.dev/
- Wasmtime GitHub: https://github.com/bytecodealliance/wasmtime
- Wasmer: https://wasmer.io/
- Wasmer GitHub: https://github.com/wasmerio/wasmer
- WasmEdge: https://wasmedge.org/
- WasmEdge CNCF Incubating: https://www.cncf.io/projects/wasmedge/
- Spin(Fermyon): https://spinframework.dev/
- Spin GitHub: https://github.com/spinframework/spin
- SpinKube: https://spinkube.dev/
- Extism: https://extism.org/
- Extism GitHub: https://github.com/extism/extism
- Wing(Winglang): https://www.winglang.io/
- Wing GitHub: https://github.com/winglang/wing
- wasm-tools: https://github.com/bytecodealliance/wasm-tools
- WAC(WebAssembly Composition): https://github.com/bytecodealliance/wac
- Jco(JS Component Toolkit): https://github.com/bytecodealliance/jco
- wasmCloud: https://wasmcloud.com/
- Wash CLI: https://wasmcloud.com/docs/cli
- WebAssembly GC提案: https://github.com/WebAssembly/gc
- Kotlin/WASM(JetBrains): https://kotlinlang.org/docs/wasm-overview.html
- Dart/WASM(Google): https://dart.dev/web/wasm
- Cloudflare Workers Component Bindings: https://blog.cloudflare.com/wasi-and-component-model-workers
- Shopify Functions: https://shopify.dev/docs/api/functions
- Fastly Compute: https://www.fastly.com/products/edge-compute
- Figmaレンダリングエンジンと WASM: https://www.figma.com/blog/webassembly-cut-figmas-load-time-by-3x/
- Photoshop Web(Adobe): https://blog.adobe.com/en/publish/2021/10/26/share-the-magic-of-photoshop-on-web-beta
- AutoCAD Web: https://www.autodesk.com/products/autocad-web-app/overview
- Bytecode Alliance: https://bytecodealliance.org/
- runwasi(containerd shim): https://github.com/containerd/runwasi
- crun WASMバックエンド: https://github.com/containers/crun
- LINE Engineering Blog: https://engineering.linecorp.com/ja/blog
- Toss SLASHカンファレンス: https://toss.tech/slash
- ZOZO TECH BLOG: https://techblog.zozo.com/
- Mercari Engineering Blog: https://engineering.mercari.com/
- NTT Technical Review: https://www.ntt-review.jp/