Mozilla ist dazu übergegangen, mit Chromium eine gemeinsame Engine für reguläre Ausdrücke zu verwenden

SpiderMonkey-JavaScript-Engine, die in Firefox verwendet wird übertragen um eine aktualisierte Implementierung regulärer Ausdrücke basierend auf dem aktuellen Code zu verwenden Irregexp von der V8-JavaScript-Engine, die in Browsern verwendet wird, die auf dem Chromium-Projekt basieren. Die neue Implementierung von RegExp wird voraussichtlich am 78. Juni in Firefox 30 angeboten und bringt alle fehlenden ECMAScript-Elemente im Zusammenhang mit regulären Ausdrücken in den Browser.

Es wird darauf hingewiesen, dass die RegExp-Engine in SpiderMonkey als separate Komponente konzipiert ist, wodurch sie relativ unabhängig und zum Ersetzen geeignet ist, ohne dass wesentliche Änderungen an der Codebasis vorgenommen werden müssen. Durch die Modularität war es 2014 möglich, die ursprünglich in Firefox verwendete YARR-RegExp-Engine durch einen Fork der Irregexp-Engine aus V8 zu ersetzen. Irregexp ist an die V8-API und den Garbage Collector gebunden und verwendet eine V8-spezifische Zeichenfolgendarstellung und ein Objektmodell. Im Zuge der Anpassung an die interne API von SpiderMonkey im Jahr 2014 wurde die Irregexp-Engine teilweise neu geschrieben und, soweit möglich, neue Änderungen vorgenommen, wie z. B. das „\u“-Flag übertragen in einen von Mozilla verwalteten Fork.

Leider ist die Aufrechterhaltung einer synchronisierten Abzweigung schwierig und ressourcenintensiv. Mit dem Aufkommen neuer Funktionen im Zusammenhang mit regulären Ausdrücken im ECMAScript 2018-Standard haben Mozilla-Entwickler darüber nachgedacht, wie sie die Migration von Änderungen aus Irregexp einfacher machen können. Als Ausweg wurde ein Wrapping-Konzept vorgeschlagen, das die Verwendung der nahezu unveränderten Irregexp-Engine in SpiderMonkey ermöglicht (die Änderungen beschränken sich lediglich auf das automatische Ersetzen von „#include“-Blöcken).

Mozilla ist dazu übergegangen, mit Chromium eine gemeinsame Engine für reguläre Ausdrücke zu verwenden

Das Framework stellt Irregexp die notwendigen V8-spezifischen Funktionen zur Verfügung, einschließlich Speicherverwaltungs- und Codegenerierungsfunktionen sowie nativer Datenstrukturen, die mithilfe von Speicherverwaltungs-Engines, Codegeneratoren und SpiderMonkey-Strukturen implementiert werden.

Durch die Aktualisierung der RegExp-Engine kann Firefox Funktionen wie benannte Captures, Unicode-Zeichenklassen-Escapezeichen, das dotAll-Flag und den Lookbehind-Modus unterstützen:

  • Benannte Gruppen ermöglichen es Ihnen, Teile einer Zeichenfolge, die mit einem regulären Ausdruck übereinstimmt, mit bestimmten Namen zu verknüpfen, anstatt mit fortlaufenden Nummern der Übereinstimmungen (z. B. anstelle von „/(\d{4})-(\d{2})-(\d{ 2})/“ können Sie „/( ? \d{4})-(? \d{2})-(? \d{2})/" und greifen Sie nicht über result[1], sondern über result.groups.year auf das Jahr zu.
  • Flucht aus dem Unterricht Unicode-Zeichen fügen Konstruktionen \p{...} und \P{...} hinzu, zum Beispiel definiert \p{Number} alle möglichen Zeichen, die Zahlen darstellen (einschließlich Symbole wie ①), \p{Alphabetic} – Buchstaben (einschließlich Hieroglyphen), \p{Math} – mathematische Symbole usw.
  • Flagge dotAll bewirkt, dass die „.“-Maske ausgelöst wird. einschließlich Zeilenvorschubzeichen.
  • Regime Schau hinter dich ermöglicht es Ihnen, in einem regulären Ausdruck zu bestimmen, dass ein Muster einem anderen vorausgeht (z. B. einen Dollarbetrag abgleichen, ohne das Dollarzeichen zu erfassen).

Das Projekt wurde unter Beteiligung von V8-Entwicklern durchgeführt, die ihrerseits daran arbeiteten, die Abhängigkeit von Iregexp von V8 zu verringern, und einige Funktionen, die nicht auf Basis von SpiderMonkey implementiert werden können, in deaktivierte „#ifdef“-Blöcke verschoben. Die Zusammenarbeit erwies sich als für beide Seiten vorteilhaft. Die Mozilla-Entwickler haben ihrerseits Änderungen an Irregexp eingereicht, die einige beseitigen Ungereimtheiten mit den Anforderungen des JavaScript-Standards und verbessern Codequalität. Außerdem wurden beim Fuzzing-Test von Firefox bisher unbemerkte Fehler im Iregexp-Code, die zu Abstürzen führten, identifiziert und behoben.

Source: opennet.ru

Kommentar hinzufügen