К основному содержанию
скилл CX Codex

wasm-emscripten — скилл для Claude Code: C/C++ в WebAssembly

Скилл ведёт агента через сборку C и C++ в WebAssembly: подбор флагов emcc, экспорт функций, модель памяти, Asyncify и отладка .wasm.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add mohitmishra786/low-level-dev-skills --skill wasm-emscripten -a claude-code
Открыть на GitHub

Что делает wasm-emscripten

Скилл описывает рабочий процесс от установки Emscripten SDK до отладки готового бинарника. Внутри — семь шагов: первая сборка, экспорт функций в JavaScript, модель линейной памяти, Asyncify для асинхронного C, оптимизация через wasm-opt, отладка в браузерных devtools и выбор между WASI и браузерной целью. Агент получает конкретные команды emcc с флагами, а не общие рассуждения.

Экспорт функций разобран подробно: EMSCRIPTEN_KEEPALIVE защищает функцию от удаления как мёртвого кода, а в EXPORTED_FUNCTIONS имя C-функции пишется с ведущим подчёркиванием. Для вызова из JS есть три пути — прямой Module._add, ccall с проверкой типов и cwrap, создающий обычную JS-функцию. Память настраивается через INITIAL_MEMORY, MAXIMUM_MEMORY и ALLOW_MEMORY_GROWTH.

Сборка требует HTTP, а не file:// — локально файл открывается через python3 -m http.server. Asyncify работает лучше с оптимизацией, поэтому в примере стоит -O2. Для WASI-цели в скилле отмечено, что wasi-sdk даёт более полную поддержку, чем Emscripten.

Какие задачи решает

  • собрать C-функцию в .wasm и вызвать её из JavaScript
  • настроить экспорт функций без удаления их линкером
  • разобраться, как читать и писать линейную память из JS
  • сделать синхронный C-код асинхронным через Asyncify
  • уменьшить размер .wasm постобработкой в wasm-opt

Примеры запросов агенту

  • Собери math.c в WebAssembly и экспортируй add и sqrt_approx
  • Почему моя C-функция не видна из JavaScript после сборки emcc?
  • Настрой Asyncify, чтобы fetch вызывался из синхронного C-кода

Как установить wasm-emscripten

1Через Skills CLI (Vercel)

npx skills add mohitmishra786/low-level-dev-skills --skill wasm-emscripten -a claude-code

2Вручную: положить файлы

~/.claude/skills/wasm-emscripten/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/wasm-emscripten/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о wasm-emscripten

Как установить wasm-emscripten в Claude?

Выполните npx skills add mohitmishra786/low-level-dev-skills --skill wasm-emscripten -a claude-code. Скилл появится в ~/.claude/skills/wasm-emscripten/SKILL.md.

Что делает wasm-emscripten?

Проводит агента по компиляции C и C++ в WebAssembly через emcc: флаги сборки, экспорт функций, модель памяти, Asyncify, отладка и выбор цели.

Чем WASI отличается от браузерной цели?

Браузерная сборка получает доступ к Web API вроде fetch и WebGL и работает в JS-движке. WASI даёт подмножество POSIX и запускается в wasmtime, wasmer или Node.js.

Исходный текст

SKILL.md · MIT
---
name: wasm-emscripten
description: WebAssembly with Emscripten skill for C/C++ to WASM compilation. Use when compiling C/C++ to WebAssembly with emcc, configuring EXPORTED_FUNCTIONS, understanding the WASM memory model, using Asyncify for async C code, debugging .wasm with browser devtools or wasm-opt, or targeting WASI vs browser environments. Activates on queries about Emscripten, emcc, WebAssembly from C/C++, WASM memory model, Asyncify, EXPORTED_FUNCTIONS, WASI, or wasm-opt.
---

# WebAssembly with Emscripten

## Purpose

Guide agents through compiling C/C++ to WebAssembly using Emscripten: emcc flag selection, function exports, memory model configuration, Asyncify for asynchronous C code, debugging WASM binaries, and targeting WASI vs browser.

## Triggers

- "How do I compile C to WebAssembly with Emscripten?"
- "How do I export a C function to JavaScript?"
- "How does WebAssembly memory work with Emscripten?"
- "How do I debug a .wasm file?"
- "How do I use Asyncify to make synchronous C code async?"
- "What's the difference between WASI and Emscripten browser target?"

## Workflow

### 1. Setup and first build

```bash
# Install Emscripten SDK
git clone https://github.com/emscripten-core/emsdk.git
cd emsdk
./emsdk install latest
./emsdk activate latest
source ./emsdk_env.sh    # add emcc to PATH

# Verify
emcc --version

# Compile C to WASM (browser target)
emcc hello.c -o hello.html          # generates hello.html + hello.js + hello.wasm
emcc hello.c -o hello.js            # just JS + WASM (no HTML shell)

# Serve locally (WASM requires HTTP, not file://)
python3 -m http.server 8080
# Open: http://localhost:8080/hello.html
```

### 2. Exporting functions to JavaScript

```c
// math.c
#include <emscripten.h>

// EMSCRIPTEN_KEEPALIVE prevents dead-code elimination
EMSCRIPTEN_KEEPALIVE
int add(int a, int b) {
    return a + b;
}

EMSCRIPTEN_KEEPALIVE
double sqrt_approx(double x) {
    return x * 0.5 + 1.0;
}
```

```bash
# Export specific functions
emcc math.c -o math.js \
  -s EXPORTED_FUNCTIONS='["_add","_sqrt_approx"]' \
  -s EXPORTED_RUNTIME_METHODS='["ccall","cwrap"]' \
  -s MODULARIZE=1 \
  -s EXPORT_NAME=MathModule

# The leading underscore is required for C functions
```

```javascript
// Using exported functions in JS
const Module = await MathModule();

// Direct call
const result = Module._add(3, 4);

// Via ccall (type-safe)
const result2 = Module.ccall('add', 'number', ['number', 'number'], [3, 4]);

// Via cwrap (creates a callable JS function)
const add = Module.cwrap('add', 'number', ['number', 'number']);
console.log(add(3, 4));  // 7
```

### 3. Memory model

Emscripten provides a linear memory heap accessible from both C and JS:

```bash
# Configure initial and maximum heap
emcc prog.c -o prog.js \
  -s INITIAL_MEMORY=16MB \
  -s MAXIMUM_MEMORY=256MB \
  -s ALLOW_MEMORY_GROWTH=1    # allow dynamic growth

# Stack size (default 64KB)
emcc prog.c -o prog.js -s STACK_SIZE=1MB

# Shared memory (for SharedArrayBuffer / threads)
emcc prog.c -o prog.js -s SHARED_MEMORY=1 -s USE_PTHREADS=1
```

```javascript
// Accessing C memory from JS
const ptr = Module._malloc(1024);     // allocate
Module.HEAPU8.set([1, 2, 3], ptr);   // write bytes
Module._free(ptr);                     // free

// Read a C string
const strPtr = Module.ccall('get_message', 'number', [], []);
const str = Module.UTF8ToString(strPtr);

// Write a string to C
const jsStr = "hello";
const cStr = Module.stringToNewUTF8(jsStr);  // malloc + copy
Module._process_string(cStr);
Module._free(cStr);
```

### 4. Asyncify — synchronous C in async environments

Asyncify lets synchronous C code suspend and resume for async operations (like `fetch()`, sleep, etc.):

```c
// async.c
#include <emscripten.h>

// Synchronous sleep in C (blocks C, but yields to JS event loop)
EM_JS(void, do_fetch, (const char *url), {
    // Emscripten generates wrappers to suspend C while JS runs
    Asyncify.handleAsync(async () => {
        const resp = await fetch(UTF8ToString(url));
        const text = await resp.text();
        console.log(text);
    });
});

void process_url(const char *url) {
    do_fetch(url);     // looks synchronous in C
    printf("fetch complete\n");
}
```

```bash
# Enable Asyncify
emcc async.c -o async.js \
  -s ASYNCIFY \
  -s ASYNCIFY_STACK_SIZE=16384 \
  -O2   # Asyncify works better with optimization
```

### 5. Optimization and wasm-opt

```bash
# Optimization levels
emcc prog.c -O0 -o prog.js    # no optimization (fastest build)
emcc prog.c -O2 -o prog.js    # balanced
emcc prog.c -O3 -o prog.js    # aggressive
emcc prog.c -Os -o prog.js    # optimize for size
emcc prog.c -Oz -o prog.js    # aggressive size (Emscripten's smallest)

# Post-process with wasm-opt (Binaryen)
wasm-opt -Oz -o prog.opt.wasm prog.wasm    # optimize for size
wasm-opt -O4 -o prog.opt.wasm prog.wasm    # optimize for speed

# Compare sizes
ls -lh prog.wasm prog.opt.wasm
```

### 6. Debugging WASM

```bash
# Build with debug info
emcc prog.c -g -O0 -o prog.html \
  -s ASSERTIONS=1 \
  -s SAFE_HEAP=1      # catch misaligned accesses

# In Chrome DevTools:
# Sources → prog.wasm → line-by-line C source debugging
# (requires -g and browser with WASM debugging support)

# LLDB with WASM (wasmtime)
# See skills/runtimes/wasm-wasmtime for CLI WASM debugging
```

```bash
# Emscripten debug helpers
emcc prog.c -o prog.js \
  -s ASSERTIONS=2       # extensive runtime checks
  -s SAFE_HEAP=1        # sanitize heap accesses
  -s STACK_OVERFLOW_CHECK=1

# Print generated JS
emcc prog.c -o prog.js && cat prog.js | head -100
```

### 7. WASI vs browser target

| Feature | Browser (Emscripten) | WASI |
|---------|---------------------|------|
| Host APIs | Web APIs (fetch, WebGL, etc.) | POSIX subset (files, stdin/stdout) |
| Runtime | Browser JS engine | wasmtime, wasmer, WAMR, Node.js |
| Threads | SharedArrayBuffer + pthreads | wasi-threads (limited) |
| Networking | fetch(), WebSocket | wasi-http (preview2) |
| Use case | Web applications | Server-side, CLI tools, edge |

```bash
# Build for WASI (no browser JS, pure WASM)
emcc prog.c -o prog.wasm --target=wasi

# Or use wasi-sdk (better WASI support than Emscripten)
/opt/wasi-sdk/bin/clang --sysroot=/opt/wasi-sdk/share/wasi-sysroot \
  prog.c -o prog.wasm
wasmtime prog.wasm
```

For Emscripten linker flags reference, see [references/emscripten-linker-flags.md](references/emscripten-linker-flags.md).

## Related skills

- Use `skills/runtimes/wasm-wasmtime` for server-side WASM with wasmtime CLI and Rust embedding
- Use `skills/compilers/clang` for Clang-based WASM compilation with WASI SDK
- Use `skills/binaries/elf-inspection` for inspecting WASM binary structure

© mohitmishra786 · MIT · mohitmishra786/low-level-dev-skills

Похожие скиллы

Все скиллы по теме «Языки программирования» →
wasm-agent ruvnet Запускает изолированных субагентов внутри WebAssembly для безопасного выполнения непроверенного кода без доступа к файловой системе хоста. CX Codex +1 739установок wasm-compatibility marimo-team Проверяет, запустится ли блокнот marimo в браузере через WebAssembly, и объясняет, что именно сломается. CX Codex +1 3 000установок wasm-gallery ruvnet Скилл для поиска, установки и публикации WASM-агентов из общего каталога. Пригодится, когда нужен готовый агент или хочешь поделиться своим. CX Codex +1 741установок blazor Mindrally Скилл задаёт агенту правила разработки на Blazor: жизненный цикл компонентов, привязка данных, управление состоянием и оптимизация рендеринга. CX Codex +1 798установок troubleshooting-motoko-migrations caffeinelabs Справочник по ошибкам цепочки миграций Motoko: когда диагностика не сходится с main.mo или правка файла миграции не срабатывает. CX Codex +1 4 500установок m11-ecosystem actionbook Помогает ИИ подбирать библиотеки под Rust, настраивать Cargo.toml и связывать код с C, Python или WebAssembly. Подходит при разборе ошибок компилятора. CX Codex +1 3 300установок

Из того же набора62

rust-security Скилл для проверки Rust-проектов на уязвимости: cargo-audit, cargo-deny, RUSTSEC, безопасный FFI, фаззинг и Miri. CX Codex +1 544установок debug-optimized-builds Помогает разобраться, почему GDB показывает «value optimized out» и как вообще отлаживать код, собранный с оптимизацией. CX Codex +1 533установок concurrency-debugging Скилл ведёт агента по отчётам ThreadSanitizer, графам блокировок Helgrind и зависшим потокам в GDB. Пригодится, когда программа падает или виснет на многопоточке. CX Codex +1 524установок linker-scripts Помогает писать и править скрипты компоновщика GNU ld для bare-metal: регионы памяти, VMA и LMA, инициализация .bss и .data. CX Codex +1 523установок zig-debugging Скилл для ИИ-агента: разбирает паники Zig, error return traces и сессии GDB/LLDB. Пригодится, когда программа падает, а стек нечитаемый. CX Codex +1 511установок zig-build-system Помогает агенту писать и отлаживать build.zig: исполняемые файлы, библиотеки, C-исходники, опции сборки и тесты. CX Codex +1 508установок build-acceleration Скилл для ИИ-агентов, который помогает разобраться, почему сборка C/C++ идёт медленно, и настроить кэш, распределённую компиляцию и PCH. CX Codex +1 506установок zig-cinterop Скилл объясняет агенту, как связать Zig и C: @cImport, translate-c, extern struct, экспорт функций и сборка смешанных проектов. CX Codex +1 482установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой