spinny:~/writing $ less webassembly-wasm-complete-guide.md
12بدأ WebAssembly (WASM) كطريقة لتشغيل C++ في المتصفح. في عام 2026، يعمل في كل مكان - المتصفحات، الخوادم، شبكات الحافة، الأجهزة المدمجة - ويشغّل بعضاً من أكثر التطبيقات تطلباً على الويب. محرك العرض في Figma، وAdobe Photoshop على الويب، ومعالجة الفيديو في Google Meet، ومنصة الحوسبة الحافية في Cloudflare جميعها تعمل على WebAssembly.34وفقاً لـ Chrome Platform Status، يمثل WASM ما يقرب من 5.5% من جميع تحميلات صفحات Chrome في أوائل 2026، ارتفاعاً من 4.5% في العام السابق. مع أن WASM 3.0 أصبح معيار W3C ونضوج WASI نحو الإصدار 1.0، وصل النظام البيئي إلى نقطة تحول.56يغطي هذا الدليل كل ما تحتاج معرفته للبدء في البناء باستخدام WebAssembly.78## ما هو WebAssembly؟910WebAssembly هو تنسيق تعليمات ثنائي مصمم كهدف للتجميع. تكتب الكود بلغة عالية المستوى (Rust, C, C++, Go, Kotlin)، تجمّعه إلى `.wasm`، وتشغّله في أي بيئة تحتوي على بيئة تشغيل WASM - المتصفحات، Node.js، Cloudflare Workers، Wasmtime، أو 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### كيف يعمل2324WASM هو **آلة افتراضية قائمة على المكدس (stack-based virtual machine)**. تدفع الدوال القيم وتسحبها من مكدس المعاملات. بيئة التشغيل المضيفة (V8 في Chrome، SpiderMonkey في Firefox) تجمّع بايت كود WASM إلى كود آلة أصلي بتقنية JIT، وهذا هو سبب أن الأداء قريب من الأداء الأصلي.2526الخصائص الرئيسية:2728- **التنفيذ المعزول (Sandboxed execution)**: يمكن لوحدات WASM الوصول فقط إلى الموارد التي يمنحها المضيف صراحةً. لا نظام ملفات، لا شبكة، لا وصول لنظام التشغيل ما لم يُسمح بذلك. هذا مختلف جذرياً عن الكود الأصلي.29- **الذاكرة الخطية (Linear memory)**: `ArrayBuffer` واحد متصل مشترك بين WASM والمضيف. البيانات المعقدة (النصوص، الهياكل) تُمرر بالكتابة في الذاكرة ومشاركة المؤشر.30- **محدود الأنواع (Type-limited)**: يدعم WASM أصلياً أربعة أنواع فقط: `i32`، `i64`، `f32`، `f64`. كل شيء آخر (النصوص، المصفوفات، الكائنات) يتطلب الترميز عبر الذاكرة الخطية أو Component Model.31- **قابل للنقل (Portable)**: نفس ملف `.wasm` الثنائي يعمل على أي منصة تحتوي على بيئة تشغيل WASM، دون إعادة تجميع.3233### WASM مقابل JavaScript3435WASM لا يحل محل JavaScript. إنه يكمّله.3637| الجانب | JavaScript | WebAssembly |38|--------|-----------|-------------|39| **التحليل** | تحليل + تجميع أثناء التشغيل | ثنائي مجمّع مسبقاً، فك تشفير فقط |40| **سرعة التنفيذ** | محسّن بـ JIT، متغير | قريب من الأصلي، متسق |41| **بدء التشغيل** | سريع للنصوص الصغيرة | فك تشفير سريع، متوقع |42| **وصول DOM** | مباشر | غير مباشر (عبر كود JS الوسيط) |43| **الأفضل لـ** | UI، معالجة DOM، معالجة الأحداث | الحسابات كثيفة المعالج |44| **جمع المخلفات** | مدمج | WasmGC (جديد)، أو يدوي |4546استخدم JavaScript لأعمال واجهة المستخدم وDOM. استخدم WASM للحسابات الثقيلة: معالجة الصور، ترميز الفيديو، محاكاة الفيزياء، التشفير، تحليل البيانات.4748## WASM 3.0: ما الجديد4950أصبح WebAssembly 3.0 معيار W3C في سبتمبر 2025، حيث وحّد تسع ميزات كانت قيد التطوير لسنوات.5152| الميزة | ما تتيحه |53|---------|----------------|54| **WasmGC** | جمع مخلفات أصلي في WASM. اللغات المُدارة (Java, Kotlin, Dart) يمكنها التجميع إلى WASM دون شحن بيئة تشغيل GC خاصة بها. مدعوم في Chrome 119+، Firefox 120+، Safari 18.2+. |55| **Exception Handling** | `try`/`catch` أصلي في WASM. سابقاً، كانت الاستثناءات تتطلب رحلات ذهاب وإياب مكلفة إلى JavaScript. |56| **Tail Calls** | تمكين العودية الفعالة دون تجاوز المكدس. حاسم للغات الوظيفية. |57| **Relaxed SIMD** | تعليمات متجهات 128 بت لمعالجة البيانات المتوازية. تمكين تحسينات خاصة بالعتاد. |58| **Memory64** | يكسر حد الذاكرة الخطية 4GB. مطلوب لمعالجة البيانات واسعة النطاق. |59| **Multi-memory** | مناطق ذاكرة مستقلة متعددة في وحدة واحدة. |6061الأكثر تأثيراً هو **WasmGC**. قبله، كان تجميع Java أو Kotlin إلى WASM يعني شحن جامع مخلفات كامل كجزء من الملف الثنائي، مما يضخم حجم الملفات. الآن يتولى جامع المخلفات الخاص بالمتصفح إدارة الذاكرة لوحدات WASM، تماماً كما يفعل مع JavaScript.6263## WASI: WebAssembly خارج المتصفح6465WASM في المتصفح قوي، لكن **WASI (واجهة نظام WebAssembly)** هو ما يجعل WASM بيئة تشغيل عالمية. يوفر WASI واجهات موحدة لموارد النظام - الملفات، الشبكات، الساعات، الأرقام العشوائية - مما يسمح لوحدات WASM بالعمل خارج المتصفح.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```8283يحدد WASI Preview 2 (الإصدار المستقر الحالي) هذه الواجهات:8485- `wasi:filesystem` - عمليات الملفات عبر مقابض القدرات (ليس واصفات الملفات التقليدية)86- `wasi:sockets` - شبكات TCP/UDP87- `wasi:http` - معالجة طلبات/استجابات HTTP88- `wasi:clocks` - ساعة الحائط، الساعة الرتيبة89- `wasi:random` - عشوائية تشفيرية90- `wasi:cli` - وسائط سطر الأوامر، متغيرات البيئة، stdio9192المبدأ الأساسي هو **الأمان القائم على القدرات (capability-based security)**: لا يمكن لوحدة WASM الوصول إلى نظام الملفات ما لم يمنح المضيف صراحةً مقبضاً لمجلد محدد. هذا يجعل WASI أكثر أماناً جذرياً من تشغيل الملفات التنفيذية الأصلية.9394### الطريق إلى WASI 1.09596من المتوقع صدور WASI 0.3.0 (إضافة أوليات async/concurrency) في 2026، يليه WASI 1.0. الإضافة الرئيسية هي async مدمج في اللغة مع تدفق I/O بدون نسخ.9798## Component Model99100وحدات WASM الأساسية يمكنها تبادل الأرقام فقط. **Component Model** يحل هذا القيد بإضافة نظام أنواع غني وطبقة قابلية التركيب فوق WASM.101102### WIT (أنواع واجهة WebAssembly)103104WIT هي لغة تعريف واجهات تتيح للمكونات الإعلان عن وارداتها وصادراتها بأنواع غنية - نصوص، سجلات، قوائم، متغيرات، تعدادات - ليس فقط `i32` و `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```126127سلاسل الأدوات مثل `wit-bindgen` تولّد ربطاً خاصة باللغة من ملفات WIT. يمكن لمكون Rust ومكون Python تبادل النصوص والسجلات والقوائم عبر عقود WIT دون أن يعرف أي طرف لغة تنفيذ الطرف الآخر.128129## بناء أول وحدة WASM باستخدام Rust130131يمتلك Rust أنضج أدوات WASM. لنبنِ مثالاً عملياً: وحدة معالجة صور تعمل في المتصفح.132133### الإعداد134135```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### تكوين 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### كتابة كود 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### البناء223224```bash225wasm-pack build --target web226```227228ينتج هذا مجلد `pkg/` يحتوي على:229- `image_processor_bg.wasm` - الملف الثنائي المجمّع لـ WASM230- `image_processor.js` - كود JavaScript الوسيط مع تعريفات TypeScript231- `package.json` - جاهز للنشر على npm232233### الاستخدام في 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```285286الرؤية الأساسية: `imageData.data` هو `Uint8ClampedArray` مدعوم بـ `ArrayBuffer`. عند تمريره إلى WASM، يتشارك نفس الذاكرة - بدون نسخ. تعدّل دالة Rust البكسلات في مكانها، ويرى جانب JavaScript التغييرات فوراً.287288## المستوى الأدنى: إنشاء مثيل WASM يدوياً289290إذا كنت لا تريد استخدام `wasm-bindgen`، يمكنك إنشاء مثيلات وحدات WASM مباشرة: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```306307هذا مفيد عندما تريد الحد الأدنى من الحمل الزائد ولا تحتاج إلى تكامل أنواع غني.308309## الأداء: WASM مقابل JavaScript310311تُظهر المعايير الواقعية تسريعات كبيرة للمهام كثيفة المعالج:312313| المهمة | JavaScript | WASM | التسريع |314|------|-----------|------|---------|315| معالجة صور 4K | 180ms | 8ms (مع SIMD) | 22x |316| تغيير حجم صورة (4K) | 250ms | 45ms | 5.5x |317| محاكاة فيزياء (10K كيان) | إسقاط إطارات | 60fps سلس | ~10x |318| تحليل JSON (حمولة كبيرة) | 12ms | 3ms | 4x |319| تجزئة تشفيرية | 45ms | 6ms | 7.5x |320321يعمل WASM بحوالي 95% من سرعة الكود الأصلي. أكبر المكاسب تأتي من:322- أداء متوقع (لا إحماء JIT، لا توقفات GC)323- تعليمات SIMD لمعالجة البيانات المتوازية324- وصول مباشر للذاكرة دون تدخل جامع المخلفات325326حيث لا يكون WASM أسرع: معالجة DOM، الحسابات الصغيرة، المهام المقيدة بالإدخال/الإخراج. JavaScript محسّن بالفعل لهذه الأمور.327328## حالات الاستخدام الإنتاجية329330### Figma: عرض متجهات في الوقت الحقيقي331332محرك العرض الأساسي في Figma هو C++ مجمّع إلى WASM. كل شكل، تدرج، وتأثير يُحسب في WASM ويُرسم على عنصر Canvas. هذا يتيح لـ Figma التعامل مع تصميمات معقدة بآلاف الطبقات بمعدل 60fps في المتصفح - أداء يستحيل تحقيقه بـ JavaScript فقط.333334### Adobe Photoshop على الويب335336نقلت Adobe مرشحات وأدوات Photoshop الرئيسية إلى WASM باستخدام Rust. تُظهر معاييرهم معالجة صور 4K في 22ms مع WASM SIMD مقابل 180ms في JavaScript - تحسين 8x يجعل معاينة المرشحات في الوقت الحقيقي ممكنة.337338### Cloudflare Workers339340يشغّل Cloudflare وحدات WASM في عزلات V8 عبر أكثر من 330 موقعاً حافياً. بدايات التشغيل الباردة هي 1-5ms (مقارنة بـ 100-500ms للخوادم بدون خادم المعتمدة على الحاويات). في فبراير 2026، نشروا استدلال Llama-3-8b عبر شبكتهم الحافية باستخدام WASM.341342### Google Meet343344التمويه الخلفي والخلفيات الافتراضية في Google Meet تستخدم WASM مع SIMD لمعالجة الفيديو في الوقت الحقيقي. تعالج وحدة WASM كل إطار فيديو بسرعة كافية للحفاظ على فيديو سلس بمعدل 30fps.345346## دعم المتصفحات (2026)347348| الميزة | Chrome | Firefox | Safari | Edge |349|---------|--------|---------|--------|------|350| Core WASM | كامل | كامل | كامل | كامل |351| Threads | نعم | نعم | نعم | نعم |352| SIMD (128-bit) | نعم | نعم | نعم | نعم |353| WasmGC | 119+ | 120+ | 18.2+ | نعم |354| Exception Handling | نعم | نعم | نعم | نعم |355| Memory64 | نعم | نعم | جزئي | نعم |356357جميع المتصفحات الرئيسية تدعم WASM بالكامل. الميزات الأحدث (WasmGC, Exception Handling) وصلت إلى توفر واسع.358359## مرجع الأدوات360361| الأداة | الغرض | التثبيت |362|------|---------|---------|363| **wasm-pack** | بناء Rust إلى WASM، توليد حزم npm | `cargo install wasm-pack` |364| **wasm-bindgen** | ربط تكامل Rust/JS (يستخدمه wasm-pack) | تبعية في Cargo.toml |365| **wasm-opt** | تحسين حجم الملف الثنائي (تقليل 50%+) | جزء من Binaryen: `brew install binaryen` |366| **wit-bindgen** | توليد ربط من ملفات WIT | `cargo install wit-bindgen-cli` |367| **Wasmtime** | بيئة تشغيل WASM على جانب الخادم (تطبيق WASI المرجعي) | `brew install wasmtime` |368| **Wasmer** | بيئة تشغيل WASM بديلة مع دعم WASI | `curl https://get.wasmer.io -sSfL \| sh` |369| **wasm-feature-detect** | كشف ميزات المتصفح أثناء التشغيل | `npm install wasm-feature-detect` |370371### تحسين حجم الملف الثنائي372373يمكن أن تكون ملفات WASM الثنائية كبيرة. إليك كيفية تقليصها: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```391392وحدة Rust WASM نموذجية تنخفض من 500KB إلى أقل من 50KB مع هذه التحسينات.393394## خارطة طريق البدء395396```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## الخلاصة420421WebAssembly لم يعد تجريبياً. إنه تقنية إنتاجية تستخدمها بعض أكثر التطبيقات تطلباً على الويب. أداء قريب من الأصلي، أمان معزول، وقابلية نقل عالمية - لا يوجد هدف تجميع آخر يمنحك الثلاثة.422423لست بحاجة لإعادة كتابة تطبيقك بالكامل بـ WASM. ابدأ بدالة واحدة كثيفة المعالج - مرشح صور، محلل بيانات، حساب فيزيائي - جمّعها إلى WASM، واستدعها من JavaScript. قِس الفرق. ثم قرر أين يمكن لـ WASM المساعدة أيضاً.424425الأدوات ناضجة، دعم المتصفحات عالمي، والنظام البيئي ينمو. إذا كنت تكتب Rust، فأنت بالفعل على بُعد أمر واحد من المتصفح.426427> **قائمة مراجعة البدء:**428>429> - [x] تثبيت Rust وwasm-pack430> - [x] بناء أول وحدة WASM وتشغيلها في المتصفح431> - [x] تكامل JavaScript يعمل (استدعاء WASM من JS)432> - [x] بناء إصدار بتحسينات الحجم مطبقة433> - [x] قياس الأداء مقارنة بمكافئ JavaScript الخالص434> - [x] استكشاف WASI مع Wasmtime لحالات استخدام جانب الخادم435
:WebAssembly لمطوري الويب: من الصفر إلى الإنتاجlines 1-435 (END) — press q to close