WebAssembly وTypeScript: عندما يعجز JavaScript
\n\nهل شعرت يومًا أن موقعك يتباطأ، رغم أنك كتبت كل شيء بلغة TypeScript الحديثة؟ معالجة الفيديو، العرض ثلاثي الأبعاد، الحسابات الرياضية المعقدة — يبدأ JavaScript في المتصفح بالاختناق. هنا يظهر WebAssembly (أو Wasm ببساطة) — تقنية تسمح بتشغيل كود مكتوب بلغة C++ أو Rust أو Go في المتصفح بسرعة شبه أصلية. ولكن كيف يرتبط هذا بـ TypeScript؟ مفاجأة: ليس بشكل مباشر، لكنهما معًا يشكلان ثنائيًا قويًا.
\n\nفي هذه المقالة، لن نقدم تعريفات جافة فقط. بل سنوضح كيف يمكن لـ TypeScript وWebAssembly العمل كفريق، حيث يكون كل منهما مسؤولًا عن مجاله: TypeScript للراحة والكتابة الصارمة، وWasm للأداء. ستتعلم كيفية كتابة وحدة Wasm بسيطة واستدعائها من TypeScript، والأهم من ذلك — ستفهم ما إذا كان الأمر يستحق العناء.
\n\nما هو WebAssembly بكلمات بسيطة
\n\nWebAssembly هو تنسيق ثنائي للتعليمات يتم تنفيذه في آلة افتراضية داخل المتصفح. إذا كان JavaScript لغة مفسرة تُحلل وتُنفذ "أثناء التشغيل"، فإن Wasm هو كود بايت مُجمّع مسبقًا. يتم تحميله بشكل أسرع، ويُنفذ تقريبًا مثل الكود الأصلي، ولا يجعل المتصفح "يتوقف للتفكير".
\n\nالميزات الرئيسية لـ WebAssembly:
\n- \n
- السرعة — أسرع من JavaScript بمقدار 10-20 مرة في المهام الحسابية. \n
- الأمان — يعمل في بيئة معزولة (sandbox)، ولا يملك وصولًا مباشرًا إلى DOM. \n
- قابلية النقل — نفس ملف .wasm يعمل في Chrome وFirefox وSafari وEdge. \n
- ليس بديلاً عن JS — بل مكمل. DOM، الأحداث، غير المتزامنة تبقى من مسؤولية JavaScript/TypeScript. \n
Wasm ليس مصممًا لكتابة منطق الواجهة. مجاله هو الحسابات الثقيلة: التشفير، معالجة الصور، المحاكاة الفيزيائية، الألعاب.
\n\nأين دور TypeScript هنا؟
\n\nTypeScript نفسه لا يُترجم إلى WebAssembly (على الرغم من وجود مشاريع تجريبية، لكنها ليست للإنتاج). ومع ذلك، يصبح TypeScript "الغراء" المثالي بين وحدات Wasm وواجهة المستخدم. تخيل: لديك خوارزمية سريعة بلغة C++، مُجمّعة إلى Wasm. تكتب غلافًا أنيقًا بـ TypeScript مع أنواع، ويبدأ محرر IDE في اقتراح المعاملات التي تتوقعها الدالة والأنواع التي تُرجعها. لا سحر — فقط صرامة الأنواع والإكمال التلقائي.
\n\nإليك البنية النموذجية:
\n- \n
- وحدة Wasm — صندوق أسود يقوم بالعمل المعقد. \n
- كود TypeScript — يقوم بتحميل الوحدة، واستدعاء دوالها، وتحديث واجهة المستخدم. \n
- المتصفح — سعيد لأن العمل الثقيل لا يمنع الخيط الرئيسي. \n
مثال عملي: توليد الأعداد الأولية باستخدام WebAssembly وTypeScript
\n\nلننشئ مشروعًا حقيقيًا. سنأخذ خوارزمية البحث عن الأعداد الأولية (غربال إراتوستينس) بلغة C++، ونُجمّعها إلى Wasm، ثم نستدعيها من TypeScript. لا تخف من C++ — الكود سيكون بسيطًا، وسنستخدم Emscripten للتجميع.
\n\nالخطوة 1. الكود المصدري بلغة C++
\nلننشئ ملف primes.cpp:
#include <emscripten.h>\n\nextern "C" {\n EMSCRIPTEN_KEEPALIVE\n int count_primes(int limit) {\n if (limit < 2) return 0;\n bool* sieve = new bool[limit + 1];\n for (int i = 0; i <= limit; i++) sieve[i] = true;\n sieve[0] = sieve[1] = false;\n for (int i = 2; i * i <= limit; i++) {\n if (sieve[i]) {\n for (int j = i * i; j <= limit; j += i) {\n sieve[j] = false;\n }\n }\n }\n int count = 0;\n for (int i = 0; i <= limit; i++) {\n if (sieve[i]) count++;\n }\n delete[] sieve;\n return count;\n }\n}\nEMSCRIPTEN_KEEPALIVE
المدونات
توصيات الكتب
اقرأ أيضًا