4 Punkte von GN⁺ 2025-04-07 | 1 Kommentare | Auf WhatsApp teilen
  • Die Swift-Community entwickelt die Unterstützung für WebAssembly (Wasm) kontinuierlich weiter und schlägt darauf aufbauend eine langfristige Vision vor
  • WebAssembly ist ein Befehlssatz für eine virtuelle Maschine, bei dem Portabilität, Sicherheit und Performance im Vordergrund stehen, und der auf verschiedenen Plattformen ausgeführt werden kann
  • Durch die Unterstützung von Wasm in Swift lässt sich Swift in neuen Umgebungen einschließlich des Browsers einsetzen; zugleich erweitert das die Einsatzmöglichkeiten sowohl für Client- als auch Server-Anwendungen

Sicherheits- und Systemschnittstellen-Eigenschaften

  • Wasm ist aus Sicherheitsgründen im Vorteil, da es ohne direkten Systemzugriff nur explizit importierte Funktionen ausführen kann
  • WASI (WebAssembly System Interface) stellt Standard-APIs bereit, damit Wasm mit dem Host-Betriebssystem interagieren kann
  • Swift läuft auf dem Target wasm32-unknown-wasi auf Basis von WASI libc und ist über C-Interop bereits nutzbar
  • Das W3C verwaltet über das Component Model das Typsystem von Wasm und die Kopplung zwischen Modulen integriert
    • Mit wit-tool kann aus Swift-Deklarationen .wit erzeugt werden; die umgekehrte Richtung wird ebenfalls unterstützt

Wichtige Anwendungsfälle

  • Swift-Makros lassen sich zu Wasm kompilieren und als Binärdateien verteilen, die überall ausgeführt werden können
  • Die Ausführung von SwiftPM-Plugins, Manifests, Makros usw. kann virtualisiert werden, um die Sicherheit zu erhöhen
  • Wasm kann per JIT- oder AOT-Kompilierung optimierte Binärdateien erzeugen, wodurch Performance-Verluste minimiert werden
  • Als Wasm virtualisierte Swift-Komponenten können ohne separaten Prozess ausgeführt werden, wodurch IPC-Overhead entfällt

Vorgeschlagene Ziele

  1. Erweiterung des API-Umfangs mit WASI-Unterstützung in der Swift-Standardbibliothek
    • Dafür ist der Aufbau einer CI-Umgebung zur Testautomatisierung nötig
  2. Verbesserung der Cross-Compilation-Werkzeuge
    • Versionsverwaltung und Installation des Swift SDK sollen vereinfacht werden
  3. Integration des Component Model
    • Unterstützung dafür, dass die aktuelle WASI-Spezifikation auch in Swift genutzt werden kann
  4. Verbesserte Interoperabilität mit anderen Wasm-Komponenten
    • Ziel ist es, die Nutzung von Wasm-Komponenten aus Swift auf ein Niveau mit C/C++ zu bringen
  5. Verbesserung der Swift-Debugging-Umgebung auf Wasm

Hinweise zum Debugging

  • Das Debugging von Wasm ist eingeschränkt, da es selbst keine Introspection-Funktionen besitzt
  • Es gibt zwei wesentliche Ansätze
    1. Wasm-Runtimes mit Unterstützung für LLDB- und GDB-Protokolle
    2. In die Wasm-Engine integrierte Debugger
  • Browser- und Nicht-Browser-Umgebungen benötigen unterschiedliche Debugging-Ansätze
  • Werkzeuge wie Chrome DevTools können DWARF-Informationen nutzen, aber für Swift-Metadaten und die Auswertung von JIT-Ausdrücken ist zusätzliche Integration erforderlich

Multithreading und Concurrency

  • In Wasm gibt es derzeit nur atomare Operationen mit sequentieller Konsistenz
  • Das Erzeugen von Threads hängt von der Host-Umgebung ab
  • Es gibt zwei Threading-Vorschläge:
    • wasi-threads (bestehender Ansatz, wird von einigen Tools und Runtimes unterstützt)
    • shared-everything-threads (neuer Vorschlag, der künftig zum Standard werden könnte)
  • Swift unterstützt wasm32-unknown-wasi (Single-Thread) und wasm32-unknown-wasip1-threads (Multithread)
  • Derzeit wird ein Single-Thread-basierter Swift-Concurrency-Executor verwendet, da libdispatch wasi-threads nicht unterstützt

64-Bit-Adressraum

  • Wasm verwendet standardmäßig einen 32-Bit-Adressraum
  • Der 64-Bit-Speichervorschlag (memory64) befindet sich in der Implementierungsphase
  • Um dies in Swift zu unterstützen, ist entweder die Zusammenarbeit der WebAssembly-Toolchain oder eine Änderung der Swift-Metadatenstrukturen erforderlich

Gemeinsame Bibliotheken

  • Es gibt zwei Ansätze
    1. Dynamisches Linken im Emscripten-Stil: nicht standardisiert und abhängig von Runtime-Funktionen
    2. Statisches Linken auf Basis des Component Model: auch ohne spezielle Runtime-Funktionen nutzbar, allerdings ohne Laufzeitladen
  • Um gemeinsame Bibliotheken in Swift zu nutzen, muss im PIC-Modus (Position-Independent Code) kompiliert und einem festgelegten Link-Konventionssatz gefolgt werden

1 Kommentare

 
kandk 2025-04-07

Swift ist gut, aber kann das aufgegebene Swift wiederbelebt werden..