مقدمة: عندما لا يكفي JavaScript
\n\nاعتاد الجميع على أن الإنترنت بأكمله يعتمد على JavaScript. إنه مرن، ويتسامح مع الأخطاء، ويعمل في كل مكان. ولكن هناك مهام تبدأ فيها حتى أكواد JS المحسّنة بالتباطؤ: معالجة الفيديو، العرض ثلاثي الأبعاد، الخوارزميات المعقدة، والألعاب. وهنا يظهر WebAssembly و Rust كثنائي يمنح تطبيقات الويب سرعة الكود الأصلي.
\n\nفي هذه المقالة، سنشرح ما هو WebAssembly، ولماذا يعتبر Rust مع Wasm أحد أفضل الخيارات، وكيفية كتابة أول وحدة Rust تعمل في المتصفح. المقالة مفيدة لكل من المبتدئين وأولئك الذين سمعوا عن Wasm Rust ولكنهم لا يعرفون من أين يبدأون.
\n\nما هو WebAssembly (Wasm)؟
\n\nWebAssembly هو تنسيق تعليمات ثنائي يُنفَّذ في المتصفح بسرعة تقترب من السرعة الأصلية. ببساطة، هو "معالج افتراضي" منخفض المستوى للويب. يقوم المتصفح بتحميل ملف .wasm مضغوط وتنفيذه مباشرة، متجاوزًا مترجم JavaScript.
\n\nالميزات الرئيسية لـ Wasm:
\n- \n
- أداء عالٍ — يتم تنفيذ الكود بسرعة تقريبًا مثل C++ أو Rust المُجمَّعة. \n
- الأمان — يعمل Wasm في بيئة معزولة (sandbox) مثل JS. \n
- الحجم الصغير — ملفات .wasm عادةً ما تكون أصغر بعدة مرات من كود JS المماثل. \n
- قابلية النقل — تعمل نفس الوحدة في جميع المتصفحات الحديثة. \n
لكن Wasm ليس بديلاً عن JavaScript. إنها أداة للمهام التي يكون فيها JS ضعيفًا. تكتب الكود الحرج من حيث السرعة بلغة Rust، وتجمعه إلى Wasm، بينما يعمل JS كلاصق يستدعي هذه الوحدة.
\n\nلماذا Rust بالتحديد لـ WebAssembly؟
\n\nاختيار لغة التجميع إلى Wasm ليس حاسمًا. يمكنك استخدام C أو C++ أو Go أو حتى Python (عبر Pyodide). لكن Rust لـ WebAssembly أصبح المعيار الفعلي. لماذا؟
\n\n1. أمان الذاكرة بدون جامع القمامة
\nRust هي لغة الأنظمة الوحيدة الشائعة التي تضمن أمان الذاكرة في مرحلة التجميع. على عكس C/C++، لن تحصل على segfault في وقت التشغيل. وغياب جامع القمامة (GC) يعني عدم وجود "تجميد" مفاجئ — مثالي لتطبيقات الوقت الفعلي.
\n\n2. تكلفة صفرية للتجريدات
\nتكتب كودًا عالي المستوى مع التكرارات والإغلاقات والسمات (traits)، لكن مترجم Rust يحوله إلى كود آلي لا يقل عن كود الأسمبلي المكتوب يدويًا. وهذا يعطي أداء C++ مع سهولة اللغات الحديثة.
\n\n3. بيئة wasm-pack و wasm-bindgen
\nأدوات تجميع Rust إلى Wasm أصبحت ناضجة جدًا. wasm-pack يبني المشروع، ويولد أغلفة JS، بل وينشر الحزمة في npm. wasm-bindgen يسمح بتمرير السلاسل والمصفوفات والكائنات بسهولة بين Rust و JavaScript.
4. حجم ملف الإخراج الصغير
\nيتم تجميع Rust إلى Wasm بدون بيئة تشغيل (runtime). تحصل على ملف ثنائي صغير جدًا. حتى مع المكتبة القياسية (عبر wasm-pack)، نادرًا ما يتجاوز الحجم 50-100 كيلوبايت للمهام الحقيقية.
كيف يعمل هذا: كتابة أول وحدة Rust لـ Wasm
\n\nلنقم بإنشاء وحدة بسيطة تقوم بتحويل الدرجات المئوية إلى فهرنهايت والعكس. سيظهر لك هذا السلسلة الكاملة: كود Rust → Wasm → استدعاء من JavaScript.
\n\nالخطوة 1: تثبيت الأدوات
\nستحتاج إلى Rust (قم بتثبيته عبر rustup) و wasm-pack:
curl https://sh.rustup.rs -sSf | sh\n# تثبيت wasm-pack\ncargo install wasm-pack\n\nالخطوة 2: إنشاء المشروع
\ncargo new --lib temp-converter\ncd temp-converter\n\nافتح Cargo.toml وأضف:
[lib]\ncrate-type = ["cdylib"]\n\n[dependencies]\nwasm-bindgen = "0.2"\n\n