spinny:~/writing $ less webassembly-wasm-complete-guide.md
12To WebAssembly (WASM) xekinise os enas tropos gia na ekteleite C++ ston browser. To 2026, trexei pantoy - browsers, servers, edge diktya, ensomates syskeves - kai trofoditei merikes apo tis pio apaitiikies efarmoges sto web. I mixani renderarismatos tis Figma, to Adobe Photoshop sto web, i epexergasia video toy Google Meet kai i platforma edge computing toy Cloudflare - ola trexoyn se WebAssembly.34To Chrome Platform Status deixnei oti to WASM vriskete sto peripoy 5,5% olon ton fortoseon selidas sto Chrome stis arxes toy 2026, apo 4,5% ton proigoymeno xrono. Me to WASM 3.0 na ginete protypo W3C kai to WASI na orimzei pros tin ekdosi 1.0, to oikosystima exei ftasei se simio kampes.56Aftos o odigos kalyptei ola osa prepei na gnorixeis gia na arxiseis na chtizeis me WebAssembly.78## Ti einai to WebAssembly?910To WebAssembly einai ena binario format odigion sxediasmenoo os stoxos syllogis. Grafeis kodika se glossa ypssiiloy epipedoy (Rust, C, C++, Go, Kotlin), ton metafraxeis se `.wasm` kai ton ekteleis se opoidipote perivvalon poy exei WASM runtime - browsers, Node.js, Cloudflare Workers, Wasmtime i 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### Pos leitoyrgei2324To WASM einai mia **virtual machine vasiismeni se stoiva**. Oi synartiseis topothethyn kai afairoun times apo mia stoiva telesion. To runtime toy filoxenoynte (V8 sto Chrome, SpiderMonkey sto Firefox) kanei JIT-compilation to WASM bytecode se gennimeno kodika mixanis, gi afto i apodosi einai konta sto native.2526Vasika xaraktiristika:2728- **Ektelesei se sandbox**: ta WASM modules mporoun na exoun prosvasi mono sta resources poy o filoxenonteas parexei riita. Den yparxei prosvasi se filesystem, diktyo i leitourgiko systima ektos an epitrapei. Afto einai thimelioddoos diaforetiko apo ton native kodika.29- **Grammmiki mnimi**: enas monos synexis `ArrayBuffer` poy mirazetai metaxy WASM kai filoxenoynte. Syntheta dedomena (strings, structs) metaferontai me egrafi sti mnimi kai koinopoiisi deikti.30- **Periorismeni typoi**: to WASM ypostirixei native mono tessera types: `i32`, `i64`, `f32`, `f64`. Ola ta alla (strings, arrays, objects) apaytoun kodikopiiisi mesa apo ti grammiki mnimi i to Component Model.31- **Fornitotita**: to idio `.wasm` binary trexei se opoiadipote platforma me WASM runtime, xoris epanametafrasi.3233### WASM vs JavaScript3435To WASM den antikathistaa tin JavaScript. Ti symplirorei.3637| Ptixii | JavaScript | WebAssembly |38|--------|-----------|-------------|39| **Analysi** | Analysi + metafrasi se xrono ektelesis | Prometafrasmeno binary, mono apokodikopiiisi |40| **Taxytita ektelesis** | JIT-veltiomeni, metavliti | Konta se native, syntomi |41| **Ekkiniisi** | Grigori gia mikra scripts | Grigori apokodikopiiisi, provlepii |42| **Prosvasi DOM** | Amesi | Emesi (mesa apo JS glue) |43| **Kalytero gia** | UI, DOM manipulation, diaxirisi events | CPU-inteniis ypologismous |44| **Garbage collection** | Ensoomatoomeno | WasmGC (neo) i xeirokiinto |4546Xrisimopiiise JavaScript gia UI kai DOM ergasia. Xrisimopiiise WASM gia varous ypologismous: epexergasia eikonon, kodikopiiisi video, fysikes proomoioseis, kryptografia, analysi dedomenon.4748## WASM 3.0: Ti neo yparxei4950To WebAssembly 3.0 egine protypo W3C ton Septemvrio 2025, typopoiontas ennea xaraktiristika poy itan ypo anaptyksi gia xronia.5152| Xaraktiristiko | Ti epetrepei |53|---------|----------------|54| **WasmGC** | Gennimeni syllogi skoypidion sto WASM. Diaxeiriziomenes glosses (Java, Kotlin, Dart) mporoyn na metafraztoun se WASM xoris na sylperilvanoun to diko tous GC runtime. Ypostirrixetai se Chrome 119+, Firefox 120+, Safari 18.2+. |55| **Exception Handling** | Gennimeno `try`/`catch` sto WASM. Prooigoymenos, ta exceptions apaytousan akriva roundtrips sti JavaScript. |56| **Tail Calls** | Epetrepei apotelesmmatiki anadromi xoris stack overflow. Krisimo gia functional glosses. |57| **Relaxed SIMD** | 128-bit vektoriikes odigies gia parallili epexergasia dedomenon. Epetrepei hardware-specific veltiostiopoiiseis. |58| **Memory64** | Xeperna to orio grammikis mniimis 4GB. Apaiiteto gia epexergasia dedomenon megalis kliimakas. |59| **Multi-memory** | Pollaples anexartiites perioxes mniimis se ena module. |6061To pio simaantiko einai to **WasmGC**. Prin apo afto, i metafrasi Java i Kotlin se WASM siimaine apostoli enos olokliiroy garbage collector os meros toy binary, poy foyskone ta megethi arxeion. Tora o idios GC toy browser diaxeirizetai ti diaxeirisi mniimis gia ta WASM modules, opos akriviis kanei gia ti JavaScript.6263## WASI: WebAssembly pera apo ton browser6465To WASM ston browser einai dynato, alla to **WASI (WebAssembly System Interface)** einai afto poy kanei to WASM enan pagkosmio runtime. To WASI parexei typopoiimenes diepafes gia poroys systimatos - arxeia, diktyo, roloia, tyxaioys arithmous - epitrepontas sta WASM modules na trexoun exo apo ton browser.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```8283To WASI Preview 2 (i trexousa statheri ekdosi) orixei tis akloythes diepafes:8485- `wasi:filesystem` - leitoyrgies arxeion meso capability handles (oxi paradosiakous file descriptors)86- `wasi:sockets` - TCP/UDP diktyo87- `wasi:http` - diaxirisi HTTP request/response88- `wasi:clocks` - roloi toixoy, monotonico roloi89- `wasi:random` - kryptografiki tyxaiotita90- `wasi:cli` - orismmata grammis entoloon, perivallontiikes metavlites, stdio9192I vasiki arxi einai i **asfaleia vasismeni se dynamotites**: ena WASM module den mporei na exei prosvasi sto filesystem ektos an o filoxenonteas parexei riita ena handle se sygkekrimeno fakelo. Afto kanei to WASI thymelioddoos asfalessteroo apo tin ektelesei gennimennon ektelessimon arxeion.9394### I poreia pros to WASI 1.09596To WASI 0.3.0 (prosthiiki async/symplektikon primitiivon) anameenetai to 2026, me to WASI 1.0 na akoloythei. I kyria prosthiki einai to glossiika ensoomatoomeno async me zero-copy streaming I/O.9798## To Component Model99100Ta vasika WASM modules mporoyn na atallaaxoun mono arithmoys. To **Component Model** lyni afton ton periorismo prosthetondas ena plousio systima typon kai ena epipedo synthetotitas pano apo to WASM.101102### WIT (WebAssembly Interface Types)103104To WIT einai mia glossa orismoy diepafon poy epitrepei sta components na dilosoun ta imports kai exports tous me ploysious typous - strings, records, lists, variants, enums - oxi mono `i32` kai `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```126127Ergaleia opos to `wit-bindgen` paragoun glossikes syndeseis apo arxeia WIT. Ena Rust component kai ena Python component mporoyn na antalaaxoun strings, records kai lists meso WIT contracts xoris kamia pleyra na gnorixei ti glossa ylpoiisis tis allis.128129## Xtiismo toy protoy WASM module soy me Rust130131I Rust exei ta pio orimma ergaleia WASM. As chtisoyame ena praktiko paradeigma: ena module epexergasias eikonon poy trexei ston browser.132133### Ryhthmisi134135```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### Ryhthmisi 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### Grapse ton kodika 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### Chtismo223224```bash225wasm-pack build --target web226```227228Afto dimiourgei enan katalogo `pkg/` me:229- `image_processor_bg.wasm` - to metafrasmeno WASM binary230- `image_processor.js` - JavaScript glue code me TypeScript definitions231- `package.json` - etoimo gia dimosieysi sto npm232233### Xrisi se 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```285286To vasiko symperasma: to `imageData.data` einai ena `Uint8ClampedArray` poy ypostirixetai apo ena `ArrayBuffer`. Otan perasetai sto WASM, moirazetai tin idia mnimi - xoris antigrafi. I synartisi Rust tropopoiei ta pixels epi topoy, kai i pleyra JavaScript vlepei tis allages amesa.287288## Xamilitero epipedo: xeirokiiiti dimioyrgia WASM289290An den theleis na xrisimopiiiseis to `wasm-bindgen`, mporeis na dimioyrgiiseis WASM modules apefthias: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```306307Afto einai xrisimo otan theleis elaxisto overhead kai den xreiaresai ploysio type interop.308309## Apodosi: WASM vs JavaScript310311Pragmatika benchmarks deixnoun simantiikes epiditaxynsis gia CPU-inteniis ergasies:312313| Ergasia | JavaScript | WASM | Epiditaxynsii |314|------|-----------|------|---------|315| Epexergasia eikonas 4K | 180ms | 8ms (me SIMD) | 22x |316| Allagi megethos eikonas (4K) | 250ms | 45ms | 5,5x |317| Fysiki promoiosi (10K ontotites) | Aptosi frames | Omalo 60fps | ~10x |318| Analysi JSON (megalo payload) | 12ms | 3ms | 4x |319| Kryptografiko hashing | 45ms | 6ms | 7,5x |320321To WASM trexei sto peripoy 95% tis taxytitas toy native kodika. Ta megalitera kerdi provainoun apo:322- Provlepsimi apodosi (xoris JIT warmup, xoris GC pauses)323- SIMD odigies gia parallili epexergasia dedomenon324- Amesi prosvasi sti mnimi xoris paremvasi garbage collector325326Opoy to WASM DEN einai grigoritero: DOM manipulation, mikres ypologismoi, I/O-bound ergasies. I JavaScript einai idi veltiomeni gi afta.327328## Periptoseis xrisis stin paragogi329330### Figma: Renderarisma vectors se pragmatiko xrono331332I kyria mixani renderarismatos tis Figma einai C++ metafrasmeni se WASM. Kathe sxima, gradient kai efekt ypologizetai sto WASM kai ixnografeite se ena Canvas element. Afto epitrepei sti Figma na diaxeirizetai sintheta sxedia me xiliades layers sta 60fps ston browser - apodosi poy tha itan adynati se kathara JavaScript.333334### Adobe Photoshop sto web335336I Adobe metafere ta vasika filtra kai ergaleia toy Photoshop se WASM xrisimopoionteas Rust. Ta benchmarks tous deixnoun epexergasia eikonas 4K se 22ms me WASM SIMD enanti 180ms se JavaScript - mia 8x veltioosi poy kanei dynati tin pragmatikou xronou proepiskopisi filtron.337338### Cloudflare Workers339340To Cloudflare trexei WASM modules se V8 isolates se 330+ edge topothesies. Ta kria starts einai 1-5ms (se sygrisi me 100-500ms gia container-based serverless). Ton Fevrouario 2026, anaptixxan inference Llama-3-8b se olo to edge diktyo tous xrisimopoionteas WASM.341342### Google Meet343344To tholoma fontoy kai ta virtual backgrounds sto Google Meet xrisimopoioun WASM me SIMD gia epexergasia video se pragmatiko xrono. To WASM module epexergazetai kathe frame video arketa grigora gia na diatirei omalo video sta 30fps.345346## Ypostirixi browser (2026)347348| Xaraktiristiko | Chrome | Firefox | Safari | Edge |349|---------|--------|---------|--------|------|350| Core WASM | Plires | Plires | Plires | Plires |351| Threads | Nai | Nai | Nai | Nai |352| SIMD (128-bit) | Nai | Nai | Nai | Nai |353| WasmGC | 119+ | 120+ | 18.2+ | Nai |354| Exception Handling | Nai | Nai | Nai | Nai |355| Memory64 | Nai | Nai | Merikos | Nai |356357Oloi oi kyrioi browsers ypostirixoun pliros to WASM. Ta neotera xaraktiristika (WasmGC, Exception Handling) exoun ftasei se eyreia diathesimotita.358359## Anafora ergaleion360361| Ergaleio | Skopos | Egatastasi |362|------|---------|---------|363| **wasm-pack** | Chtismo Rust se WASM, dimioyrgia npm packages | `cargo install wasm-pack` |364| **wasm-bindgen** | Rust/JS interop bindings (xrisimopoieitai apo wasm-pack) | Dependency sto Cargo.toml |365| **wasm-opt** | Veltiostopiiisi megethous binary (50%+ meiosii) | Meros toy Binaryen: `brew install binaryen` |366| **wit-bindgen** | Dimioyrgia bindings apo arxeia WIT | `cargo install wit-bindgen-cli` |367| **Wasmtime** | Server-side WASM runtime (anafora ylpoiisis WASI) | `brew install wasmtime` |368| **Wasmer** | Enallaktiko WASM runtime me ypostirixi WASI | `curl https://get.wasmer.io -sSfL \| sh` |369| **wasm-feature-detect** | Anixneysi xaraktiristikon browser se xrono ektelesis | `npm install wasm-feature-detect` |370371### Veltiostopiiisi megethous binary372373Ta WASM binaries mporoyn na einai megala. Na pos ta mikroyneis: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```391392Ena typiko Rust WASM module paei apo 500KB se kato apo 50KB me aftes tis veltiostopiiiseis.393394## Xartis poreias gia xekinima395396```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## Symperasma420421To WebAssembly den einai pia peiramatiko. Einai mia technologia paragogis poy xrisimopoieitai apo merikes apo tis pio apaitiitikes efarmoges sto web. Apodosi konta sti natiive, asfaleia sandboxed kai pagkosmia fornitotita - kanenas allos stoxos syllogis den soy dinei kai ta tria.422423Den xreiazetai na xanagrapsis olis tin efarmogi soy se WASM. Arxise me mia moni CPU-intenii synartisi - ena filtro eikonas, enan analyti dedomenon, enan fysiko ypologismo - metafrase tin se WASM kai kalese tin apo JavaScript. Metrise ti diafora. Meta apofasise poy alloy mporei na voithisei to WASM.424425Ta ergaleia einai orimma, i ypostirixi browser einai pagkosmia, kai to oikosystima megalononei. An grafeis Rust, eisai idi mia entoli makria apo ton browser.426427> **Lista elegxoy gia xekinima:**428>429> - [x] Rust kai wasm-pack egatastimena430> - [x] Proto WASM module xtismeno kai trexei ston browser431> - [x] JavaScript interop leitourgei (klisi WASM apo JS)432> - [x] Release build me veltiostopiiiseis megethous efarmosmenees433> - [x] Apodosi axiologimeni enanti katharoy JavaScript isodinamoy434> - [x] WASI exerevnimeno me Wasmtime gia server-side periptoseis xrisis435
:WebAssembly gia Web Developers: Apo to miden stin paragogilines 1-435 (END) — press q to close