Die 2-GB-Grenze überwinden: Asynchrone E/A für große Dateien in WebAssembly

2025-03-04
Die 2-GB-Grenze überwinden: Asynchrone E/A für große Dateien in WebAssembly

Der Autor hatte zuvor setjmp in WebAssembly implementiert und dabei die Abhängigkeit von WASI libc vom Exception-Handling-Vorschlag umgangen. Dieser Ansatz war jedoch auf Dateien kleiner als 2 GB beschränkt. Dieser Beitrag beschreibt, wie man die File API und den Blob-Typ verwendet, um ein speicherbasiertes Dateisystem zu erstellen, um größere Dateien zu verarbeiten. Da die Web-E/A asynchron ist, während Systemsprachen typischerweise synchron sind, wurde Asyncify verwendet, um die Paradigmen zu überbrücken. Der Autor stieß auf Optimierungsprobleme mit wasm-opt und löste diese durch die Erstellung eines Dummy-wasm-opt. Schließlich wurde durch geschickte Verwendung eines volatilen Funktionszeigers die falsche Annahme von Asyncify bezüglich der Funktion `asyncjmp_rt_start` umgangen, wodurch schließlich die asynchrone Verarbeitung großer Dateien erreicht wurde.

Mehr lesen
Entwicklung

Perl nach WebAssembly kompilieren: Eine Herkulesaufgabe

2025-02-11
Perl nach WebAssembly kompilieren: Eine Herkulesaufgabe

Beim Aufbau eines Startups stand der Autor vor einer Herausforderung: die Extraktion von Datei-Metadaten auf der Client-Seite. ExifTool ist zwar leistungsstark, erwies sich aber aufgrund seiner Perl-Natur als schwierig, statisch zu kompilieren und auf verschiedenen Betriebssystemen bereitzustellen. Es wurden verschiedene Ansätze versucht, darunter die statische Kompilierung von Perl, was schließlich zu WebAssembly führte. Der Prozess war voller Herausforderungen, mit Kämpfen gegen Perls Build-System, Emscripten und WASI, und erforderte sogar Änderungen am Perl-Quellcode. Der Autor konnte erfolgreich eine eigenständige WebAssembly-Version von Perl erstellen und ExifTool ausführen, aber der Prozess zeigte auch die unzureichende Unterstützung für die Ausnahmebehandlung in WebAssembly-Laufzeitumgebungen auf.

Mehr lesen
Entwicklung

Überwindung von WebAssembly Laufzeitbeschränkungen: Asynchrone Implementierung von ZeroPerl

2025-02-11
Überwindung von WebAssembly Laufzeitbeschränkungen: Asynchrone Implementierung von ZeroPerl

Frustriert über die fehlende Unterstützung von exnref in den meisten WebAssembly Laufzeiten, wodurch ZeroPerl unbrauchbar wurde, beschloss der Autor, das Problem zu beheben anstatt sich zu beschweren. Durch die Nutzung der Asyncify-Funktion von Binaryen wurde ein Ersatz für setjmp von Grund auf implementiert, wodurch die Kompatibilitätsprobleme von libsetjmp umgangen wurden. Nach dem Entfernen der offiziellen Bibliothek, dem Schreiben von Assemblercode und der Optimierung mit wasm-opt läuft ZeroPerl jetzt erfolgreich in Wasmer, Wasmtime und anderen WebAssembly Laufzeiten. Dieser Durchbruch liefert ein vollständig gekapseltes und eigenständiges Perl WebAssembly-Modul.

Mehr lesen
Entwicklung