Compiling C and C++ to WebAssembly with Emscripten

ویژگی‌های وب: WebAssembly

از Emscripten برای کامپایل کردن C و C++‎ به پیمانه‌های WebAssembly (Wasm) با عملکرد بالا برای مرورگر استفاده کنید.

۱. پرچم‌های تلفیق Emscripten مدرن

هنگام کامپایل و پیوند دادن با emcc یا em++، همیشه از پرچم‌های مدولار مدرن استفاده کنید:

  • -sEXPORT_ES6: به‌جای اشیای سراسری قدیمی، نحو استاندارد ماژول ES6 (import/export) را منتشر می‌کند. این کار به‌طور خودکار -sMODULARIZE را تنظیم می‌کند.
  • -sENVIRONMENT=web: کد زمان اجرای Node.js/shell را برای به‌حداقل رساندن اندازه بسته حذف می‌کند.
  • -sSTRICT: پیش‌فرض‌های مدرن Emscripten را اعمال می‌کند و درصورت وجود پرچم‌های منسوخ‌شده ناموفق می‌شود.
  • -sALLOW_MEMORY_GROWTH: به توده حافظه خطی WebAssembly اجازه می‌دهد هنگام اختصاص دادن حافظه، به‌طور پویا گسترش یابد.
  • ‫-Oz (یا -O3) + -flto: برای حداقل اندازه بار مفید در ساخت‌های نسخه پخش بهینه‌سازی می‌کند.

۲. اجتناب از مسدود کردن رشته اصلی

اگر احتمالاً فراخوانی WebAssembly زمان قابل‌توجهی (یعنی بیشتر از چند میلی‌ثانیه) طول می‌کشد، نباید در رشته اصلی مرورگر فراخوانی شود.

برای جلوگیری از اجرای چنین کدی در رشته اصلی مرورگر، چندین رویکرد ممکن وجود دارد:

  1. کل برنامه WebAssembly را در Web Worker اجرا کنید. این اغلب ساده‌ترین راه‌حل است زیرا شامل راه‌اندازی دسترسی SharedArrayBuffer یا تغییر منبع برنامه نمی‌شود.

  2. از pthreads یا Wasm Workers استفاده کنید. این کار اجازه می‌دهد کار بین کارگران زیادی هم‌رسانی شود اما به دسترسی SharedArrayBuffer نیاز دارد که می‌تواند شامل افزودن سرایندهای COOP/COEP HTTP باشد.

  3. کد C/C++‎ را بازسازی کنید تا از تماس‌های طولانی‌مدت جلوگیری شود. برای مثال، تقسیم کردن کار به بخش‌های کوچک که بتوان آن‌ها را از requestIdleCallback فراخوانی کرد.

۳. به هشدارها و خطاهای زمان اجرا توجه کنید

حتماً برنامه WebAssembly حاصل را آزمایش کنید و مطمئن شوید که هیچ هشدار یا خطایی در کنسول ایجاد نمی‌شود.

برنامه‌ها را با فعال کردن -sASSERTIONS بسازید و اجرا کنید و هرگونه خرابی زمان اجرا را که ایجاد می‌شود برطرف کنید.

۴. درصورت امکان، از پیونددهی پویا اجتناب کنید

Emscripten با کتابخانه‌های ایستا (.a) بهترین عملکرد را دارد. کتابخانه‌های مشترک (.so، .dylib، .dll) در استقرار مرورگر کمتر مفید هستند و می‌توانند مسائل را بی‌دلیل پیچیده کنند.

۵. انتقال کتابخانه‌های 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