WebAssembly وGo: لماذا يحتاج مطور الويب الحديث إلى هذا؟
\n\nهل حلمت يومًا بتشغيل كود عالي الأداء بلغة Go مباشرة في المتصفح؟ أو ربما أردت إعادة استخدام مكتبة Go موجودة في واجهة ويب دون إعادة كتابتها بلغة JavaScript؟ إذا كان الأمر كذلك، فأنت في المكان الصحيح. WebAssembly (Wasm) مع Go ليس مجرد موضة عابرة، بل أداة حقيقية لبناء تطبيقات تعمل على حافة إمكانيات المتصفح.
\n\nفي هذه المقالة، سنشرح ما هو WebAssembly، ولماذا تعتبر Go مثالية لتوليد وحدات Wasm، والأهم من ذلك، سنكتب كودًا حقيقيًا. لن ننسخ أدلة مملة. سنبني أداة مفيدة: محلل بيانات سريع على جانب العميل يعمل أسرع بعشر مرات من JavaScript الخالص. هيا بنا!
\n\nما هو WebAssembly بلغة بسيطة؟
\n\nتخيل أن JavaScript هي سيارة ذات ناقل حركة أوتوماتيكي. إنها مريحة ويمكن التنبؤ بها، لكنها ليست سريعة دائمًا. WebAssembly هي سيارة سباق. إنها تنسيق ثنائي للتعليمات يتم تنفيذه بسرعة شبه أصلية. المتصفحات (Chrome, Firefox, Safari, Edge) قادرة على تشغيل كود Wasm في صندوق حماية معزول، مما يمنحه وصولًا مباشرًا إلى الذاكرة والمعالج.
\n\nالميزات الرئيسية لـ WebAssembly:
\n- \n
- السرعة: يتم تنفيذه بسرعة قريبة من الكود الأصلي (C/C++, Rust, Go). \n
- الأمان: صندوق الحماية يمنع الوصول المباشر إلى النظام (مثل JavaScript). \n
- قابلية النقل: يعمل في أي مكان يوجد به متصفح حديث. \n
- الحجم: ملف ثنائي مضغوط (.wasm). \n
وهنا يأتي دور Go. على عكس C أو Rust، تمتلك Go مترجمًا مدمجًا إلى WebAssembly (GOOS=js GOARCH=wasm). هذا يعني أنه يمكنك أخذ أي حزمة Go، وترجمتها إلى .wasm وتشغيلها في المتصفح. يبدو وكأنه سحر، أليس كذلك؟
\n\nلماذا Go تحديدًا لـ WebAssembly؟
\n\nقد يكون لديك سؤال معقول: "لماذا نستخدم Go إذا كان هناك Rust أو AssemblyScript؟" الإجابة تكمن في فلسفة Go:
\n- \n
- البساطة: تشتهر Go بقواعدها النحوية البسيطة. تكتب كودًا يسهل قراءته وصيانته. \n
- الغوروتينات: تعمل الغوروتينات في WebAssembly! يمكنك تشغيل عمليات حسابية متزامنة دون حظر الخيط الرئيسي. \n
- النظام البيئي: يمكن إعادة استخدام عدد كبير من المكتبات (محللات، تشفير، معالجة بيانات) دون تغيير. \n
- عتبة دخول منخفضة: إذا كنت تعرف Go، فلن تحتاج لتعلم لغة جديدة للعمل مع Wasm. \n
العيب الوحيد هو حجم الملف الثنائي. يضيف وقت تشغيل Go وزنًا (عادة 2-5 ميجابايت). لكن بالنسبة للتطبيقات الجادة (محررات الصور، المحاكيات، الألعاب) فهذا ليس حرجًا.
\n\nتطبيق عملي: تحليل البيانات بلغة Go وتشغيلها في المتصفح
\n\nلنقم ببناء تطبيق يستقبل سلسلة نصية تحتوي على أرقام (مثل "12, 34, 56, 78") ويخرج المجموع والمتوسط الحسابي. هذه مهمة نموذجية لعمليات ETL أو معالجة السجلات. يمكن القيام بذلك بلغة JavaScript، لكن بلغة Go سيكون أسرع.
\n\nالخطوة 1: كتابة دالة Go للتصدير إلى JS
\n\nأنشئ ملفًا باسم main.go. القاعدة الأساسية: لا يمكننا استخدام fmt.Println مباشرة في المتصفح. بدلاً من ذلك، سنقوم بإرجاع النتائج عبر الكائن العام global (في Go هو syscall/js).
package main\n\nimport (\n "strconv"\n "strings"\n "syscall/js"\n)\n\n// calculate — الدالة التي سيتم استدعاؤها من JavaScript\nfunc calculate(this js.Value, args []js.Value) interface{} {\n if len(args) == 0 {\n return map[string]interface{}{\n "error": "لم يتم تمرير وسيط",\n }\n }\n\n input := args[0].String()\n parts := strings.Split(input, ",")\n \n var sum float64\n cou