spinny:~/writing $ less webassembly-wasm-complete-guide.md
12WebAssembly (WASM) zacinal jako zpusob, jak spoustet C++ v prohlizeci. V roce 2026 bezi vsude - prohlizece, servery, edge site, vestavenych zarizeni - a pohani nektere z nejnarocnejsich aplikaci na webu. Vykreslovaci engine Figmy, Adobe Photoshop na webu, zpracovani videa v Google Meet a platforma edge vypoctu Cloudflare - to vse bezi na WebAssembly.34Chrome Platform Status uvadi, ze WASM tvoril zhruba 5,5 % vsech nacitani stranek v Chrome na zacatku roku 2026, oproti 4,5 % v predchozim roce. S tim, ze WASM 3.0 se stal standardem W3C a WASI dozrava smerem k verzi 1.0, ekosystem dosahl bodu zlomu.56Tento pruvodce pokryva vse, co potrebujete vedet, abyste mohli zacit stavet s WebAssembly.78## Co je WebAssembly?910WebAssembly je binarni format instrukci navrzeny jako cil kompilace. Napisete kod ve vysokourovnovem jazyce (Rust, C, C++, Go, Kotlin), zkompilujete jej do `.wasm` a spustite v jakoliv prostredi s WASM runtime - prohlizece, Node.js, Cloudflare Workers, Wasmtime nebo Wasmer.1112```mermaid13graph LR14 Rust[Rust / C / C++] --> Compiler[Compiler]15 Compiler --> WASM[.wasm Binary]16 WASM --> Browser[Browser V8/SpiderMonkey]17 WASM --> Server[Server Wasmtime]18 WASM --> Edge[Edge Cloudflare Workers]19 WASM --> Embedded[Embedded WAMR]20```2122### Jak to funguje2324WASM je **virtualni stroj zalozeny na zasobniku**. Funkce ukladaji a odebirati hodnoty z operandoveho zasobniku. Hostitelsky runtime (V8 v Chrome, SpiderMonkey ve Firefoxu) JIT kompiluje WASM bytekod do nativniho strojoveho kodu, proto je vykon blizky nativnimu.2526Klicove vlastnosti:2728- **Provadeni v sandboxu**: WASM moduly mohou pristupovat pouze k prostredkum, ktere hostitel explicitne udeli. Zadny pristup k souborovemu systemu, siti ani operacnimu systemu, pokud to neni povoleno. To je fundamentalni rozdil oproti nativnimu kodu.29- **Linearni pamet**: jeden souvisly `ArrayBuffer` sdileny mezi WASM a hostitelem. Slozita data (retezce, struktury) se predavaji zapisem do pameti a sdilenim ukazatele.30- **Omezene typy**: WASM nativne podporuje pouze ctyri typy: `i32`, `i64`, `f32`, `f64`. Vse ostatni (retezce, pole, objekty) vyzaduje kodovani pres linearni pamet nebo Component Model.31- **Prenositelnost**: stejny binarni soubor `.wasm` bezi na jakekoli platforme s WASM runtime, bez rekompilace.3233### WASM vs JavaScript3435WASM nenahrazuje JavaScript. Doplnuje ho.3637| Aspekt | JavaScript | WebAssembly |38|--------|-----------|-------------|39| **Parsovani** | Parsovani + kompilace za behu | Predkompilovany binarni soubor, pouze dekodovani |40| **Rychlost provadeni** | JIT optimalizovany, promenliva | Blizko nativni, konzistentni |41| **Start** | Rychly pro male skripty | Rychle dekodovani, predvidatelny |42| **Pristup k DOM** | Primy | Neprimi (pres JS vrstvu) |43| **Nejlepsi pro** | UI, manipulace s DOM, zpracovani udalosti | Vypocetne narocne ulohy CPU |44| **Garbage collection** | Vestavenej | WasmGC (novy) nebo manualni |4546Pouzivejte JavaScript pro praci s UI a DOM. Pouzivejte WASM pro narocne vypocty: zpracovani obrazu, kodovani videa, fyzikalni simulace, kryptografie, parsovani dat.4748## WASM 3.0: co je noveho4950WebAssembly 3.0 se stal standardem W3C v zari 2025 a standardizoval devet funkci, ktere byly vyvijeny po leta.5152| Funkce | Co umoznuje |53|---------|----------------|54| **WasmGC** | Nativni garbage collection ve WASM. Spravovane jazyky (Java, Kotlin, Dart) mohou kompilovat do WASM bez dodavani vlastniho GC runtime. Podporovano v Chrome 119+, Firefox 120+, Safari 18.2+. |55| **Exception Handling** | Nativni `try`/`catch` ve WASM. Drive vyzadovaly vyjimky nakladne pruchody do JavaScriptu. |56| **Tail Calls** | Umoznuje efektivni rekurzi bez preteceni zasobniku. Klicove pro funkcionalni jazyky. |57| **Relaxed SIMD** | 128bitove vektorove instrukce pro paralelni zpracovani dat. Umoznuje hardwarove specificke optimalizace. |58| **Memory64** | Prekonava limit 4GB linearni pameti. Nutne pro zpracovani dat ve velkem meritku. |59| **Multi-memory** | Vice nezavislych oblasti pameti v jednom modulu. |6061Nejvyznamnejsi je **WasmGC**. Drive kompilace Javy nebo Kotlinu do WASM znamenala dodani celeho garbage collectoru jako soucasti binarniho souboru, coz nafouklo velikost souboru. Nyni vlastni GC prohlizece spravuje pamet WASM modulu, stejne jako to dela pro JavaScript.6263## WASI: WebAssembly mimo prohlizec6465WASM v prohlizeci je mocny, ale **WASI (WebAssembly System Interface)** je to, co dela z WASM univerzalni runtime. WASI poskytuje standardizovane rozhrani pro systemove prostredky - soubory, sitovani, hodiny, nahodna cisla - umoznuje WASM modulem bezet mimo prohlizec.6667```mermaid68graph TD69 subgraph "Browser"70 B[WASM Module] --> Web[Web APIs\nDOM, Fetch, Canvas]71 end7273 subgraph "Server / Edge / Embedded"74 S[WASM Module] --> WASI[WASI Interfaces]75 WASI --> FS[wasi:filesystem]76 WASI --> Net[wasi:sockets]77 WASI --> HTTP[wasi:http]78 WASI --> Clock[wasi:clocks]79 WASI --> Rand[wasi:random]80 end81```8283WASI Preview 2 (soucasne stabilni vydani) definuje tato rozhrani:8485- `wasi:filesystem` - souborove operace pres capability handles (ne tradicni deskriptory souboru)86- `wasi:sockets` - TCP/UDP sitovani87- `wasi:http` - zpracovani HTTP pozadavku/odpovedi88- `wasi:clocks` - nastenne hodiny, monotonicke hodiny89- `wasi:random` - kryptograficka nahodnost90- `wasi:cli` - argumenty prikazoveho radku, promenne prostredi, stdio9192Klicovym principem je **zabezpeceni zalozene na schopnostech**: WASM modul nemuze pristupovat k souborovemu systemu, pokud hostitel explicitne neposkytneme handle ke konkretnimu adresari. To cini WASI fundamentalne bezpecnejsim nez spousteni nativnich spustitelnych souboru.9394### Cesta k WASI 1.09596WASI 0.3.0 (pridavajici async/soubelnostni primitivy) se ocekava v roce 2026, WASI 1.0 ma nasledovat. Hlavnim pridanim je jazykove integrovane async s bezkopirovym streamovym I/O.9798## Component Model99100Zakladni WASM moduly mohou vymenit pouze cisla. **Component Model** resi toto omezeni pridanim bohateho typoveho systemu a vrstvy skladatelnosti na WASM.101102### WIT (WebAssembly Interface Types)103104WIT je jazyk pro definici rozhrani, ktery umoznuje komponentam deklarovat sve importy a exporty s bohatymi typy - retezce, zaznamy, seznamy, varianty, enumy - ne jen `i32` a `f64`.105106```wit107// calculator.wit108package myorg:calculator@1.0.0;109110interface operations {111 record calculation {112 expression: string,113 result: f64,114 timestamp: u64,115 }116117 add: func(a: f64, b: f64) -> f64;118 multiply: func(a: f64, b: f64) -> f64;119 history: func() -> list<calculation>;120}121122world calculator {123 export operations;124}125```126127Nastroje jako `wit-bindgen` generuji jazykove specificke vazby ze souboru WIT. Komponenta v Rustu a komponenta v Pythonu si mohou vymenit retezce, zaznamy a seznamy pres WIT kontrakty, aniz by kterakoli strana znala implementacni jazyk druhe.128129## Sestaveni prvniho WASM modulu s Rustem130131Rust ma nejvyzralejsi WASM nastroje. Pojdme sestavit prakticky priklad: modul pro zpracovani obrazu bezici v prohlizeci.132133### Nastaveni134135```bash136# Install the WASM target for Rust137rustup target add wasm32-unknown-unknown138139# Install wasm-pack (builds Rust to WASM + generates JS bindings)140cargo install wasm-pack141142# Create a new library project143cargo new --lib image-processor144cd image-processor145```146147### Konfigurace Cargo.toml148149```toml150[package]151name = "image-processor"152version = "0.1.0"153edition = "2021"154155[lib]156crate-type = ["cdylib"]157158[dependencies]159wasm-bindgen = "0.2"160```161162### Napiste kod v Rustu163164```rust165// src/lib.rs166use wasm_bindgen::prelude::*;167168/// Convert an image buffer to grayscale.169/// Input: RGBA pixel data as a flat u8 array (4 bytes per pixel).170/// Output: Modified in place for zero-copy performance.171#[wasm_bindgen]172pub fn grayscale(pixels: &mut [u8]) {173 for chunk in pixels.chunks_exact_mut(4) {174 let r = chunk[0] as f32;175 let g = chunk[1] as f32;176 let b = chunk[2] as f32;177 // ITU-R BT.709 luminance coefficients178 let gray = (0.2126 * r + 0.7152 * g + 0.0722 * b) as u8;179 chunk[0] = gray;180 chunk[1] = gray;181 chunk[2] = gray;182 // chunk[3] is alpha, leave unchanged183 }184}185186/// Adjust brightness of an image.187/// factor > 1.0 brightens, < 1.0 darkens.188#[wasm_bindgen]189pub fn adjust_brightness(pixels: &mut [u8], factor: f32) {190 for chunk in pixels.chunks_exact_mut(4) {191 chunk[0] = ((chunk[0] as f32 * factor).min(255.0)) as u8;192 chunk[1] = ((chunk[1] as f32 * factor).min(255.0)) as u8;193 chunk[2] = ((chunk[2] as f32 * factor).min(255.0)) as u8;194 }195}196197/// Invert all colors in the image.198#[wasm_bindgen]199pub fn invert(pixels: &mut [u8]) {200 for chunk in pixels.chunks_exact_mut(4) {201 chunk[0] = 255 - chunk[0];202 chunk[1] = 255 - chunk[1];203 chunk[2] = 255 - chunk[2];204 }205}206207/// Calculate the average brightness of an image (0-255).208#[wasm_bindgen]209pub fn average_brightness(pixels: &[u8]) -> f32 {210 let mut total: f64 = 0.0;211 let pixel_count = pixels.len() / 4;212 for chunk in pixels.chunks_exact(4) {213 let luminance = 0.2126 * chunk[0] as f64214 + 0.7152 * chunk[1] as f64215 + 0.0722 * chunk[2] as f64;216 total += luminance;217 }218 (total / pixel_count as f64) as f32219}220```221222### Sestaveni223224```bash225wasm-pack build --target web226```227228To vytvori adresar `pkg/` obsahujici:229- `image_processor_bg.wasm` - zkompilovany WASM binarni soubor230- `image_processor.js` - JavaScript propojovaci kod s TypeScript definicemi231- `package.json` - pripraveny k publikaci na npm232233### Pouziti v JavaScriptu234235```html236<!DOCTYPE html>237<html>238<head><title>WASM Image Processor</title></head>239<body>240 <canvas id="canvas" width="800" height="600"></canvas>241 <button onclick="applyGrayscale()">Grayscale</button>242 <button onclick="applyBrightness()">Brighten</button>243 <button onclick="applyInvert()">Invert</button>244245 <script type="module">246 import init, { grayscale, adjust_brightness, invert } from "./pkg/image_processor.js";247248 let ctx;249 let imageData;250251 async function setup() {252 await init();253 const canvas = document.getElementById("canvas");254 ctx = canvas.getContext("2d");255256 // Load an image onto the canvas257 const img = new Image();258 img.onload = () => {259 ctx.drawImage(img, 0, 0);260 imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);261 };262 img.src = "photo.jpg";263 }264265 window.applyGrayscale = () => {266 grayscale(imageData.data);267 ctx.putImageData(imageData, 0, 0);268 };269270 window.applyBrightness = () => {271 adjust_brightness(imageData.data, 1.3);272 ctx.putImageData(imageData, 0, 0);273 };274275 window.applyInvert = () => {276 invert(imageData.data);277 ctx.putImageData(imageData, 0, 0);278 };279280 setup();281 </script>282</body>283</html>284```285286Klicovy poznatek: `imageData.data` je `Uint8ClampedArray` podporovany `ArrayBuffer`. Pri predani do WASM sdili stejnou pamet - zadne kopirovani. Funkce v Rustu modifikuje pixely na miste a strana JavaScriptu zmeny okamzite vidi.287288## Nizsi uroven: manualni instanciace WASM289290Pokud nechcete pouzivat `wasm-bindgen`, muzete instanciovat WASM moduly primo:291292```javascript293const response = await fetch("calculator.wasm");294const { instance } = await WebAssembly.instantiateStreaming(response, {295 env: {296 // Functions the WASM module can call297 log_result: (value) => console.log("Result:", value),298 },299});300301// Call exported functions302const { add, multiply } = instance.exports;303console.log(add(5, 3)); // 8304console.log(multiply(4, 7)); // 28305```306307To je uzitecne, kdyz chcete minimalni rezii a nepotrebujete bohaty typovy interop.308309## Vykon: WASM vs JavaScript310311Realne benchmarky ukazuji vyznamna zrychleni pro vypocetne narocne ulohy CPU:312313| Uloha | JavaScript | WASM | Zrychleni |314|------|-----------|------|---------|315| Zpracovani obrazu 4K | 180ms | 8ms (se SIMD) | 22x |316| Zmena velikosti obrazu (4K) | 250ms | 45ms | 5,5x |317| Fyzikalni simulace (10K entit) | Ztrata snimku | Plynulych 60fps | ~10x |318| Parsovani JSON (velky payload) | 12ms | 3ms | 4x |319| Kryptograficke hashovani | 45ms | 6ms | 7,5x |320321WASM bezi na zhruba 95 % rychlosti nativniho kodu. Nejvetsi zisky pochazi z:322- Predvidatelneho vykonu (zadne JIT zahrivani, zadne GC pauzy)323- SIMD instrukci pro paralelni zpracovani dat324- Primeho pristupu k pameti bez zasahu garbage collectoru325326Kde WASM NENI rychlejsi: manipulace s DOM, male vypocty, I/O-bound ulohy. JavaScript je pro ne uz optimalizovany.327328## Produkcni pripady pouziti329330### Figma: vykreslovani vektoru v realnem case331332Jadro vykreslovaciho engine Figmy je C++ zkompilovany do WASM. Kazdy tvar, gradient a efekt je vypocitan ve WASM a vykreslen na element Canvas. To umoznuje Figme zvladat slozite navrhy s tisici vrstvami pri 60fps v prohlizeci - vykon, ktery by v cistem JavaScriptu nebyl mozny.333334### Adobe Photoshop na webu335336Adobe portovalo klicove filtry a nastroje Photoshopu do WASM pomoci Rustu. Jejich benchmarky ukazuji zpracovani 4K obrazu za 22ms s WASM SIMD oproti 180ms v JavaScriptu - 8nasobne zlepseni, ktere umoznuje nahledy filtru v realnem case.337338### Cloudflare Workers339340Cloudflare spousti WASM moduly v V8 izolatech na vice nez 330 edge lokacich. Studene starty jsou 1-5ms (ve srovnani se 100-500ms pro kontejnerovy serverless). V unoru 2026 nasadili inferenci Llama-3-8b napric svou edge siti pomoci WASM.341342### Google Meet343344Rozmazani pozadi a virtualni pozadi v Google Meet pouzivaji WASM se SIMD pro zpracovani videa v realnem case. WASM modul zpracovava kazdy snimek videa dostatecne rychle na udrzeni plynuleho videa pri 30fps.345346## Podpora prohlizecu (2026)347348| Funkce | Chrome | Firefox | Safari | Edge |349|---------|--------|---------|--------|------|350| Core WASM | Plna | Plna | Plna | Plna |351| Threads | Ano | Ano | Ano | Ano |352| SIMD (128-bit) | Ano | Ano | Ano | Ano |353| WasmGC | 119+ | 120+ | 18.2+ | Ano |354| Exception Handling | Ano | Ano | Ano | Ano |355| Memory64 | Ano | Ano | Castecna | Ano |356357Vsechny hlavni prohlizece plne podporuji WASM. Novejsi funkce (WasmGC, Exception Handling) dosahly siroke dostupnosti.358359## Prehled nastroju360361| Nastroj | Ucel | Instalace |362|------|---------|---------|363| **wasm-pack** | Sestaveni Rustu do WASM, generovani npm balicku | `cargo install wasm-pack` |364| **wasm-bindgen** | Rust/JS interop vazby (pouzivano wasm-pack) | Zavislost v Cargo.toml |365| **wasm-opt** | Optimalizace velikosti binarniho souboru (50%+ redukce) | Soucast Binaryen: `brew install binaryen` |366| **wit-bindgen** | Generovani vazeb ze souboru WIT | `cargo install wit-bindgen-cli` |367| **Wasmtime** | Serverovy WASM runtime (referencni implementace WASI) | `brew install wasmtime` |368| **Wasmer** | Alternativni WASM runtime s podporou WASI | `curl https://get.wasmer.io -sSfL \| sh` |369| **wasm-feature-detect** | Detekce funkci prohlizece za behu | `npm install wasm-feature-detect` |370371### Optimalizace velikosti binarniho souboru372373WASM binarni soubory mohou byt velke. Takto je zmensit:374375```toml376# Cargo.toml377[profile.release]378opt-level = "z" # Optimize for size379lto = true # Link-time optimization380codegen-units = 1 # Better optimization, slower compile381strip = true # Strip debug symbols382```383384```bash385# Build in release mode386wasm-pack build --release --target web387388# Further optimize with wasm-opt389wasm-opt -Oz pkg/image_processor_bg.wasm -o pkg/image_processor_bg.wasm390```391392Typicky Rust WASM modul se zmensi z 500KB pod 50KB s temito optimalizacemi.393394## Plan pro zacatek395396```mermaid397flowchart TD398 A[Week 1: Basics] --> B[Week 2: Real Project]399 B --> C[Week 3: WASI and Server-side]400 C --> D[Month 2+: Production]401402 A --> A1[Install Rust + wasm-pack]403 A --> A2[Build hello-world WASM module]404 A --> A3[Call WASM functions from JavaScript]405406 B --> B1[Build image processor or game physics]407 B --> B2[Use wasm-bindgen for rich types]408 B --> B3[Benchmark against pure JS]409410 C --> C1[Run WASM with Wasmtime]411 C --> C2[Explore WASI interfaces]412 C --> C3[Try Component Model with WIT]413414 D --> D1[Optimize binary size]415 D --> D2[Use SIMD for parallelism]416 D --> D3[Deploy to Cloudflare Workers or browser]417```418419## Zaver420421WebAssembly uz neni experimentalni. Je to produkcni technologie pouzivana nekterymi z nejnarocnejsich aplikaci na webu. Vykon blizky nativnimu, zabezpeceni sandboxem a univerzalni prenositelnost - zadny jiny cil kompilace vam nedava vsechny tri.422423Nemusite prepisovat celou aplikaci do WASM. Zacnete s jedinou vypocetne narocnou funkci - obrazovym filtrem, datovym parserem, fyzikalnim vypoctem - zkompilujte ji do WASM a zavolejte z JavaScriptu. Zmerte rozdil. Pak se rozhodnete, kde jeste muze WASM pomoci.424425Nastroje jsou vyzrale, podpora prohlizecu je univerzalni a ekosystem roste. Pokud pisete v Rustu, jste uz jen jeden prikaz od prohlizece.426427> **Kontrolni seznam pro zacatek:**428>429> - [x] Rust a wasm-pack nainstalovany430> - [x] Prvni WASM modul sestaven a bezici v prohlizeci431> - [x] JavaScript interop funguje (volani WASM z JS)432> - [x] Vydani s optimalizacemi velikosti aplikovano433> - [x] Vykon porovnan s ekvivalentem v cistem JavaScriptu434> - [x] WASI prozkoumano s Wasmtime pro serverove pripady pouziti435
:WebAssembly pro webove vyvojare: od nuly k produkcilines 1-435 (END) — press q to close