spinny:~/writing $ less webassembly-wasm-complete-guide.md
12WebAssembly (WASM) pochynavsia yak sposib zapusku C++ u brauzeri. U 2026 rotsi vin pratsiuie skriz' - brauzery, servery, edge-merezhi, vbudovani prystroi - i zabezpechuie robotu deiakykh z naivymohlyvishykh zastosunkiv u vebi. Rukhivok renderynhu Figma, Adobe Photoshop u vebi, obrobka video Google Meet ta platforma edge-obchyslen Cloudflare - vse pratsiuie na WebAssembly.34Chrome Platform Status pokazuie, shcho WASM stanovyt' blyz'ko 5,5% usikh zavantazhen storinok u Chrome na pochatok 2026 roku, u porivnianni z 4,5% rokom ranishe. Z tym, shcho WASM 3.0 stav standartom W3C, a WASI dozrivae u napriamku versii 1.0, ekosystema disiahla perelomnoi tochky.56Tsei posibnyk okholiuie vse, shcho treba znaty dlia pochatku roboty z WebAssembly.78## Shcho take WebAssembly?910WebAssembly - tse binarnyi format instruktsii, rozroblenyi yak tsil kompiliatsii. Vy pyshete kod movoiu vysokoho rivnia (Rust, C, C++, Go, Kotlin), kompiliuiete yoho u `.wasm` i zapuskaete u bud-yakomu seredovyshchi z WASM-runtime - brauzery, Node.js, Cloudflare Workers, Wasmtime abo 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### Yak tse pratsiuie2324WASM - tse **stekova virtual'na mashyna**. Funktsii rozmishchuyut' i vyluchayut' znachennia zi steku operandiv. Runtime khosta (V8 u Chrome, SpiderMonkey u Firefox) JIT-kompiliuie baitkod WASM u natyvnyi mashynnyi kod, tomu produktyvnist' blyz'ka do natyvnoi.2526Kliuchovi kharakterystyky:2728- **Vykonannia u pisochnytsi**: WASM-moduli mozhut' otrymuvaty dostup lyshe do resursiv, yaki khost yavno nadaie. Nemaie dostupu do failovoi systemy, merezhi chy OS, yakshcho tse ne dozvoleno. Tse fundamental'no vidrizniaiets'sia vid natyvnoho kodu.29- **Liniina pam'iat'**: odyn bezperervnyi `ArrayBuffer`, shcho spil'no vykorystovuiet'sia mizh WASM ta khostom. Skladni dani (riadky, struktury) peredaiut'sia cherez zapys u pam'iat' ta spil'ne vykorystannia pokazhchyka.30- **Obmezheni typy**: WASM natyvno pidtrymuie lyshe chotyry typy: `i32`, `i64`, `f32`, `f64`. Vse inshe (riadky, masyvy, ob'iekty) vymahaie koduvannia cherez liniinu pam'iat' abo Component Model.31- **Portatyvnist'**: toi samyi binarnyi fail `.wasm` zapuskaiet'sia na bud-iakii platformi z WASM-runtime, bez perekompiliatsii.3233### WASM vs JavaScript3435WASM ne zaminiuie JavaScript. Vin dopovniuie yoho.3637| Aspekt | JavaScript | WebAssembly |38|--------|-----------|-------------|39| **Parsynh** | Parsynh + kompiliatsiia u runtime | Poperedn'o skompil'ovanyi binarnyi fail, lyshe dekoduvannia |40| **Shvydkist' vykonannia** | JIT-optymizovana, zminna | Blyz'ko do natyvnoi, stabil'na |41| **Zapusk** | Shvydkyi dlia malykh skryptiv | Shvydke dekoduvannia, peredbachuvane |42| **Dostup do DOM** | Priamyi | Nepriamyi (cherez JS-prosharkok) |43| **Naikrashche dlia** | UI, manipuliatsiia DOM, obrobka podii | CPU-intensyvni obchyslennia |44| **Zbyrannia smittia** | Vbudovane | WasmGC (nove) abo ruchne |4546Vykorystovuite JavaScript dlia roboty z UI ta DOM. Vykorystovuite WASM dlia vazhkykh obchyslen: obrobka zobrazhen, koduvannia video, fizychni symuliatsii, kryptohrafiia, parsynh danykh.4748## WASM 3.0: shcho novoho4950WebAssembly 3.0 stav standartom W3C u veresni 2025 roku, standartyzuvavshi dev'iat' funktsii, yaki rozrobliuvalysia rokamy.5152| Funktsiia | Shcho daie |53|---------|----------------|54| **WasmGC** | Natyvne zbyrannia smittia u WASM. Kerovani movy (Java, Kotlin, Dart) mozhut' kompiliuvatysia u WASM bez dostavky vlasnoho GC-runtime. Pidtrymuiet'sia u Chrome 119+, Firefox 120+, Safari 18.2+. |55| **Exception Handling** | Natyvnyi `try`/`catch` u WASM. Ranishe vyniatky vymahalyt dorohi kruhovyi obkhody do JavaScript. |56| **Tail Calls** | Zabezpechuie efektyvnu rekursiiu bez pereponennia steku. Krytychno dlia funktsional'nykh mov. |57| **Relaxed SIMD** | 128-bitni vektorni instruktsii dlia paralel'noi obrobky danykh. Dozvoliaie aparatni optymizatsii. |58| **Memory64** | Znimaie obmezhennnia liniinoi pam'iati u 4 HB. Neobkhidno dlia masshtabnoi obrobky danykh. |59| **Multi-memory** | Kil'ka nezalezhnykh oblastei pam'iati v odnomu moduli. |6061Naivazhlyvishym ie **WasmGC**. Ranishe kompiliatsiia Java abo Kotlin u WASM oznachala dostavku tsiloho garbage collector-a yak chastyny binarnoho failu, shcho rozduvalo rozmiry failiv. Teper vlsnyi GC brauzera keruie pam'iattiu WASM-moduliv, tochno tak samo, yak vin tse robyyt' dlia JavaScript.6263## WASI: WebAssembly poza brauzerom6465WASM u brauzeri potuzhnyni, ale **WASI (WebAssembly System Interface)** robyyt' WASM universal'nym runtime. WASI nadaie standartyzovani interfeisy dlia systemnykh resursiv - faily, merezha, hodynnyky, vypadkovi chysla - dozvoliaiuchy WASM-moduliam pratsiuvaty poza brauzerom.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 (potochnyi stabil'nyi reliz) vyznachaie nastupni interfeisy:8485- `wasi:filesystem` - failovi operatsii cherez capability handles (ne tradytsiini failovi deskryptory)86- `wasi:sockets` - merezha TCP/UDP87- `wasi:http` - obrobka HTTP-zapytiv/vidpovidei88- `wasi:clocks` - nastinnyi hodunnyk, monotonnyi hodunnyk89- `wasi:random` - kryptohrafichna vypadkovist'90- `wasi:cli` - arhumenty komandnoho riadka, zminni seredovyshcha, stdio9192Kliuchovyi pryntsyp - **bezpeka na osnovi mozhlyvostei**: WASM-modul' ne mozhe otrymaty dostup do failovoi systemy, yakshcho khost yavno ne nadast' handle do konkretnoho katalohu. Tse robyyt' WASI fundamental'no bezpechnishym za zapusk natyvnykh vykonuvanykh failiv.9394### Shliakh do WASI 1.09596WASI 0.3.0 (z dodavanniam async/prymityviv paralel'nosti) ochikuiet'sia u 2026 rotsi, WASI 1.0 maie nasliduvaty. Holovne dopovnennia - intehrovane u movu async z potokovym I/O bez kopiiuvannia.9798## Component Model99100Bazovi WASM-moduli mozhut' obminiuvatysia lyshe chyslamy. **Component Model** vyrishuie tse obmezhennnia, dodaiuchy bahatu systemu typiv ta shar kompozytsii poverkh WASM.101102### WIT (WebAssembly Interface Types)103104WIT - tse mova vyznachennia interfeisiv, yaka dozvoliaie komponentam oholoshuivaty svoi importy ta eksporty z bahatmy typamy - riadky, zapysy, spysky, varianty, enumy - a ne lyshe `i32` ta `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```126127Instrumenty, taki yak `wit-bindgen`, heneruiut' movni pryviiazky z failiv WIT. Komponent na Rust ta komponent na Python mozhut' obminiuvatysia riadkamy, zapysamy ta spyskamy cherez kontrakty WIT, pry ts'omu zhodna storona ne znaie movu realizatsii inshoi.128129## Stvorennia pershoho WASM-modulia na Rust130131Rust maie naizrilishi instrumenty dlia WASM. Stvorimo praktychnyi pryklad: modul' obrobky zobrazhen, shcho pratsiuie u brauzeri.132133### Nalashtuvannia134135```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### Nalashtuvannia 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### Napyshit' kod na Rust163164```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### Zbirka223224```bash225wasm-pack build --target web226```227228Tse stvoriuie kataloh `pkg/` z:229- `image_processor_bg.wasm` - skompil'ovanyi WASM-binarnyi fail230- `image_processor.js` - JavaScript-z'iednuval'nyi kod z vyznachenniamy TypeScript231- `package.json` - hotovyi do publikatsii u npm232233### Vykorystannia u JavaScript234235```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```285286Kliuchovyi vysnovok: `imageData.data` - tse `Uint8ClampedArray`, pidtrymuvanyai `ArrayBuffer`. Pry peredachi u WASM vin spil'no vykorystovuie tu samu pam'iat' - bez kopiiuvannia. Funktsiia na Rust modyfikuie pikseli na mistsi, i storona JavaScript bachyt' zminy nehaino.287288## Nyzhchyi riven': ruchna initsializatsiia WASM289290Yakshcho vy ne khochete vykorystovuvaty `wasm-bindgen`, vy mozhete stvoriuvaty ekzempliayry WASM-moduliv bezposerdn'o: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```306307Tse korysno, koly vam potribni minimal'ni nakladni vytraty i ne potribem bahatyi typovyi interop.308309## Produktyvnist': WASM vs JavaScript310311Real'ni benchmarky pokazuiut' znachne pryshvydshennia dlia CPU-intensyvnykh zavdan':312313| Zavdannia | JavaScript | WASM | Pryshvydshennia |314|------|-----------|------|---------|315| Obrobka zobrazhennia 4K | 180ms | 8ms (z SIMD) | 22x |316| Zmina rozmiru zobrazhennia (4K) | 250ms | 45ms | 5,5x |317| Fizychna symuliiatsiia (10K ob'iektiv) | Vtrachaiut'sia kadry | Plavni 60fps | ~10x |318| Parsynh JSON (velyke navantazhennia) | 12ms | 3ms | 4x |319| Kryptohrafichne kheshuvannia | 45ms | 6ms | 7,5x |320321WASM pratsiuie na blyz'ko 95% shvydkosti natyvnoho kodu. Naibil'shi vyhrashy dosiahaiut'sia za rakhunok:322- Peredbachuvanoi produktyvnosti (bez prohrivu JIT, bez pauz GC)323- Instruktsii SIMD dlia paralel'noi obrobky danykh324- Priamoho dostupu do pam'iati bez vtruchannia garbage collector-a325326De WASM NE shvydshyi: manipuliatsiia DOM, mali obchyslennia, zavdannia z obmezhenim I/O. JavaScript vzhe optymizovanyi dlia nykh.327328## Vyrobnychi keisy329330### Figma: renderynkh vektoriv u real'nomu chasi331332Osnovnyi rukhivok renderynhu Figma - tse C++, skompil'ovanyi u WASM. Kozhna forma, hradiient ta efekt obchysliuiut'sia u WASM ta malyuiut'sia na element Canvas. Tse dozvoliaie Figma obrobliaty skladni dyzainy z tysiachamy shariv pry 60fps u brauzeri - produktyvnist', yaka bula b nemozhlyvov na chystomu JavaScript.333334### Adobe Photoshop u vebi335336Adobe portuvala kliuchovi fil'try ta instrumenty Photoshop u WASM za dopomohoiu Rust. Yikhni benchmarky pokazuiut' obrobku zobrazhennia 4K za 22ms z WASM SIMD proty 180ms u JavaScript - 8-kratne pokrashchennia, yake robyt' mozhlyvym perehiliad fil'triv u real'nomu chasi.337338### Cloudflare Workers339340Cloudflare zapuskaie WASM-moduli u izoliiatakh V8 u ponad 330 edge-lokatsiiakh. Kholodni starty stanovliat' 1-5ms (u porivnianni zi 100-500ms dlia konteinernogo serverless). U liutomu 2026 roku vony rozghornuly inferens Llama-3-8b po vsiit svoii edge-merezhi z vykorystanniam WASM.341342### Google Meet343344Rozmyttia fonu ta virtual'ni fony u Google Meet vykorystovuiut' WASM z SIMD dlia obrobky video u real'nomu chasi. WASM-modul' obrobliiaie kozhen videokadr dostatn'o shvydko dlia pidtrymannia plavnoho video pry 30fps.345346## Pidtrymka brauzeriv (2026)347348| Funktsiia | Chrome | Firefox | Safari | Edge |349|---------|--------|---------|--------|------|350| Core WASM | Povna | Povna | Povna | Povna |351| Threads | Tak | Tak | Tak | Tak |352| SIMD (128-bit) | Tak | Tak | Tak | Tak |353| WasmGC | 119+ | 120+ | 18.2+ | Tak |354| Exception Handling | Tak | Tak | Tak | Tak |355| Memory64 | Tak | Tak | Chastkovo | Tak |356357Vsi osnovni brauzery povnistiu pidtrymuiut' WASM. Novishi funktsii (WasmGC, Exception Handling) dosiahnuly shyrokoi dostupnosti.358359## Dovidnyk instrumentiv360361| Instrument | Pryznachennia | Vstanovlennia |362|------|---------|---------|363| **wasm-pack** | Zbirka Rust u WASM, heneratsiia npm-paketiv | `cargo install wasm-pack` |364| **wasm-bindgen** | Pryviiazky Rust/JS interop (vykorystovuiet'sia wasm-pack) | Zalezhnist' u Cargo.toml |365| **wasm-opt** | Optymizatsiia rozmiru binarnoho failu (50%+ zmenshennia) | Chastyna Binaryen: `brew install binaryen` |366| **wit-bindgen** | Heneratsiia pryviiazok z WIT-failiv | `cargo install wit-bindgen-cli` |367| **Wasmtime** | Servernyi WASM-runtime (etalonna realizatsiia WASI) | `brew install wasmtime` |368| **Wasmer** | Al'ternatyvnyi WASM-runtime z pidtrymkoiu WASI | `curl https://get.wasmer.io -sSfL \| sh` |369| **wasm-feature-detect** | Vyiavlennia funktsii brauzera pid chas vykonannia | `npm install wasm-feature-detect` |370371### Optymizatsiia rozmiru binarnoho failu372373WASM-binarnyky mozhut' buty velykymy. Os' yak yikh zmenshyty: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```391392Typovyi WASM-modul' na Rust zmenshuiet'sia z 500KB do menshe 50KB z tsymy optymizatsiiamy.393394## Plan dii dlia startu395396```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## Vysnovok420421WebAssembly bil'she ne ie eksperymental'nym. Tse vyrobnycha tekhnolohiia, yaku vykorystovuiut' deiaki z naivymohlyvishykh zastosunkiv u vebi. Produktyvnist' blyz'ka do natyvnoi, bezpeka pisochnitsi ta universal'na portatyvnist' - zhodnyi inshyi tsil' kompiliatsii ne daie usikh tr'okh odnochasno.422423Vam ne potribno perepisuvaty ves' zastosunok na WASM. Pochnit' z odniei CPU-intensyvnoi funktsii - fil'tra zobrazhennia, parsera danykh, fizychnoho rozrakhunku - skompiliuiete yii u WASM ta vyklykhte z JavaScript. Vymiriaiete riznytsiiu. Potim vyrishit', de shche WASM mozhe dopomohty.424425Instrumenty zrili, pidtrymka brauzeriv universal'na, i ekosystema zrostaie. Yakshcho vy pyshete na Rust, vy vzhe na vidstani odniei komandy vid brauzera.426427> **Kontrol'nyi spysok dlia startu:**428>429> - [x] Rust ta wasm-pack vstanovleni430> - [x] Pershyi WASM-modul' zibranyii ta zapushchenyi u brauzeri431> - [x] JavaScript interop pratsiuie (vyklyk WASM z JS)432> - [x] Reliznna zbirka z optymizatsiiamy rozmiru zastosovana433> - [x] Produktyvnist' porivianiiana z ekvivalentom na chystomu JavaScript434> - [x] WASI doslidzheno z Wasmtime dlia servernykh keisiv435
:WebAssembly dlia veb-rozrobnykiv: vid nulia do prodakshenulines 1-435 (END) — press q to close