Mengompilasi C dan C++ ke WebAssembly dengan Emscripten

Fitur web: WebAssembly

Gunakan Emscripten untuk mengompilasi C dan C++ menjadi modul WebAssembly (Wasm) berperforma tinggi untuk browser.

1. Flag Kompilasi Emscripten Modern

Saat mengompilasi dan menautkan dengan emcc atau em++, selalu gunakan flag modular modern:

  • -sEXPORT_ES6: Memunculkan sintaksis modul ES6 standar (import/export), bukan objek global lama. Tindakan ini akan otomatis menetapkan -sMODULARIZE.
  • -sENVIRONMENT=web: Menghapus kode runtime Node.js/shell untuk meminimalkan ukuran paket.
  • -sSTRICT: Menerapkan default Emscripten modern dan gagal pada flag yang tidak digunakan lagi.
  • -sALLOW_MEMORY_GROWTH: Memungkinkan heap memori linear WebAssembly diperluas secara dinamis saat mengalokasikan memori.
  • -Oz (atau -O3) + -flto: Mengoptimalkan ukuran payload minimal dalam build rilis.

2. Menghindari pemblokiran thread utama

Jika panggilan ke WebAssembly kemungkinan akan memerlukan waktu yang signifikan (yaitu lebih dari beberapa milidetik), panggilan tersebut tidak boleh dipanggil di thread browser utama.

Untuk menghindari menjalankan kode tersebut di thread browser utama, ada beberapa kemungkinan pendekatan:

  1. Jalankan seluruh program WebAssembly di Web Worker. Ini sering kali merupakan solusi paling sederhana karena tidak melibatkan penyiapan akses SharedArrayBuffer, atau mengubah sumber program.

  2. Gunakan pthreads atau Wasm Workers. Hal ini memungkinkan pekerjaan dibagikan ke banyak worker, tetapi memerlukan akses SharedArrayBuffer yang dapat melibatkan penambahan header HTTP COOP/COEP.

  3. Lakukan refaktorisasi kode C/C++ untuk menghindari panggilan yang berjalan lama. Misalnya, membagi pekerjaan menjadi bagian-bagian kecil yang dapat dipanggil dari requestIdleCallback.

3. Perhatikan peringatan dan error runtime

Pastikan Anda benar-benar menguji program WebAssembly yang dihasilkan dan tidak ada peringatan atau error yang dihasilkan di konsol.

Bangun dan jalankan program dengan -sASSERTIONS diaktifkan dan perbaiki kegagalan runtime yang dihasilkan.

4. Hindari penautan dinamis jika memungkinkan

Emscripten berfungsi paling baik dengan library statis (.a). Pustaka bersama (.so, .dylib, .dll) kurang berguna dalam deployment browser dan dapat mempersulit hal-hal yang tidak perlu.

5. Mem-porting Library C/C++ yang Ada

Saat mengintegrasikan library C/C++ yang ada dengan sistem build standar:

Project CMake

Gabungkan perintah CMake dengan emcmake dan emmake:

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

Project Autoconf/Make

Gunakan emconfigure untuk menetapkan target toolchain kompilasi silang:

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