Emscripten 4.0 er blevet offentliggjort, og det muliggør kompilering af C/C++ kode og andre sprog med LLVM-baserede frontends til en universel lavniveau mellemkode kaldet WebAssembly. Det resulterende output kan bruges til integration med JavaScript-projekter, køre i webbrowseren, anvendes i Node.js eller til at oprette særskilte multiplatform-applikationer, der køres ved hjælp af wasm runtime. Projektkoden distribueres under MIT-licensen. Compilerens funktioner er udviklet ud fra LLVM-projektet, og webassembly-generering samt optimering anvender biblioteket Binaryen.
Hovedmålet med Emscripten er at skabe et værktøj, der muliggør udførelse af kode i weben uafhængigt af det programmeringssprog, hvori koden oprindeligt er skrevet. I de kompilere applikationer kan der anvendes standard C- og C++-biblioteksopkald (libc, libcxx), C++-udvidelser, multitrådede funktionaliteter baseret på pthreads, POSIX API og mange multimediebiblioteker. Derudover leveres API'er til integration med Web API'et og JavaScript-kode.
Emscripten understøtter oversættelse af SDL2-biblioteket output gennem Canvas, og implementerer også support til OpenGL og EGL gennem WebGL API, hvilket muliggør konvertering af grafiske applikationer og spil til WebAssembly (for eksempel er der en port af Qt toolkit, og spillermotorerne Unreal Engine og Unity understøttes, samt fysiksimulatoren Bullet).
Ud over at kompilere C/C++ kode udvikles der også projekter til at køre fortolkere i browsere for virtual machines sprog som Lua, C#, Python, Ruby og Perl. Derudover er det muligt at anvende frontends til LLVM, der adskiller sig fra Clang, for eksempel frontends for sprog som Swift, Rust, D og Fortran.
Version 4.0 er tildelt på grund af ændringer, der bryder ABI-kompatibiliteten (ved omkompilering af et projekt i Emscripten 4.0 vil det være nødvendigt at omkompilere objektfiler og biblioteker, der er samlet med tidligere versioner af Emscripten). De vigtigste ændringer i Emscripten 4.0:
- Muligheden „-sWASM_LEAGCY_EXCEPTIONS“ er tilføjet for at vælge mellem gamle og nye undtagelseshåndteringsmekanismer. Som standard anvendes den gamle mekanisme, da ikke alle browsere har implementeret WebAssembly's evner til at arbejde med de nye undtagelseshåndteringsfunktioner.
- Komponenterne compiler-rt, libcxx, libcxxabi og libunwind er opdateret til LLVM 19-grenen.
- Den minimale understøttede version af Safari-browseren i builds (indstilling MIN_SAFARI_VERSION) er blevet hævet fra 14.1 til 15.0, hvilket gør det muligt at aktivere flere avancerede funktioner i WebAssembly som standard.
- Brugen af nye instruktioner til konvertering fra float til int (nontrapping-fptoint) er inkluderet, som i stedet for at generere en undtagelse ved overflow af resultatet returnerer det minimale eller maksimale mulige værdi (nødvendigt for SIMD).
- Muligheden WASM_BIGINT er aktiveret, hvormed der anvendes typen BigInt til udveksling af 64-bit heltal mellem WebAssembly og JavaScript-kode.
- Muligheden BULK_MEMORY er aktiveret, hvormed der anvendes WebAssembly-instruktioner memory.copy og memory.fill til implementeringen af C-funktionerne memcpy og memset.
- I funktionen PATH.basename() er normalisering af stier (PATH.normalize()) deaktiveret, dvs. kaldet ‘PATH.basename(«a/.»)’ vil nu returnere «.» i stedet for «a», mens ‘PATH.basename(«a/b/..»)’ vil returnere «..» i stedet for «a».
- Ved brug af indstillingen ‘-sMODULARIZE’ er fabriksfunktioner, der opretter og returnerer forekomster af WebAssembly-moduler og objekter til JavaScript, nu markeret med mærket ‘async’ ved kompilering i tilstanden WASM_ASYNC_COMPILATION, der anvendes som standard.
- Muligheden for at angive JavaScript-biblioteker er tilføjet ved hjælp af indstillingen ‘-lfoo.js’. I modsætning til indstillingen ‘—js-library’ udføres søgningen af biblioteket i alle stier, der er angivet via indstillingen ‘-L’.
- Ved linking i debug-tilstand (-O0 eller -sASSERTIONS) er den debug-version af funktionen malloc, der inkluderer assert-checks til at identificere fejl som dobbelt kald til funktionen free(), aktiveret som standard.
Kilde: opennet.ru
