تجميع C وC++‎ إلى WebAssembly باستخدام Emscripten

ميزات الويب: WebAssembly

يمكنك استخدام Emscripten لتجميع C وC++‎ في وحدات WebAssembly (Wasm) عالية الأداء للمتصفّح.

1. علامات تجميع Emscripten الحديثة

عند التجميع والربط باستخدام emcc أو em++، استخدِم دائمًا علامات الوحدات الحديثة:

  • ‫-sEXPORT_ES6: تُصدر هذه السمة بنية وحدة ES6 العادية (import/export) بدلاً من العناصر العامة القديمة. يؤدي ذلك إلى ضبط -sMODULARIZE تلقائيًا.
  • ‫-sENVIRONMENT=web: تزيل هذه السمة رمز وقت تشغيل Node.js/shell لتقليل حجم الحزمة.
  • -sSTRICT: تفرض هذه السمة الإعدادات التلقائية الحديثة لـ Emscripten وتتعذّر على العلامات المتوقفة نهائيًا.
  • -sALLOW_MEMORY_GROWTH: يسمح هذا الإعداد بتوسيع الذاكرة المتعدّدة الخطية في WebAssembly بشكل ديناميكي عند تخصيص الذاكرة.
  • ‫-Oz (أو -O3) + -flto: لتحسين الحد الأدنى لحجم الحمولة في بنية الإصدار.

2. تجنُّب حظر سلسلة التعليمات الرئيسية

إذا كان من المرجّح أن يستغرق استدعاء WebAssembly وقتًا طويلاً (أي أكثر من بضعة أجزاء من الثانية)، يجب عدم استدعاؤه في سلسلة التعليمات الرئيسية للمتصفّح.

لتجنُّب تشغيل هذا الرمز على سلسلة التعليمات الرئيسية للمتصفّح، هناك عدة طرق ممكنة:

  1. تشغيل برنامج WebAssembly بالكامل في Web Worker غالبًا ما يكون هذا هو الحل الأبسط لأنّه لا يتطلّب إعداد إمكانية الوصول إلى SharedArrayBuffer أو تغيير مصدر البرنامج.

  2. استخدِم pthreads أو Wasm Workers. يتيح ذلك مشاركة العمل بين العديد من المنفّذين، ولكنّه يتطلّب الوصول إلى SharedArrayBuffer، ما قد يتطلّب إضافة عناوين HTTP لـ COOP/COEP.

  3. أعِد صياغة رمز C/C++‎ لتجنُّب المكالمات الطويلة. على سبيل المثال، تقسيم العمل إلى أجزاء صغيرة يمكن استدعاؤها من requestIdleCallback.

3- انتبه إلى التحذيرات والأخطاء في وقت التشغيل

تأكَّد من اختبار برنامج WebAssembly الناتج فعليًا وعدم ظهور أي تحذيرات أو أخطاء في وحدة التحكّم.

أنشِئ البرامج وشغِّلها مع تفعيل -sASSERTIONS وأصلِح أي أخطاء تحدث أثناء التشغيل.

4. تجنُّب الربط الديناميكي قدر الإمكان

يعمل Emscripten بشكل أفضل مع المكتبات الثابتة (.a). المكتبات المشتركة (.so، .dylib، .dll) أقل فائدة في نشر المتصفح ويمكن أن تعقد الأمور دون داع.

5- نقل مكتبات C/C++‎ الحالية

عند دمج مكتبات C/C++‎ الحالية مع أنظمة الإنشاء العادية:

مشاريع CMake

أضِف أوامر CMake بين emcmake وemmake:

mkdir build && cd build
emcmake cmake .. -DCMAKE_BUILD_TYPE=Release
emmake make

مشاريع Autoconf / Make

استخدِم emconfigure لضبط أهداف سلسلة أدوات التجميع المتبادل:

emconfigure ./configure --host=wasm32-unknown-emscripten --disable-shared
emmake make