Der in Firefox verwendete JavaScript-Engine SpiderMonkey. auf die aktualisierte Implementierung der regulĂ€ren AusdrĂŒcke, die auf dem aktuellen Code basiert. aus der JavaScript-Engine V8, die in Browsern basierend auf dem Chromium-Projekt verwendet wird. Die neue RegExp-Implementierung wird im Firefox 78-Release angeboten, das fĂŒr den 30. Juni geplant ist, und wird es ermöglichen, alle fehlenden ECMAScript-Elemente, die mit regulĂ€ren AusdrĂŒcken zusammenhĂ€ngen, im Browser umzusetzen.
Es wird festgestellt, dass die RegExp-Engine in SpiderMonkey als separates Modul gestaltet ist, was sie relativ unabhĂ€ngig macht und ohne signifikante Ănderungen am Code ersetzt werden kann. Die ModularitĂ€t ermöglichte es, 2014 die ursprĂŒnglich in Firefox verwendete RegExp-Engine YARR durch einen Fork der Irregexp-Engine aus V8 zu ersetzen. Irregexp ist an die V8-API gebunden, arbeitet mit dem Garbage Collector zusammen, nutzt V8-spezifische String-Darstellungen und das Objektmodell. Im Prozess der Anpassung an die interne API von SpiderMonkey wurde die Irregexp-Engine 2014 teilweise neu geschrieben, und auftretende Ănderungen wie das Flag '\u' wurden, wo möglich, In einem von Mozilla unterstĂŒtzten Ableger.
Leider ist die Pflege eines synchronisierten Forks eine herausfordernde Aufgabe und erfordert erhebliche Ressourcen. Mit den neuen Möglichkeiten, die der ECMAScript 2018 Standard in Bezug auf regulĂ€re AusdrĂŒcke bietet, haben sich die Entwickler von Mozilla gefragt, wie sie den Transfer von Ănderungen aus Irregexp vereinfachen können. Als Lösung wurde ein Konzept fĂŒr ein Wrapper vorgeschlagen, das es ermöglicht, die nahezu unverĂ€nderte Irregexp-Engine in SpiderMonkey zu verwenden (Ănderungen beschrĂ€nken sich lediglich auf die automatische Ersetzung von â#includeâ-Blöcken).
Der Wrapper bietet Irregexp die notwendigen spezifischen Funktionen von V8, einschlieĂlich Speicherverwaltungs- und Codegenerierungsfunktionen sowie grundlegenden Datenstrukturen, die auf den Mechanismen der Speicherverwaltung, Codegeneratoren und der Struktur von SpiderMonkey basieren.
Ein Update der RegExp-Engine wird es Firefox ermöglichen, Funktionen wie benannte Gruppen, Escape-Klassen fĂŒr Unicode-Zeichen, das dotAll-Flag und den Lookbehind-Modus zu unterstĂŒtzen:
- ermöglichen es, mit regulĂ€ren AusdrĂŒcken ĂŒbereinstimmende Teile einer Zeichenfolge bestimmten Namen zuzuordnen, anstelle von Positionsnummern der Ăbereinstimmungen (zum Beispiel kann anstelle von â/(\d{4})-(\d{2})-(\d{2})/â â/(?\d{4})-(?\d{2})-(?\d{2})/â verwendet 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 Hieroglyphen), \p{Math} â mathematische Zeichen usw.
- Flagge fĂŒhrt dazu, dass das Muster â.â auch fĂŒr Zeilenumbruchzeichen aktiviert wird.
- Modus ermöglicht es, in einem regulÀren Ausdruck zu bestimmen, dass ein Muster einem anderen vorausgeht (zum Beispiel kann man einen Betrag in Dollar erfassen, ohne das Dollarzeichen zu erfassen).
Das Projekt wurde mit der Beteiligung der V8-Entwickler umgesetzt, die ihrerseits daran arbeiteten, die AbhĂ€ngigkeit von Irregexp von V8 zu verringern und einige Eigenschaften, die auf SpiderMonkey nicht umgesetzt werden können, in abschaltbare Abschnitte â#ifdefâ zu verlagern. Die Zusammenarbeit war fĂŒr beide Seiten vorteilhaft. Von ihrer Seite ĂŒbergaben die Entwickler von Mozilla Ănderungen an Irregexp, die einige mit den Anforderungen des JavaScript-Standards beseitigen und CodequalitĂ€t verbessern. Zudem wurden wĂ€hrend der Fuzzing-Tests von Firefox zuvor unentdeckte Fehler im Code von Irregexp gefunden und behoben, die zu AbstĂŒrzen fĂŒhrten.
Quelle: opennet.ru
