Emscripten ile C ve C++'ı WebAssembly'ye derleme

Web özellikleri: WebAssembly

C ve C++'ı tarayıcı için yüksek performanslı WebAssembly (Wasm) modüllerine derlemek üzere Emscripten'i kullanın.

1. Modern Emscripten Derleme İşaretleri

emcc veya em++ ile derleme ve bağlama yaparken her zaman modern modüler işaretleri kullanın:

  • -sEXPORT_ES6: Eski global nesneler yerine standart ES6 modül söz dizimini (import/export) kullanır. Bu işlem, -sMODULARIZE ayarını otomatik olarak yapar.
  • -sENVIRONMENT=web: Paket boyutunu en aza indirmek için Node.js/kabuk çalışma zamanı kodunu kaldırır.
  • -sSTRICT: Modern Emscripten varsayılanlarını zorunlu kılar ve desteği sonlandırılmış işaretlerde başarısız olur.
  • -sALLOW_MEMORY_GROWTH: Bellek ayırırken WebAssembly doğrusal bellek yığınının dinamik olarak genişlemesine olanak tanır.
  • -Oz (veya -O3) + -flto: Yayınlanan derlemelerde minimum yük boyutu için optimizasyon yapar.

2. Ana iş parçacığını engellemekten kaçının

WebAssembly'ye yapılan bir çağrının önemli miktarda zaman alması muhtemelse (ör. birkaç milisaniyeden fazla) ana tarayıcı iş parçacığında çağrılmamalıdır.

Bu tür kodların ana tarayıcı iş parçacığında çalıştırılmasını önlemek için birkaç yaklaşım kullanılabilir:

  1. WebAssembly programının tamamını bir Web Worker'da çalıştırın. SharedArrayBuffer erişimini ayarlamayı veya program kaynağını değiştirmeyi gerektirmediği için genellikle en basit çözüm budur.

  2. pthreads veya Wasm Workers kullanın. Bu sayede işler birçok çalışan arasında paylaşılabilir ancak SharedArrayBuffer erişimi gerekir. Bu erişim için COOP/COEP HTTP üstbilgileri eklemek gerekebilir.

  3. Uzun süren çağrıları önlemek için C/C++ kodunu yeniden düzenleyin. Örneğin, işi requestIdleCallback üzerinden çağrılabilecek küçük parçalara ayırabilirsiniz.

3. Çalışma zamanı uyarılarına ve hatalarına dikkat edin.

Oluşturulan WebAssembly programını test ettiğinizden ve konsolda herhangi bir uyarı veya hata oluşturulmadığından emin olun.

Programları -sASSERTIONS etkinleştirilmiş şekilde derleyip çalıştırın ve oluşan çalışma zamanı hatalarını düzeltin.

4. Mümkünse dinamik bağlantı oluşturmaktan kaçının.

Emscripten, statik kitaplıklarla (.a) en iyi şekilde çalışır. Paylaşılan kitaplıklar (.so, .dylib, .dll) tarayıcı dağıtımında daha az kullanışlıdır ve işleri gereksiz yere karmaşıklaştırabilir.

5. Mevcut C/C++ Kitaplıklarını Taşıma

Mevcut C/C++ kitaplıklarını standart derleme sistemleriyle entegre ederken:

CMake Projeleri

CMake komutlarını emcmake ve emmake ile sarmalayın:

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

Autoconf / Make Projeleri

Çapraz derleme araç zinciri hedeflerini ayarlamak için emconfigure kullanın:

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