مِخبارMIKHBAR
التطبيقات والبرامج

Cloudflare تتيح دعم Emscripten لتطبيق Rust على Workers

تفتح Cloudflare الباب أمام مطوري Rust لبناء تطبيقات أصلية متقدمة على Workers عبر دعم Emscripten، مما يوسع نطاق التوافق مع مكتبات النظام وحلول الشبكات.

Cloudflare تتيح دعم Emscripten لتطبيق Rust على Workers

إطلاق الدعم التجريبي لاستهداف Emscripten

أعلنت شركة Cloudflare اليوم عن إطلاق أول معاينة تجريبية عامة لميزة جديدة تهدف إلى تحسين دعم كود Rust الأصلي على منصتها، بما في ذلك التطبيقات المعتمدة على إطار عمل Tokio. تمثل هذه الخطوة إضافة دعم من الدرجة الأولى لاستهداف مترجم Rust الخاص بـ Emscripten (wasm32-unknown-emscripten) ضمن سلسلة أدوات wasm-bindgen مفتوحة المصدر.

يعمل wasm-bindgen كسلسلة أدوات أساسية لتشغيل تطبيقات WebAssembly المبنية على Rust على بيئة تشغيل Workers التي تعتمد على محرك V8 لدى Cloudflare. كان تفعيل هدف Emscripten ضمن هذه السلسلة جهداً طويل الأمد بدأته Google قبل أكثر من عام، ثم تابعه مهندسو Cloudflare المسؤولون عن صيانة wasm-bindgen لمراجعته ودعمه فنياً.

تعزيز التوافق مع المكتبات الأصلية

على الرغم من أن الميزة لا تزال في مرحلة ما قبل الإصدار النهائي، إلا أن الاختبارات الأولية أظهرت تحسناً كبيراً في توافق المكتبات مع Rust Workers. تتيح هذه التحديثات بناء ونشر العديد من المكتبات والتطبيقات التي كانت غير مدعومة سابقاً مباشرة على المنصة العالمية لـ Cloudflare، مع دعم قادم لإطار عمل Tokio غير المتزامن.

تُعد Emscripten سلسلة أدوات مترجم WebAssembly مفتوحة المصدر، أنشأتها Mozilla في البداية وتديرها حالياً مهندسون من Google. تتيح هذه الأداة تشغيل الكود الأصلي وربطه بمنصة الويب، مع دعم وتقليد الميزات المنصة مثل المؤقتات، عمليات نظام الملفات، والجوارب (Sockets).

Cloudflare تتيح دعم Emscripten لتطبيق Rust على Workers
صورة مرتبطة بالخبر من Cloudflare Blog · المصدر: Cloudflare Blog

الاستفادة من توافق Node.js

بما أن Cloudflare Workers يدعم واجهات برمجة تطبيقات منصة الويب وميزات توافق Node.js، فقد تمكّن الفريق من دعم Emscripten على Workers باستخدام أعلام التجميع الخاصة بـ Node.js. هذا النهج يتيح التقليد الكامل للميزات المنصة الأصلية، مثل المؤقتات وعمليات نظام الملفات والجوارب، فوق واجهات Node.js الموجودة مسبقاً في المنصة.

بالإضافة إلى ذلك، يتيح العمل الجاري على دعم Tokio دمج الكود المصنوع فوق بيئة تشغيل Tokio غير المتزامنة بشكل كامل في بيئات الاستضافة القائمة على JavaScript. هذا التكامل يفتح آفاقاً جديدة للتطبيقات المعقدة التي تتطلب إدارة متقدمة للمهام غير المتزامنة.

تعاون تقني بين Google وCloudflare

بدأت الحاجة إلى هذا التكامل عندما واجه Mitch Foley من فريق Google للأدوات القابلة للنقل (Portable Toolchains) تحدياً في تفاعل أدوات Rust WebAssembly مع لغة C++. كان الهدف هو استخدام wasm-bindgen لتوليد JavaScript المرافق، بينما يتولى رابط Emscripten (wasm-ld) ربط أي تبعيات C++ اللازمة.

واجه الفريق تعارضاً بين الأداةين، حيث افترض كل منهما مسؤوليته عن تحميل JavaScript وتوليد المخرجات النهائية. لحل هذه المشكلة، صاغ Foley وزميله Yifan Yang خطة تعاونية: تستمر Emscripten في قيادة البناء وتحميل وحدة Wasm وتوفير JavaScript المرافق، بينما ينتج wasm-bindgen نسخة أصغر وقابلة للنقل من روابط JavaScript الخاصة به، يمكن تضمينها مباشرة في نظام مكتبات Emscripten.

Cloudflare تتيح دعم Emscripten لتطبيق Rust على Workers
صورة مرتبطة بالخبر من Cloudflare Blog · المصدر: Cloudflare Blog

إمكانات التشغيل على Workers

بعد دمج دعم هدف wasm32-unknown-emscripten في wasm-bindgen، أظهرت النماذج الأولية المبكرة من مهندسي Cloudflare نجاحاً واضحاً في دعم هذا الهدف على Workers. عملت العديد من المكتبات فوراً دون تعديلات، بما في ذلك مكتبات النظام منخفضة المستوى، نظراً لدعم Emscripten المسبق لخاصية target_family = unix في Rust.

تطلبت بعض مكتبات النظام منخفضة المستوى التي لم تكن على دراية بـ Emscripten تعديلات بسيطة، مثل libc وsocket2 وMio. تركزت هذه التعديلات بشكل أساسي على إضافة هدف Emscripten إلى بوابات المنصة الحالية للسماح صراحةً بـ target_os = "emscripten" بدلاً من بوابات Wasm العامة.

Cloudflare تتيح دعم Emscripten لتطبيق Rust على Workers
صورة مرتبطة بالخبر من Cloudflare Blog · المصدر: Cloudflare Blog

تحدي دمج إطار عمل Tokio

كان أحد التحديات الأساسية هو دعم مكتبة Tokio، حيث أن Workers تعمل في خيط واحد وتستضيف داخل حلقة أحداث JavaScript، بينما صُمم Tokio حول عمليات الحجب المدعومة عبر دلالات إيقاف الخيوط (threaded parking). لا تتوافق هاتان النمودجان معاً، إذ لا يمكن لعمليات الحجب مثل قراءة جوارب معلقة أن تحجب حلقة أحداث JavaScript المشتركة.

لتجاوز هذه العقبة، ساهم فريق Cloudflare في حزم تعديلات كاملة لدعم Tokio قيد المراجعة حالياً في المشروع الأصلي (upstream)، مع دمج أول تعديل لدعم الهدف في Tokio. تتيح هذه التعديلات دعم كلا النهجين: دمج وعود JavaScript مع WebAssembly (JSPI) الذي يطابق دلالات الإيقاف في Tokio، أو تعديل Tokio لدعم تكامل حلقة الأحداث.

تجربة عملية: خادم Minecraft

لإظهار القدرات المدعومة، نجح الفريق في تشغيل خادم Minecraft أصلي بلغة Rust (يُعرف باسم Pumpkin) داخل كائن دائم (Durable Object) مع استقبال TCP، باستخدام جوارب TCP حقيقية عبر Tokio. توفر هذه التجربة أمثلة تطبيقية يمكن للمستخدمين تجربتها اليوم، بما في ذلك جوارب TCP على Workers باستخدام Emscripten وTokio.

يمكن للمطورين الاطلاع على توثيق Emscripten الخاص بـ wasm-bindgen لمزيد من المعلومات حول استخدام هذا الهدف، بما في ذلك إعدادات -sWASM_BINDGEN التي تضمن التوافق السلس بين سلسلة أدوات Emscripten وروابط wasm-bindgen.

المصادر

  • Cloudflare BlogSupporting native Rust in Workers with the new Emscripten target for wasm-bindgen

تابع التسلسل الزمني

تغطية الكيانات المرتبطة