Emscripten की मदद से, C और C++ को WebAssembly में कंपाइल करना

वेब की सुविधाएं: WebAssembly

Emscripten का इस्तेमाल करके, C और C++ को ब्राउज़र के लिए, बेहतर परफ़ॉर्मेंस वाले WebAssembly (Wasm) मॉड्यूल में कंपाइल करें.

1. मॉडर्न Emscripten कंपाइलेशन फ़्लैग

emcc या em++ के साथ कंपाइल और लिंक करते समय, हमेशा मॉडर्न मॉड्यूलर फ़्लैग का इस्तेमाल करें:

  • -sEXPORT_ES6: यह लेगसी ग्लोबल ऑब्जेक्ट के बजाय, स्टैंडर्ड ES6 मॉड्यूल सिंटैक्स (import/export) जनरेट करता है. इससे -sMODULARIZE अपने-आप सेट हो जाता है.
  • -sENVIRONMENT=web: बंडल का साइज़ कम करने के लिए, Node.js/शेल रनटाइम कोड को हटाता है.
  • -sSTRICT: यह आधुनिक Emscripten डिफ़ॉल्ट लागू करता है और अब काम न करने वाले फ़्लैग पर काम नहीं करता.
  • -sALLOW_MEMORY_GROWTH: इससे, मेमोरी असाइन करते समय WebAssembly लीनियर मेमोरी हीप को डाइनैमिक तौर पर बड़ा किया जा सकता है.
  • -Oz (या -O3) + -flto: रिलीज़ के लिए तैयार बिल्ड में, पेलोड के साइज़ को कम से कम करने के लिए ऑप्टिमाइज़ करता है.

2. मुख्य थ्रेड को ब्लॉक करने से बचें

अगर WebAssembly को कॉल करने में ज़्यादा समय (यानी कुछ मिलीसेकंड से ज़्यादा) लगने की संभावना है, तो इसे मुख्य ब्राउज़र थ्रेड पर कॉल नहीं किया जाना चाहिए.

मुख्य ब्राउज़र थ्रेड पर इस तरह के कोड को चलाने से बचने के लिए, कई तरीके अपनाए जा सकते हैं:

  1. पूरे WebAssembly प्रोग्राम को वेब वर्कर में चलाएं. यह अक्सर सबसे आसान तरीका होता है, क्योंकि इसमें SharedArrayBuffer ऐक्सेस सेट अप करने या प्रोग्राम सोर्स को बदलने की ज़रूरत नहीं होती.

  2. pthreads या Wasm Workers का इस्तेमाल करें. इससे, काम को कई वर्कर के साथ शेयर किया जा सकता है. हालांकि, इसके लिए SharedArrayBuffer का ऐक्सेस ज़रूरी है. इसमें 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