Mozilla hat auf die Verwendung der gleichen regulären Ausdruck-Motoren wie Chromium umgeschaltet.

Die in Firefox verwendete JavaScript-Engine SpiderMonkey wurde für die Verwendung einer aktualisierten Implementierung von regulären Ausdrücken, die auf dem aktuellen Code basiert Irregexp aus der JavaScript-Engine V8, die in Browsern verwendet wird, die auf dem Chromium-Projekt basieren. Die neue Implementierung von RegExp wird mit Firefox 78 am 30. Juni vorgestellt und ermöglicht die Implementierung aller fehlenden ECMAScript-Elemente im Zusammenhang mit regulären Ausdrücken im Browser.

Es wird festgestellt, dass die RegExp-Engine in SpiderMonkey als separates Modul gestaltet ist, was sie relativ unabhängig und austauschbar macht, ohne dass wesentliche Änderungen an der Codebasis erforderlich sind. Die Modularität ermöglichte es, die ursprünglich in Firefox verwendete RegExp-Engine YARR im Jahr 2014 durch einen Fork der Irregexp-Engine aus V8 zu ersetzen. Irregexp ist an die V8-API gebunden, an den Garbage Collector gebunden, verwendet v8-spezifische String-Darstellungen und ein Objektmodell. Im Rahmen der Anpassung an die interne API von SpiderMonkey wurde die Irregexp-Engine im Jahr 2014 teilweise neu geschrieben, wobei neue Änderungen, wie das Flag ‘\u’, soweit möglich übertragen wurden in einen von Mozilla unterstützten Fork.

Leider ist die Aufrechterhaltung eines synchronisierten Forks eine anspruchsvolle Aufgabe und erfordert erhebliche Ressourcen. Mit den neuen Möglichkeiten, die im ECMAScript-2018-Standard im Zusammenhang mit regulären Ausdrücken eingeführt wurden, denken die Mozilla-Entwickler darüber nach, wie sie den Transfer von Änderungen aus Irregexp erleichtern können. Als Lösung wurde das Konzept einer Wrapper-Implementierung vorgeschlagen, das es ermöglicht, die Irregexp-Engine in SpiderMonkey nahezu unverändert zu verwenden (Änderungen beschränken sich nur auf die automatische Ersetzung von „#include“-Blöcken).

Mozilla hat auf die Verwendung der gleichen regulären Ausdruck-Motoren wie Chromium umgeschaltet.

Der Wrapper bietet für Irregexp die erforderlichen V8-spezifischen Funktionen, einschließlich Speicher- und Codegenerierungssteuerung sowie Quellen von Datenstrukturen, die auf den Mechanismen der Speicherverwaltung, der Codegeneratoren und der Strukturen von SpiderMonkey basieren.

Das Update der RegExp-Engine ermöglicht es Firefox, Funktionen wie benannte Gruppen (named captures), Unicode-Zeichenklassenescapes, das Flag dotAll und den Lookbehind-Modus zu unterstützen:

  • Benannte Gruppen ermöglichen es, Teile eines Strings, die mit regulären Ausdrücken übereinstimmen, bestimmten Namen anstelle von positionsbasierten Übereinstimmungsnummern zuzuordnen (zum Beispiel kann anstelle von "\/(\d{4})-(\d{2})-(\d{2})\/" auch "\/(?\d{4})-(?\d{2})-(?\d{2})\/" angegeben werden, um auf das Jahr nicht über result[1], sondern über result.groups.year zuzugreifen).
  • Escape-Zeichen für Klassen Unicode-Zeichen werden durch die Konstruktionen \p{…} und \P{…} hinzugefügt. Zum Beispiel definiert \p{Number} alle möglichen Zeichen, die Ziffern darstellen (einschließlich Zeichen wie ①), \p{Alphabetic} – Buchstaben (einschließlich von Schriftzeichen), \p{Math} – mathematische Symbole usf.
  • Flag dotAll führt dazu, dass das Muster „.“ auch für Zeilenumbruchszeichen wirkt.
  • Modus Lookbehind ermöglicht es, in einem regulären Ausdruck zu bestimmen, dass ein Muster einem anderen vorausgeht (zum Beispiel einen Betrag in Dollar zuzuordnen, ohne das Dollarzeichen zu erfassen).

Das Projekt wurde in Zusammenarbeit mit den Entwicklern von V8 realisiert, die ihrerseits die Abhängigkeit von Irregexp von V8 reduziert und einige Merkmale, die nicht auf der Basis von SpiderMonkey realisierbar sind, in deaktivierbare Blöcke „#ifdef“ ausgegliedert haben. Die Zusammenarbeit war für beide Seiten vorteilhaft. Die Entwickler von Mozilla haben im Gegenzug Änderungen an Irregexp übergeben, die einige Unstimmigkeiten mit den Anforderungen des JavaScript-Standards beseitigen und die Codequalität verbessern. Auch bei Fuzzing-Tests von Firefox wurden zuvor unentdeckte Fehler im Code von Irregexp gefunden und behoben, die zu Abstürzen führten.

Quelle: opennet.ru

60GB SSD 8Gb DDR4