De release van Emscripten 4.0 is gepubliceerd, waarmee code in C/C++ en andere talen die front-ends op basis van LLVM hebben, kan worden gecompileerd naar universele low-level tussenliggende code in WebAssembly. Het verkregen resultaat kan worden gebruikt voor integratie met JavaScript-projecten, uitvoering in een webbrowser, gebruik in Node.js of het creëren van afzonderlijke cross-platformtoepassingen die worden uitgevoerd met behulp van wasm-runtime. De code van het project wordt verspreid onder de MIT-licentie. De compiler maakt gebruik van de technieken van het LLVM-project, en voor de generatie van WebAssembly en optimalisatie wordt de Binaryen-bibliotheek gebruikt.
Het hoofddoel van Emscripten is het creëren van een tool die het mogelijk maakt om webcode uit te voeren, ongeacht de programmeertaal waarin deze code oorspronkelijk is geschreven. In de gecompileerde applicaties kunnen oproepen naar standaardbibliotheken in C en C++ (libc, libcxx), C++-uitbreidingen, multithreading op basis van pthreads, POSIX-API en vele multimediabibliotheken worden gebruikt. Daarnaast worden API's geleverd voor integratie met Web API en code in JavaScript.
Emscripten ondersteunt de transformatie van de output van de SDL2-bibliotheek naar Canvas en implementeert ondersteuning voor OpenGL en EGL via de WebGL-API, waardoor grafische applicaties en spellen (bijvoorbeeld er is een poort van de Qt-toolkit, en de spelmotoren Unreal Engine en Unity, evenals de simulatiemotor Bullet worden ondersteund) kunnen worden omgezet naar WebAssembly.
Naast het compileren van code in C/C++ worden er ook projecten ontwikkeld om interpreters voor browsers uit te voeren voor virtuele machines de talen Lua, C#, Python, Ruby en Perl. Bovendien is het mogelijk om front-ends voor LLVM te gebruiken die anders zijn dan Clang, zoals front-ends voor talen zoals Swift, Rust, D en Fortran.
De toewijzing van versie 4.0 is gerelateerd aan wijzigingen die de compatibiliteit op ABI-niveau schenden (bij het herbouwen van een project in Emscripten 4.0 is het noodzakelijk om de objectbestanden en bibliotheken die met eerdere versies van Emscripten zijn gebouwd, opnieuw op te bouwen). De belangrijkste wijzigingen in Emscripten 4.0 zijn:
- De optie "-sWASM_LEAGCY_EXCEPTIONS" is toegevoegd om te kiezen tussen de oude en nieuwe exception handling-mechanismen. Standaard blijft het oude mechanisme in gebruik omdat niet alle browsers de mogelijkheden van WebAssembly voor de werking van nieuwe exception handlers hebben geïmplementeerd.
- De componenten compiler-rt, libcxx, libcxxabi en libunwind zijn bijgewerkt naar de LLVM 19-tak.
- De minimaal ondersteunde versie van de Safari-browser in de builds (instelling MIN_SAFARI_VERSION) is verhoogd van 14.1 naar 15.0, wat het mogelijk maakte om standaard meerdere geavanceerde functies van WebAssembly in te schakelen:
- Het gebruik van nieuwe instructies voor het converteren van type float naar int (nontrapping-fptoint) is ingeschakeld, die in plaats van een uitzondering te genereren bij een overflow van de uitkomst de minimaal of maximaal mogelijke waarde teruggeven (noodzakelijk voor SIMD).
- De optie WASM_BIGINT is ingeschakeld, waarbij voor de uitwisseling van 64-bits gehele getallen tussen WebAssembly en JavaScript-code het type BigInt wordt gebruikt.
- De optie BULK_MEMORY is ingeschakeld, waarbij voor de implementatie van C-functies memcpy en memset de WebAssembly-instructies memory.copy en memory.fill worden gebruikt.
- In de functie PATH.basename() is path-normalisatie (PATH.normalize()) uitgeschakeld, d.w.z. de aanroep ‘PATH.basename(«a/.»)’ retourneert nu ‘.’ in plaats van ‘a’, en ‘PATH.basename(«a/b/..»)’ retourneert ‘..’ in plaats van ‘a’.
- Bij het gebruik van de optie ‘-sMODULARIZE’ zijn factory-functies, die WebAssembly-modules en -objecten voor JavaScript creëren en retourneren, nu gemarkeerd met het label ‘async’ bij compilatie in de MODUS WASM_ASYNC_COMPILATION, die standaard wordt toegepast.
- De mogelijkheid is toegevoegd om JavaScript-bibliotheken op te geven met behulp van de optie ‘-lfoo.js’. In tegenstelling tot de optie ‘—js-library’ wordt de bibliotheek in alle paden gezocht die zijn opgegeven via de optie ‘-L’.
- Bij het samenstellen in de debugmodus (-O0 of -sASSERTIONS) is standaard de debugversie van de malloc-functie ingeschakeld met actieve assert-controle, die fouten zoals een dubbele aanroep van de free() functie aan het licht brengt.
Bron: opennet.ru
