Die Veröffentlichung von Emscripten 4.0 ermöglicht es, C/C++-Code sowie Code anderer Sprachen mit LLVM-Backends in universellen, low-level WebAssembly-Intermediate Code zu kompilieren. Das Ergebnis kann zur Integration in JavaScript-Projekte, zum Ausführen im Webbrowser, zur Nutzung in Node.js oder zur Erstellung von plattformübergreifenden Anwendungen verwendet werden, die mithilfe von wasm-Runtimes betrieben werden. Der Projektcode wird unter der MIT-Lizenz verteilt. Im Compiler kommen Entwicklungen des LLVM-Projekts zum Einsatz, und zur Generierung von WebAssembly sowie zur Optimierung wird die Binaryen-Bibliothek verwendet.
Das Hauptziel von Emscripten ist es, ein Werkzeug zu schaffen, das es ermöglicht, Code im Web unabhängig von der Programmiersprache auszuführen, in der dieser ursprünglich geschrieben wurde. In den kompilierten Anwendungen können Aufrufe der Standardbibliotheken C und C++ (libc, libcxx), C++-Erweiterungen, Multithreading basierend auf pthreads, POSIX-APIs und viele Multimedia-Bibliotheken verwendet werden. Separat werden APIs zur Integration mit Web-APIs und JavaScript-Code bereitgestellt.
Emscripten unterstützt die Übersetzung von SDL2-Bibliotheken in Canvas und bietet Unterstützung für OpenGL und EGL über die WebGL-API. Dies ermöglicht die Umwandlung von grafischen Anwendungen und Spielen in WebAssembly (zum Beispiel gibt es einen Port des Qt-Toolkits, und die Spiel-Engines Unreal Engine und Unity sowie die Physik-Simulations-Engine Bullet werden unterstützt).
Neben der Compilation von C/C++-Code werden separate Projekte für die Ausführung von Interpretern für Browsers und virtuellen Maschinen für die Sprachen Lua, C#, Python, Ruby und Perl entwickelt. Zudem ist die Verwendung von Frontends zu LLVM, die sich von Clang unterscheiden, möglich, wie beispielsweise Frontends für Sprachen wie Swift, Rust, D und Fortran.
Die Vergabe der Versionsnummer 4.0 ist mit Änderungen verbunden, die die ABI-Kompatibilität verletzen (bei der Neuübersetzung des Projekts in Emscripten 4.0 müssen Objektdateien und Bibliotheken, die mit früheren Versionen von Emscripten erstellt wurden, neu gebaut werden). Wesentliche Änderungen in Emscripten 4.0:
- Die Option „-sWASM_LEGACY_EXCEPTIONS“ wurde hinzugefügt, um zwischen alten und neuen Mechanismen zur Ausnahmebehandlung zu wählen. Standardmäßig wird weiterhin der alte Mechanismus verwendet, da nicht alle Browser die WebAssembly-Funktionen zur Unterstützung neuer Ausnahmebehandler implementiert haben.
- Die Komponenten compiler-rt, libcxx, libcxxabi und libunwind wurden auf den LLVM 19-Zweig aktualisiert.
- Die minimal unterstützte Version des Browsers Safari in den Builds (Einstellung MIN_SAFARI_VERSION) wurde von 14.1 auf 15.0 erhöht, was es ermöglicht, mehrere erweiterte Funktionen von WebAssembly standardmäßig zu aktivieren:
- Die Verwendung neuer Anweisungen zur Typumwandlung von float in int (nontrapping-fptoint) wurde hinzugefügt, die anstelle einer Ausnahme bei Überlauf des Ergebnisses den minimalen oder maximalen Wert zurückgeben (notwendig für SIMD).
- Die Option WASM_BIGINT wurde aktiviert, bei der für den Austausch von 64-Bit-Ganzzahlen zwischen WebAssembly und JavaScript-Code der Typ BigInt verwendet wird.
- Die Option BULK_MEMORY wurde aktiviert, bei der für die Implementierung der C-Funktionen memcpy und memset die WebAssembly-Anweisungen memory.copy und memory.fill verwendet werden.
- In der Funktion PATH.basename() wurde die Normalisierung von Pfaden (PATH.normalize()) deaktiviert, d.h. der Aufruf ‘PATH.basename(«a/.»)’ gibt jetzt ‘.’ zurück anstelle von ‘a’, und ‘PATH.basename(«a/b/..»)’ gibt ‘..’ zurück anstelle von ‘a’.
- Bei der Verwendung der Option „-sMODULARIZE“ werden die Fabrikfunktionen, die WebAssembly-Module und Objekte für JavaScript erstellen und zurückgeben, nun mit dem „async“-Flag kompiliert, wenn der Modus WASM_ASYNC_COMPILATION, der standardmäßig angewendet wird, aktiviert ist.
- Es wurde die Möglichkeit hinzugefügt, JavaScript-Bibliotheken durch die Option „-lfoo.js“ anzugeben. Im Gegensatz zur Option „—js-library“ wird die Bibliothek in allen über die Option „-L“ angegebenen Pfaden gesucht.
- Beim Verlinken im Debug-Modus (-O0 oder -sASSERTIONS) wird standardmäßig die Debug-Version der malloc-Funktion mit aktivierten Assert-Prüfungen verwendet, die Fehler wie doppeltes Aufrufen von free() aufdecken.
Quelle: opennet.ru
