Die Veröffentlichung des Emscripten 4.0 Tools ermöglicht es, Code in C/C++ und anderen Sprachen, die Frontends basierend auf LLVM haben, in universellen, niedrigstufigen Zwischencode für WebAssembly zu kompilieren. Das Ergebnis kann für die Integration in JavaScript-Projekte, den Einsatz im Webbrowser, die Verwendung in Node.js oder für die Erstellung separater plattformübergreifender Anwendungen, die mit einem wasm-Laufzeitumgebung betrieben werden, verwendet werden. Der Code des Projekts wird unter der MIT-Lizenz veröffentlicht. Im Compiler werden Erkenntnisse des LLVM-Projekts genutzt, und für die Generierung von WebAssembly und die Optimierung wird die Bibliothek Binaryen eingesetzt.
Das Hauptziel von Emscripten besteht darin, ein Werkzeug zu schaffen, das es ermöglicht, Webcode unabhängig von der Programmiersprache auszuführen, in der dieser Code ursprünglich geschrieben wurde. In den kompilierten Anwendungen können Aufrufe der Standardbibliotheken C und C++ (libc, libcxx), C++-Erweiterungen, Multithreading auf Basis von pthreads, POSIX-API und viele Multimedia-Bibliotheken verwendet werden. Separat werden APIs für die Integration mit Web-APIs und JavaScript-Code bereitgestellt.
Emscripten unterstützt die Übersetzung der SDL2-Bibliotheksausgabe über Canvas und implementiert die Unterstützung von OpenGL und EGL über die WebGL-API, was es ermöglicht, grafische Anwendungen und Spiele in WebAssembly zu konvertieren (zum Beispiel gibt es einen Port des Qt-Toolkits, unterstützt werden die Spiele-Engines Unreal Engine und Unity sowie der Physik-Simulations-Engine Bullet).
Neben der Kompilierung von C/C++-Code werden separate Projekte zur Ausführung von Interpreter in Browsern entwickelt für virtuelle Maschinen die Sprachen Lua, C#, Python, Ruby und Perl. Darüber hinaus ist die Anwendung von Frontends zu LLVM, die sich von Clang unterscheiden, beispielsweise Frontends für Sprachen wie Swift, Rust, D und Fortran, möglich.
Die Version 4.0 erhielt ihre Nummer aufgrund von Änderungen, die die ABI-Kompatibilität beeinträchtigen (beim Neukompilieren des Projekts in Emscripten 4.0 ist eine Neukompilierung der Objektdateien und Bibliotheken erforderlich, die mit früheren Versionen von Emscripten erstellt wurden). Die wesentlichen Änderungen in Emscripten 4.0:
- Die Option „-sWASM_LEAGCY_EXCEPTIONS“ wurde hinzugefügt, um zwischen alten und neuen Ausnahmebehandlungsmechanismen zu wählen. Standardmäßig wird weiterhin der alte Mechanismus verwendet, da nicht alle Browser die Möglichkeiten von WebAssembly zur Arbeit mit neuen Ausnahmebehandlern implementiert haben.
- Die Komponenten compiler-rt, libcxx, libcxxabi und libunwind wurden auf den LLVM 19 Branch aktualisiert.
- Die minimal unterstützte Version des Safari-Browsers in den Builds (Einstellung MIN_SAFARI_VERSION) wurde von 14.1 auf 15.0 erhöht, was es ermöglicht, standardmäßig mehrere erweiterte Funktionen von WebAssembly zu aktivieren:
- Die Verwendung neuer Anweisungen zum Konvertieren von float in int (nontrapping-fptoint) ist aktiviert, die anstelle der Generierung einer Ausnahme bei Überlauf des Ergebnisses den minimalen oder maximalen möglichen Wert zurückgeben (notwendig für SIMD).
- Die Option WASM_BIGINT wurde aktiviert, bei der der Typ BigInt für den Austausch von 64-Bit-Ganzzahlen zwischen WebAssembly und JavaScript-Code verwendet wird.
- Die Option BULK_MEMORY ist aktiviert, bei der die WebAssembly-Anweisungen memory.copy und memory.fill für die Implementierung der C-Funktionen memcpy und memset verwendet werden.
- In der Funktion PATH.basename() wurde die Normalisierung von Pfaden (PATH.normalize()) deaktiviert, d.h. der Aufruf ‚PATH.basename(«a/.»)‘ gibt jetzt ‚.» statt ‚a‘ zurück, während ‚PATH.basename(«a/b/..»)‘ ‚..‘ zurückgibt statt ‚a‘.
- Bei Verwendung der Option „-sMODULARIZE“ sind Factory-Funktionen, die WebAssembly-Module und -Objekte für JavaScript erstellen und zurückgeben, nun beim Kompilieren im Modus WASM_ASYNC_COMPILATION, der standardmäßig angewendet wird, mit dem Kennzeichen „async“ versehen.
- Die Möglichkeit, JavaScript-Bibliotheken unter Verwendung der Option „-lfoo.js“ anzugeben, wurde hinzugefügt. Im Gegensatz zur Option „—js-library“ erfolgt die Bibliothekssuche in allen über die Option „-L“ angegebenen Pfaden.
- Beim Linken im Debug-Modus (-O0 oder -sASSERTIONS) wird standardmäßig die Debug-Version der Funktion malloc mit aktivierten assert-Prüfungen verwendet, die Fehler wie doppelte Aufrufe der Funktion free() aufdecken.
Quelle: opennet.ru
