- Das Browserprojekt Ladybird führt Rust als speichersichere Sprache ein, um C++ zu ersetzen, und nutzt KI-Tools im Migrationsprozess
- Zuvor wurde Swift geprüft, wegen eingeschränkter C++-Interoperabilität und Plattformbeschränkungen fiel die Wahl schließlich jedoch auf Rust
- Das erste Portierungsziel ist die JavaScript-Engine LibJS; mit Claude Code und Codex wurde per hunderten manuell gesteuerten Prompts übersetzt
- In rund zwei Wochen wurden 25.000 Zeilen Rust-Code fertiggestellt; verifiziert wurde, dass Ausgabe und Performance vollständig mit der C++-Version übereinstimmen
- Das Projekt will vorerst ein paralleles Entwicklungsmodell mit C++ und Rust beibehalten und langfristig Sicherheit sowie Wartbarkeit verbessern
Hintergrund zur Einführung von Rust
- Ladybird prüfte mehrere Sprachen, um eine speichersichere Alternative zu C++ zu finden
- Swift wurde ausgeschlossen, da die Interoperabilität mit C++ unzureichend war und die Plattformunterstützung außerhalb des Apple-Ökosystems begrenzt ist
- Rust wurde als Sprache mit einem reifen Ökosystem für Systemprogrammierung bewertet, mit der viele Mitwirkende bereits vertraut sind
- 2024 wurde eine Einführung noch wegen der ungeeigneten Passung von Rust zu C++-artigem OOP zurückgestellt; später fiel die Entscheidung zur erneuten Einführung aufgrund von Sicherheit und gereiftem Ökosystem
- Mit Blick auf die bereits erfolgte Einführung von Rust in Firefox und Chromium kam das Team zu dem Schluss, dass Rust auch für Ladybird geeignet ist
Der Portierungsprozess von LibJS
- Das erste Ziel der Umstellung ist LibJS, Ladybirds JavaScript-Engine
- Lexer, Parser, AST, Bytecode-Generator und andere unabhängige Komponenten sowie die auf test262 basierende Testabdeckung machten sie zu einem geeigneten Ausgangspunkt
- Für die Portierung wurden Claude Code und OpenAI Codex verwendet
- Es handelte sich nicht um automatische Generierung, sondern um eine vom Menschen gesteuerte Übersetzung; Reihenfolge der Portierung und Codestruktur wurden direkt festgelegt
- Mit hunderten Prompts wurden präzise Anweisungen gegeben; anschließend erfolgten Codeprüfung und Fehlersuche mit verschiedenen Modellen
Ergebnisse und Verifizierung
- Das Ziel war, dass die C++- und Rust-Pipelines bytegenau identische Ausgaben erzeugen
- Rund 25.000 Zeilen Rust-Code wurden in zwei Wochen fertiggestellt, wodurch eine Arbeit verkürzt wurde, die sonst mehrere Monate gedauert hätte
- AST und Bytecode sind vollständig identisch, und in Tests sowie JS-Benchmarks gab es keinen Performanceverlust
- Mit Lockstep-Tests, bei denen C++- und Rust-Pipeline gleichzeitig ausgeführt werden, wurde beim Surfen im Web verifiziert, ob die Ergebnisse übereinstimmen
- Der aktuelle Code behält die aus C++ übersetzte Form bei und imitiert sogar Registerzuweisungsmuster identisch
- Der wichtigste Grund dafür ist die Sicherstellung der Kompatibilität mit der C++-Pipeline
- Zu einem späteren Zeitpunkt, wenn die C++-Pipeline aufgegeben wird, ist eine Vereinfachung und Bereinigung des Rust-Codes geplant
Weitere Pläne
- Die Umstellung auf Rust wird nicht als Hauptrichtung der Projektentwicklung, sondern als parallele Arbeit vorangetrieben
- C++- und Rust-Code werden koexistieren, bei klar definierten Interoperabilitätsgrenzen
- Reihenfolge und Umfang der Portierung werden vom Kernteam gesteuert; externe Mitwirkende müssen sich im Voraus abstimmen
- Langfristig wird eine schrittweise Umstellung mit dem Ziel verfolgt, Sicherheit und Wartbarkeit zu verbessern
- Obwohl anerkannt wird, dass die Entscheidung umstritten sein kann, wird sie als richtige Wahl für Ladybirds Zukunft bewertet
Noch keine Kommentare.