
WebAssembly (Wasm) هو تنسيق تعليمات ثنائي منخفض المستوى يتم تنفيذه بسرعة قريبة من السرعة الأصلية في متصفحات الويب الحديثة. فهو يوفر هدفًا تجميعيًا للغات مثل C وC++ وRust وGo، مما يتيح تشغيل التطبيقات عالية الأداء - تحرير الفيديو، والعرض ثلاثي الأبعاد، والألعاب، والمحاكاة العلمية - في المتصفح بأداء مماثل للتعليمات البرمجية الأصلية.
WebAssembly (Wasm) هو تنسيق تعليمات ثنائي منخفض المستوى يتم تنفيذه بسرعة قريبة من السرعة الأصلية في متصفحات الويب الحديثة. فهو يوفر هدفًا تجميعيًا للغات مثل C وC++ وRust وGo، مما يتيح تشغيل التطبيقات عالية الأداء - تحرير الفيديو، والعرض ثلاثي الأبعاد، والألعاب، والمحاكاة العلمية - في المتصفح بأداء مماثل للتعليمات البرمجية الأصلية.
Wasm لا يحل محل JavaScript، بل هو مكمل له. يتعامل JavaScript مع واجهة المستخدم والتفاعل بينما يقوم Wasm بتشغيل المسارات الحرجة للأداء.
لم يتم تصميم JavaScript مطلقًا للحوسبة عالية الأداء. إنها لغة مكتوبة ديناميكيًا ومجمعة للقمامة وذات خيط واحد. في حين أن مترجمي JIT الحديثين (V8، SpiderMonkey) قد جعلوا JS سريعًا بشكل ملحوظ، إلا أن القيود الأساسية لا تزال قائمة:
| القيد | تأثير |
|---|---|
| الكتابة الديناميكية | يضيف التحقق من النوع في وقت التشغيل النفقات العامة |
| جمع القمامة | توقف مؤقت لدورات GC |
| خيط واحد | لا يمكن استخدام وحدات المعالجة المركزية متعددة النواة (بدون عمال الويب) |
| لا يوجد SIMD (حتى وقت قريب) | أبطأ لأحمال العمل الموازية |
| تطبيقات كبيرة | يعد تحليل وتجميع JS أمرًا مكلفًا |
| ميزة | فائدة |
|---|---|
| ** السرعة القريبة من الأصلية ** | يتم تشغيل الملفات الثنائية المجمعة بشكل أسرع بمعدل 10 إلى 50 مرة من JavaScript المكافئة للمهام التي تتطلب حوسبة مكثفة |
| أداء متوقع | لا يوجد إحماء JIT، ولا يوجد توقف مؤقت لجمع البيانات المهملة |
| ** المرونة اللغوية ** | اكتب بلغة Rust أو C++ أو Go أو Zig أو أكثر من 40 لغة أخرى |
| صندوق رمل آمن | يعمل في بيئة معزولة آمنة للذاكرة |
| محمول | يعمل على أي متصفح وخادم وإنترنت الأشياء والأجهزة المدمجة الحديثة |
| حجم الملف صغير | عادةً ما يكون ثنائي Wasm أصغر بنسبة 50-80% من JS المكافئ |
Task JavaScript WebAssembly Native
─────────────────────────────────────────────────────────
Image blur (4MP) 120ms 8ms 5ms
JSON parse (10MB) 45ms 12ms 10ms
Physics simulation 30 FPS 60 FPS 60 FPS
Audio encoding 3.2x realtime 0.8x realtime 0.5x realtime
Video decoding 30 FPS 60 FPS 60 FPS
Source Code (Rust/C++/Go/...) ──► Compiler (wasm-pack, emcc, tinygo)
│
▼
.wasm binary
│
▼
Browser or Runtime
(V8, SpiderMonkey, Wasmtime)
│
▼
Machine Code
// Load and instantiate a WebAssembly module
const response = await fetch('module.wasm');
const bytes = await response.arrayBuffer();
const { instance } = await WebAssembly.instantiate(bytes);
// Call exported functions
const result = instance.exports.add(5, 7);
console.log(result); // 12
لدى Wasm ذاكرة خطية — مجموعة متجاورة من البايتات التي يمكن لكل من وحدة Wasm وJavaScript الوصول إليها:
// Wasm memory is accessible from JavaScript
const memory = instance.exports.memory;
const buffer = new Uint8Array(memory.buffer, offset, length);
// Write data from JS to Wasm memory
buffer[0] = 42;
// Call Wasm function that reads from memory
instance.exports.process_data(offset, length);
// Read results back
console.log(buffer[0]); // Wasm may have modified it
أصبحت Rust اللغة الأكثر شيوعًا لتطوير WebAssembly:
// lib.rs
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn fibonacci(n: u32) -> u32 {
match n {
0 => 0,
1 => 1,
_ => fibonacci(n - 1) + fibonacci(n - 2),
}
}
#[wasm_bindgen]
pub fn process_image(data: &[u8], width: u32, height: u32) -> Vec<u8> {
// High-performance image processing
data.chunks(4)
.map(|pixel| {
let r = pixel[0] as f32;
let g = pixel[1] as f32;
let b = pixel[2] as f32;
let gray = (r * 0.299 + g * 0.587 + b * 0.114) as u8;
[gray, gray, gray, pixel[3]]
})
.flatten()
.collect()
}
# Build Wasm package
wasm-pack build --target web
# Generated files:
# - pkg/my_wasm_bg.wasm (compiled Wasm binary)
# - pkg/my_wasm.js (JS glue)
# - pkg/my_wasm.d.ts (TypeScript types)
// image_filter.cpp
#include <emscripten/emscripten.h>
extern "C" {
EMSCRIPTEN_KEEPALIVE
void apply_sepia(unsigned char* data, int length) {
for (int i = 0; i < length; i += 4) {
int r = data[i];
int g = data[i + 1];
int b = data[i + 2];
data[i] = (r * 0.393 + g * 0.769 + b * 0.189);
data[i + 1] = (r * 0.349 + g * 0.686 + b * 0.168);
data[i + 2] = (r * 0.272 + g * 0.534 + b * 0.131);
}
}
}
emcc image_filter.cpp -o image_filter.js -s WASM=1 -s EXPORTED_FUNCTIONS='["_apply_sepia"]'
package main
import "syscall/js"
func add(this js.Value, args []js.Value) interface{} {
return js.ValueOf(args[0].Int() + args[1].Int())
}
func main() {
c := make(chan struct{}, 0)
js.Global().Set("wasmAdd", js.FuncOf(add))
<-c
}
tinygo build -o main.wasm -target wasm main.go
| طلب | لغة | لماذا وسام |
|---|---|---|
| ** فيجما ** | C++ (عبر إمسكريتن) | تقديم ناقلات في الوقت الحقيقي |
| أدوبي فوتوشوب ويب | سي ++ | تحرير الصور على مستوى سطح المكتب في المتصفح |
| جوجل إيرث | سي ++ | عرض ثلاثي الأبعاد للتضاريس العالمية |
| ** أوتوكاد ويب ** | سي ++ | نمذجة CAD في المتصفح |
| FFmpeg.wasm | C | تحويل ترميز الفيديو بالكامل في المتصفح |
يتم تجميع محركات اللعبة إلى WebAssembly:
# Unity
Build Settings → WebGL → Build
# Unreal Engine
# Supports WebAssembly as a target platform
تعمل واجهة نظام WebAssembly (WASI) على تمكين Wasm خارج المتصفح:
┌──────────────────────────────────────────┐
│ Serverless Platform │
├──────────────────────────────────────────┤
│ Cloudflare Workers │
│ ┌──────────┐ ┌──────────┐ ┌─────────┐ │
│ │ Wasm app1│ │ Wasm app2│ │ Wasm... │ │
│ └──────────┘ └──────────┘ └─────────┘ │
│ ┌──────────────────────────────────────┐│
│ │ Fastly Compute@Edge ││
│ └──────────────────────────────────────┘│
│ ┌──────────────────────────────────────┐│
│ │ Fermyon Spin (Nomad) ││
│ └──────────────────────────────────────┘│
└──────────────────────────────────────────┘
فوائد Wasm من جانب الخادم:
يعد Wasm مثاليًا للتوسع - حيث يمكن للتطبيقات تشغيل المكونات الإضافية التي يساهم بها المستخدم بأمان:
// Application engine with Wasm plugin support
fn run_plugin(plugin_bytes: &[u8], input_data: &[u8]) -> Result<Vec<u8>, Error> {
let engine = Engine::default();
let module = Module::new(&engine, plugin_bytes)?;
let store = Store::new(&engine, ());
// Wasm plugin runs in a sandboxed environment
let instance = Instance::new(&store, &module, &[])?;
let result = instance.exports()
.get_typed_function::<(i32, i32), i32>("process")?
.call(&store, (input_ptr, input_len))?;
Ok(read_result_from_memory(result))
}
أمثلة من العالم الحقيقي:
| وجه | جافا سكريبت | WebAssembly |
|---|---|---|
| لغة | شبيبة فقط | أكثر من 40 لغة |
| تنفيذ | تفسير + جيت | ثنائي المترجمة |
| أداء | جيد لواجهة المستخدم | قريب من اللغة الأصلية للحساب |
| ** الوصول إلى DOM ** | مباشر | غير مباشر (من خلال JS) |
| ذاكرة | إدارة GC | دليل (الذاكرة الخطية) |
| حجم الملف | أكبر (المصدر + المصغر) | أصغر (ثنائي) |
| ** التصحيح ** | الأدوات الناضجة | المتطورة |
| بدء | تحليل + ترجمة (بارد) | فك التشفير + التجميع (سريع) |
| حماية | رمل المتصفح | صندوق الرمل + سلامة الذاكرة |
متى تستخدم ما:
أفضل الممارسات: استخدم JS لطبقة واجهة المستخدم، وWasm للحسابات المهمة للأداء.
| أداة | غاية | اللغات |
|---|---|---|
| واسم باك | بناء واختبار ونشر حزم Rust Wasm | الصدأ |
| ** إمسكريتن ** | ترجمة C/C++ إلى Wasm | ج، سي++ |
| ** تايني جو ** | انتقل إلى المترجم بدعم Wasm | يذهب |
| واسم بيندجن | التشغيل البيني JS-Wasm عالي المستوى | الصدأ |
| وقت الزمان | وقت تشغيل Wasm المستقل (WASI) | أي وسام |
| واسمر | وقت تشغيل Wasm العالمي | أي وسام |
| وابت | مجموعة أدوات Wasm الثنائية | حَشد |
# Enable DWARF debug info in Wasm
wasm-pack build --debug
# Browser DevTools support
# Chrome: Sources → WebAssembly → .wasm files
# Firefox: Debugger → WebAssembly
لا يستطيع Wasm التعامل مباشرة مع DOM. يجب أن يمر عبر JavaScript:
// Wasm → JS bridge (currently required for DOM)
// Wasm calls JS function → JS modifies DOM → result back to Wasm
المستقبل: ستسمح روابط WebIDL ومقترح GC في النهاية بالوصول المباشر إلى DOM.
حاليًا، لدى Wasm إدارة يدوية للذاكرة. سيضيف مقترح GC (المرحلة 4، المتوقعة 2026-2027) ما يلي:
يتم دعم سلاسل رسائل Wasm في المتصفحات عبر عمليات SharedArrayBuffer وAtomic، ولكنها تتطلب رؤوس HTTP محددة:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
تصحيح أخطاء Wasm أقل نضجًا من JavaScript:
يقوم نموذج المكون بتوحيد كيفية تفاعل وحدات Wasm:
// Component interface definition
(component
(import "host" "console_log" (func (param string)))
(export "process" (func))
)
وهذا يتيح:
إضافة مواصفات WASI الموسعة:
| عرض | حالة | تأثير |
|---|---|---|
| GC (جمع البيانات المهملة) | المرحلة 4 | اللغات المدارة في وسم |
| خيوط | المرحلة الثالثة (المتصفحات) | التوازي الحقيقي |
| معالجة الاستثناء | المرحلة 3 | معالجة الأخطاء الهيكلية |
| تحسين المكالمة الخلفية | المرحلة 2 | العودية فعالة |
| التحكم في الذاكرة | المرحلة 2 | إدارة الذاكرة الدقيقة |
| SIMD ذو العرض الثابت | الشحن بالفعل | المعالجة الموازية |
يقوم WebAssembly بتحويل الويب من عارض المستندات إلى منصة تطبيق حقيقية. الوجبات الرئيسية:
بالنسبة لمعظم مطوري الويب، يمكن أن يبدأ اعتماد Wasm مع اختناقات محددة في الأداء - معالجة الصور، وضغط البيانات، والحسابات المعقدة. مع نضوج الأدوات واستقرار المعايير، سيصبح Wasm جزءًا قياسيًا من مجموعة أدوات تطوير الويب.
لا توجد تعليقات معتمدة بعد. قد تنتظر الردود الجديدة المراجعة.