Megjelent az Emscripten 4.0 eszközkészlete, amely lehetővé teszi C/C++ és más nyelveken írt kódok fordítását az LLVM alapú frontendek segítségével egy általános alacsony szintű WebAssembly közbenső kódra. Az így kapott eredmény integrálható JavaScript projektekbe, futtatható webböngészőben, Node.js környezetben, vagy önálló, multiplatform alkalmazások létrehozására is használható, amelyeket wasm runtime segít futtatni. A projekt kódja MIT licenc alatt érhető el. A fordító az LLVM projekt fejlesztéseit használja, a WebAssembly generálásához és optimalizálásához pedig a Binaryen könyvtárat alkalmazza.
Az Emscripten fő célja egy olyan eszköz létrehozása, amely lehetővé teszi a kód Web-en való futtatását, függetlenül attól, hogy az a programozási nyelv, amelyen eredetileg íródott. A fordított alkalmazásokban használhatók a C és C++ szabványos könyvtárok hívásai (libc, libcxx), C++ kiterjesztések, a pthreads alapú multithreading, POSIX API és számos multimédiás könyvtár. Külön API kerül biztosításra a Web API-val és a JavaScript kóddal való integrációhoz.
Az Emscripten támogatja az SDL2 könyvtár kimenetének átkonvertálását Canvas-ra, és megvalósítja az OpenGL és EGL támogatását a WebGL API-n keresztül, ami lehetővé teszi grafikus alkalmazások és játékok (például elérhető a Qt toolkit portja, támogatottak az Unreal Engine és Unity játékmotorok, valamint a Bullet fizikai szimulációs motor) WebAssembly-be történő átalakítását.
A C/C++ kód fordítása mellett külön projektek is fejlődnek, amelyek lehetővé teszik a Lua, C#, Python, Ruby és Perl nyelvek értelmezőinek böngészőkben történő futtatását. virtuális gépekhez Továbbá, lehetővé válik a Clangtól eltérő LLVM frontendek alkalmazása, például a Swift, Rust, D és Fortran nyelvek frontendjei.
A 4.0 verziószám hozzáadását a gyenge ABI (Application Binary Interface) szintű visszafordíthatósági problémák miatti változtatások indokolják (az Emscripten 4.0-re történő újrafordításhoz újra kell fordítani a régi Emscripten verziókkal készült objektum fájlokat és könyvtárakat). Az Emscripten 4.0 főbb változásai:
- Hozzáadva a „-sWASM_LEGACY_EXCEPTIONS” opció a régi és az új kivételkezelési mechanizmus közötti választáshoz. Alapértelmezés szerint a régi mechanizmus marad érvényben, mivel nem minden böngésző implementálta a WebAssembly új kivételkezelők kezelésének lehetőségeit.
- A compiler-rt, libcxx, libcxxabi és libunwind komponensek frissítve lettek az LLVM 19 ágra.
- A Safari assembly's minimum supported browser version (MIN_SAFARI_VERSION setting) has been increased from 14.1 to 15.0, enabling several advanced WebAssembly features by default:
- New instructions for converting float to int (nontrapping-fptoint) are now enabled, which return the minimum or maximum possible value instead of generating an exception on overflow (necessary for SIMD).
- The WASM_BIGINT option is enabled, allowing the use of the BigInt type for exchanging 64-bit integer values between WebAssembly and JavaScript code.
- The BULK_MEMORY option is enabled, utilizing WebAssembly instructions memory.copy and memory.fill for implementing C functions memcpy and memset.
- Path normalization is disabled in the PATH.basename() function (PATH.normalize()), meaning that calling 'PATH.basename("a/.")' will now return '.' instead of 'a', and 'PATH.basename("a/b/..")' will return '..' instead of 'a'.
- When using the '-sMODULARIZE' option, factory functions that create and return instances of WebAssembly modules and objects for JavaScript are now marked as 'async' when compiled in the WASM_ASYNC_COMPILATION mode, which is applied by default.
- The ability to specify JavaScript libraries has been added using the '-lfoo.js' option. Unlike the '--js-library' option, the library search is performed in all paths specified via the '-L' option.
- In debug mode compilation (-O0 or -sASSERTIONS), the debug version of the malloc function with enabled assert checks, which detect issues like double calling of the free() function, is used by default.
Forrás: opennet.ru
