Webentwicklung: Firefox 83 beschleunigt JavaScript-Code im JIT-Compiler
Mit dem Projekt "WarpBuilder" haben die Firefox-Entwickler die JavaScript-Engine fĂĽr den Browser Firefox 83 grunderneuert. Warp ist ab jetzt der Default-Modus.
(Bild: Jolanda Aalbers / Shutterstock.com)
- Silke Hahn
Das Mozilla-Team hat die JavaScript-Engine für den Browser Firefox grundlegend erneuert: In der neuen Hauptversion Firefox 83 erhält SpiderMonkey, wie die Engine auch heißt, als Standardeinstellung den neuen WarpBuilder implementiert. Die Veröffentlichung ist für den 17. November 2020, das heutige Datum, angekündigt.
Mehrere JITs fĂĽr den WarpBuild
Warp bringt Veränderungen an den JIT-Compilern (Just-in-time), die für höhere Responsivität, rascheres Laden von Webseiten und eine bessere Speichernutzung sorgen sollen. Die neue Architektur gilt laut Blogankündigung als pflegeleichter in der Wartung und soll auch zusätzliche Features in der JavaScript-Engine zugänglich machen.
Videos by heise
Aktuelle JavaScript-Engines parsen Quellcode in niederschwelligen Bytecode und bieten dann mehrere Möglichkeiten: Interpreter können Bytecode unmittelbar ausführen, alternativ können JIT-Compiler ihn zu nativem Code kompilieren. Bei herkömmlichen Interpretern und JIT-Compilern läuft die Kompilierung schnell, der Code erfährt über Inline-Caches nur grundlegende Anpassungen. Eine alternative JIT-Variante, die SpiderMonkey nun zusätzlich nutzt, kann den Code stärker optimieren, sodass er im Ergebnis schneller wird. Dieses optimierte JIT-Compiling benötigt etwas mehr Speicherplatz und Zeit. Daher greift die Engine nur bei häufig aufgerufenen Funktionen zu dieser Optimierung. Die neue JavaScript-Engine von Firefox soll laut Blogeintrag beide Methoden des JIT-Compilens kombinieren.
(Bild:Â Mozilla.org)
Mit Zwischencode (MIR) zum Maschinencode
Bislang hatte bei Firefox ein Compiler namens IonMonkey das JIT-Kompilieren erledigt, indem er überwiegend per Type Inference (TI) globale Informationen über die im JavaScript-Code enthaltenen Objekte sammelte und den Interpreter sowie das Baseline-JIT mit CacheIR-Daten in einem einfachen linearen Bytecode-Format fütterte. Der WarpBuild verändert die Methode des JIT-Kompilierens, indem er sich nun ganz auf die Datensammlung des CacheIR von den Baseline-Tiers stützt.
(Bild:Â Mozilla.org)
Die Warp-Methode in der erneuerten JavaScript-Engine des Browsers kompiliert häufig aufgerufene JavaScript-Funktionen in drei Schritten: (1) WarpOracle läuft auf dem Haupt-Thread und erstellt einen Snapshot der CacheIR-Daten der Baseline, was relativ rasch vonstatten gehen soll. (2) Der WarpBuilder läuft jenseits des Threads (off-thread) und erstellt aus dem Snapshot einen als MIR (Mid-Level Intermediate Representation) bezeichneten Zwischencode. Dieser Vorgang läuft im Hintergrund und beeinträchtigt offenbar die Prozesse auf dem Haupt-Thread nicht. (3) Abschließend optimiert die JavaScript-Engine – ebenfalls "off-thread" – das JIT-Backend: Sie bearbeitet den Zwischencode weiter und generiert daraus Maschinencode. Vereinfacht gesagt verwebt der WarpBuilder den Bytecode und die CacheIR-Anweisungen zu einem einzigen MIR-Graphen.
Ausblick auf Firefox 85
Warp ersetzt im aktuellen Build mit dem Zwischencode MIR das Frontend des bisherigen JIT-Compilers IonMonkey. In einem nächsten Schritt sollen bis Firefox 85 der alte Code und die obsolet gewordene Architektur entfallen. Parallel plant das Firefox-Team, das Backend des IonMonkey zu vereinfachen und stark JavaScript-haltige Workloads weiter zu beschleunigen. Für CacheIR soll es künftig ein Tool geben, mit dem Webentwickler die CacheIR-Daten für JavaScript-Funktionen untersuchen können.
Mehr Informationen zum aktuellen Release lassen sich dem Blogeintrag der Firefox-Entwickler bei Mozilla entnehmen. In dem Beitrag finden Interessierte auch Performance-Vergleiche der bisherigen und der aktuellen Compiler sowie der Speichernutzung.
(sih)