Die in Firefox verwendete JavaScript-Engine SpiderMonkey fĂŒr die Verwendung einer aktualisierten Implementierung von regulĂ€ren AusdrĂŒcken, die auf dem aktuellen Code basiert 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 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).
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:
- 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).
- 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 fĂŒhrt dazu, dass das Muster â.â auch fĂŒr Zeilenumbruchszeichen wirkt.
- Modus 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 mit den Anforderungen des JavaScript-Standards beseitigen und 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
