Webナイト宮崎 · 2026-07-03

476バイトの Hello World から、
ブラウザで動く LLM まで

自作言語 Almide で見てきた WebAssembly の現在地

@O6lvl4 — Almide という「LLM のための言語」を作っています

まずこれを見てください
// hello.almd — ソースはこれで全部
fn main() -> Unit = {
  println("Hello, world!")
}
$ almide build hello.almd --target wasm
$ ls -l hello.wasm
-rw-r--r--  1 o6lvl4  staff  476
$ wasmtime hello.wasm
Hello, world!
476 bytes

kB ですらない。rustc も LLVM も呼ばれていない。

WASM は、ここまで小さくなれる

プログラム.wasm のサイズ
Hello World476 B
Fibonacci(再帰)787 B
FizzBuzz910 B
クロージャ979 B
代数的データ型 + match3,828 B
  • .wasm はブラウザ専用ではなく、どこでも動く小さな実行ファイル形式
  • 476 B の中にメモリ管理も文字列処理も同梱 — 依存ゼロで自己完結
  • 最適化ツール wasm-opt をかけても 0〜4 バイトしか縮まない — ほぼフォーマットの下限

この .wasm を吐いたのは自作言語 Almide(LLVM を使わず WASM を直接出力)。道具の紹介はのちほど 1 枚だけ。

WASM が動いている場所 — 8 クラスタ

① ブラウザ
Figma / Photoshop Web / Unity / FFmpeg.wasm — 圧倒的成熟
② Edge / サーバレス
Fastly Compute は WASM ネイティブで起動 35µs。Cloudflare Workers も WASM 対応
③ プラグイン基盤
Envoy / Shopify Functions / Zed — 覇権争い中
④ ブロックチェーン
NEAR / CosmWasm / Internet Computer — 決定論が核
⑤ 組込み
WAMR / ESP32 — OTA 更新 = .wasm 配布
⑥ データ / DB
SQLite-wasm / DuckDB-wasm(Postgres は拡張で実験段階)
⑦ AI 実行サンドボックス
MCP サーバ / エージェントのツール実行 — 2024–26 急成長
⑧ AI 推論
ONNX Runtime Web / whisper.cpp — 端末内 LLM

緑枠 はすでに本番技術。ブラウザは 8 分の 1 にすぎない。

今日の道具(この 1 枚だけ)

自作言語 Almide — 今日の .wasm は全部これ製

  • AI(LLM)が正確に書けることを目標に設計した自作言語。コンパイルすると Rust か WASM が出てくる
  • WASM へは直接出力 — さっきの 476 B の正体。この小ささが、以降のデモ全部の土台
  • ネットやファイルなどの副作用が型に現れる設計 — WASM の「権限を絞って安全に動かす」文化と噛み合う

言語そのものの話(AI との相性、メモリ安全の形式検証など)は今日は割愛 — github.com/almide

§1

WASM だと、
こんなことができる

ここからは実物です。中身は全部、自作言語 Almide 製の .wasm — 数字はすべて実測値。

0.5 KB から 148 KB までに、これだけ入る

1 KB 10 KB 100 KB 1 MB ※対数目盛 Hello World0.5 KB 音が鳴るシンセ2.6 KB 2D の棒グラフ描画5.8 KB 3D の球の描画6.6 KB 参考: 同じ処理を Rust で11.2 KB 音質補正イコライザ11.5 KB 3D 回転キューブ(WebGL)17.3 KB 1-bit LLM を動かすエンジン36.9 KB UI アニメーションエンジン55.0 KB 音声認識エンジン(Whisper)83.5 KB UI フレームワーク一式148.1 KB 参考: 初代ポケモンの ROM512 KB

灰色は参考点。Rust + wasm-bindgen は同じ 3 関数で 11.2 KB(Almide 版は 1.5 KB — 差の大半はランタイム)。青と緑を全部足しても約 359 KB — 初代ポケモン 1 本(512 KB)の 3 分の 2。Almide 分は全バイナリ実測。

live demo ① 音

2,637 バイトで、音が鳴る

  • AudioWorklet(音声専用スレッド)の中で 8 倍音加算シンセが動く。ソースは 61 行の .almd
  • 制約の世界: 128 サンプルごと・予算 2.6ms・malloc / IO / DOM 禁止
  • 実測 128 フレーム 18µs — 予算 2,667µs の 0.7%、リアルタイム余裕 約 140 倍(SIMD もバッチングもなしで)
https://o6lvl4.github.io/almide-audio-poc/  # その場で鳴らせます

グラフィックスも直 emit で桁が変わる

Canvas 2D
棒グラフデモ一式で 5,792 B。JS 側は薄い glue だけ
WebGL
シェーダ込みの回転キューブで 17,267 B
obsid(3D ランタイム)
メッシュ + オービットカメラ + ライティング。同じ .wasm がブラウザでも、wasmtime + wgpu 経由でデスクトップでも動く
https://almide-graphics.github.io/obsid/  # Heightmap / 球 / トーラス切替・ドラッグで回せます
live demo ② GPU UI

UI フレームワークごと WASM に入れる — 145 KB

  • 全 UI 要素を WebGPU compute shader で描画(Canvas 2D 不使用)
  • Yoga 互換 Flexbox(準拠テスト 74 本)、仮想リスト、リアクティブ状態管理
  • DOM オーバーレイでテキスト選択・コピー・IME 入力・ARIA まで成立
# ライブデモ(WebGPU = Chrome 系で)
https://almide-graphics.github.io/ceangal/
https://almide-graphics.github.io/ceangal/stress.html  # 5000 要素 + FPS HUD
live demo ③ コンパイラ

WASM が、その場で WASM を生む

  • Almide コンパイラ(Rust 製)を丸ごと WASM 化 — 約 6 MB の .wasm がブラウザで動く
  • parse → 型検査 → codegen まで全部クライアントサイド。サーバ往復ゼロ
  • 出力された .wasm をその場で instantiate して実行。Rust へのトランスパイル表示も
https://almide.github.io/playground/
live demo ④ 本命

ブラウザだけで、LLM と会話する

  • Qwen3(0.6B / 1.7B)がブラウザの中で動く — サーバなし・API なし・100% ローカル
  • エンジンは Almide の nn スタック — 推論は WebGPU、トークナイザは 21.7 KB の WASM
  • 純 WASM 版もある — 1-bit モデル(248 MB)を 37 KB のエンジンで駆動。遅いが、純度の全振り版
https://almide-graphics.github.io/nn/web/  # WebGPU = Chrome 系で。初回はモデル 640 MB を DL
AI サンドボックス

LLM が書いたコードを、安心して実行する

$ porta run curl -- https://example.com                      # OK(ネイティブはデフォルト開放)
$ porta run curl --allow-net '*:443' -- https://example.com  # OK
$ porta run curl --allow-net '*:80'  -- https://example.com  # exit 7 — 443 を遮断
  • WASM 分離(capability 9 種 deny-by-default・宣言外の WASI import はロード時に拒否)+ macOS Seatbelt の二層
  • Docker 不要・単一バイナリ。Claude Code をネットワーク・FS 制限つきで走らせられる
  • さっきの 8 クラスタ ⑦「AI 実行サンドボックス」の先行実装。ほぼ全部 Almide 製(wasmtime ブリッジのみ Rust、テスト 98 本)

CLI ツールのため Web デモなし — github.com/almide/porta(macOS・単一バイナリ)

§2 · 手元に届く形

wasm-bindgen 相当を、Almide 自身で書いた

mylib.almd
→ almide-wasm-bindgen →
.wasm
.d.ts
ESM glue
package.json
Almide 1.5 KB Rust + wasm-bindgen 11.2 KB 同一処理の wasm バンドル(両者 wasm-opt -O3, Node 22)— 7.53 倍小、matmul 256² は 1.84 倍速

Node / Bun / Deno / Browser / wasmtime / wasmtime-py の 6 ランタイムで検証済み。型は Almide → TS へ自動写像(variant → union など 19 型)。

§3 · この先

「同じロジックを 2 回書く」が、消える

フロントで書いたバリデーション、サーバでもう 1 回書いてませんか。片方だけ直して、ズレて、事故る——あれの話です。

いま
ブラウザ用に TypeScript で 1 回
サーバ用に別言語でもう 1 回
仕様変更のたびに両方直す
WASM なら
ロジックは .wasm 1 個
ブラウザ / Node / Bun / Deno / エッジ — 同じバイナリだから同じ挙動
6 ランタイムで検証済み

同一バイナリの持ち回りはここまでが現在の事実。この先、マイコンや作曲ソフトのプラグインまで同じコードで届かせるのがロードマップ(合計 100 KB 未満が目標)。

まとめ — WASM は次の Docker

  • WASM は「ブラウザの技術」から「言語非依存のユニバーサル実行単位」になった — 8 クラスタに広がり、うち 5 つはすでに本番
  • 音・絵・UI・LLM、porta や playground — 道具立てはすべて個人製。LLM には純 WASM 版(エンジン 37 KB)まである
  • LLM 時代の安全実行基盤は WASM が本命 — tiny binary × effect × capability はそのための組み合わせ
WASM づくしで世界を組む — その世界は、もう動き始めている。

今日の URL

Playground(ブラウザ内コンパイル)almide.github.io/playground/
nn chat — Qwen3 をブラウザで(Chrome 系)almide-graphics.github.io/nn/web/
Bonsai — 1-bit LLM を純 WASM でalmide.github.io/bonsai-almide/
ceangal — WebGPU UI(Chrome 系)almide-graphics.github.io/ceangal/
音のシンセ(2,637 B・AudioWorklet)o6lvl4.github.io/almide-audio-poc/
obsid — 3D デモ(Heightmap / 球 / トーラス)almide-graphics.github.io/obsid/
MSR 日次ダッシュボードalmide.github.io/almide-dojo/
言語本体github.com/almide/almide
このスライドo6lvl4.github.io/O6lvl4-webnight-miyazaki-20260703-slide/

ありがとうございました 🙌 — @O6lvl4