Mozilla schakelde over op het gebruik van een algemene reguliere expressie-engine met Chromium

Firefox's SpiderMonkey JavaScript-engine vertaald om een ​​bijgewerkte implementatie van reguliere expressies te gebruiken op basis van de huidige code Onregelmatig van de V8 JavaScript-engine die wordt gebruikt in browsers op basis van het Chromium-project. Een nieuwe implementatie van RegExp zal worden voorgesteld in de release van Firefox 78 van 30 juni, en zal de browser in staat stellen alle ontbrekende ECMAScript-elementen met betrekking tot reguliere expressies te implementeren.

Opgemerkt wordt dat de RegExp-engine in SpiderMonkey is ontworpen als een afzonderlijk onderdeel, waardoor deze relatief onafhankelijk is en geschikt voor vervanging zonder dat er aanzienlijke wijzigingen in de codebasis moeten worden aangebracht. Modulariteit maakte het in 2014 mogelijk om de YARR RegExp-engine die oorspronkelijk in Firefox werd gebruikt, te vervangen door een vork van de Irregexp-engine van V8. Irregexp is gekoppeld aan de V8 API, gekoppeld aan de garbage collector, gebruikt V8-specifieke tekenreeksrepresentatie en objectmodel. Tijdens het aanpassingsproces aan de interne API van SpiderMonkey in 2014 werd de Irregexp-engine gedeeltelijk herschreven en werden de veranderingen die verschijnen, zoals de '\u'-vlag, waar mogelijk doorstaan naar een vork die wordt onderhouden door Mozilla.

Helaas is het onderhouden van een gesynchroniseerde vork moeilijk en vereist het veel middelen om het te onderhouden. Met de introductie van nieuwe functies gerelateerd aan reguliere expressies in de ECMAScript 2018-standaard, begonnen Mozilla-ontwikkelaars na te denken over hoe ze gemakkelijk wijzigingen van Irregexp konden overbrengen. Als uitweg werd het concept van binding voorgesteld, waardoor de vrijwel ongewijzigde Irregexp-engine in SpiderMonkey kan worden gebruikt (de wijzigingen komen alleen neer op de automatische vervanging van "#include" -blokken).

Mozilla schakelde over op het gebruik van een algemene reguliere expressie-engine met Chromium

De binding biedt Irregexp de nodige V8-specifieke functies, waaronder functies voor geheugenbeheer en codegeneratie, evenals initiële datastructuren die worden geïmplementeerd op basis van geheugenbeheermechanismen, codegeneratoren en SpiderMonkey-structuren.

Dankzij een update van de RegExp-engine kan Firefox functies ondersteunen zoals benoemde opnames, ontsnappende Unicode-tekenklassen, de dotAll-vlag en de Lookbehind-modus:

  • Genoemde groepen kunt u delen van een tekenreeks die overeenkomt met een reguliere expressie associëren met specifieke namen in plaats van serienummers van overeenkomsten (bijvoorbeeld in plaats van "/(\d{4})-(\d{2})-(\d{ 2})/" kunt u opgeven "/( ? \d{4})-(? \d{2})-(? \d{2})/" en krijg toegang tot het jaar, niet via resultaat[1], maar via resultaat.groepen.jaar).
  • Ontsnappende lessen Unicode-tekens voegen de constructies \p{…} en \P{…} toe. \p{Number} definieert bijvoorbeeld alle mogelijke tekens met de afbeelding van cijfers (inclusief tekens zoals ①), \p{Alfabetisch} - letters (inclusief hiërogliefen ), \p{Wiskunde} — wiskundige symbolen, enz.
  • vlag puntAlles veroorzaakt het masker "." inclusief nieuweregeltekens.
  • regime Achterom kijken Hiermee kunt u in een reguliere expressie bepalen dat het ene patroon aan het andere voorafgaat (bijvoorbeeld een dollarbedrag matchen zonder het dollarteken vast te leggen).

Het project werd geïmplementeerd met medewerking van de V8-ontwikkelaars, die op hun beurt eraan werkten om de afhankelijkheid van Irregexp van V8 te verminderen, en een aantal functies die niet op SpiderMonkey kunnen worden geïmplementeerd, naar uitgeschakelde "#ifdef"-blokken hebben verplaatst. De samenwerking bleek wederzijds voordelig. Van hun kant hebben de Mozilla-ontwikkelaars wijzigingen ingediend bij Irregexp die enkele ervan elimineren inconsistenties met de vereisten van de JavaScript-standaard en verbeteren codekwaliteit. Ook werden tijdens de fuzzing-tests van Firefox voorheen onopgemerkte fouten in de Irregexp-code, die tot crashes leidden, geïdentificeerd en verholpen.

Bron: opennet.ru

Voeg een reactie