Mozilla het oorgeskakel na die gebruik van 'n gewone gewone uitdrukking-enjin met Chromium

SpiderMonkey JavaScript-enjin wat in Firefox gebruik word oorgedra om 'n opgedateerde implementering van gereelde uitdrukkings gebaseer op die huidige kode te gebruik Irregexp van die V8 JavaScript-enjin wat in blaaiers gebruik word gebaseer op die Chromium-projek. Die nuwe implementering van RegExp sal in Firefox 78 aangebied word, geskeduleer vir 30 Junie, en sal al die ontbrekende ECMAScript-elemente wat met gereelde uitdrukkings verband hou, na die blaaier bring.

Daar word kennis geneem dat die RegExp-enjin in SpiderMonkey as 'n aparte komponent ontwerp is, wat dit relatief onafhanklik maak en geskik is vir vervanging sonder dat dit nodig is om beduidende veranderinge aan die kodebasis aan te bring. Modulariteit het dit in 2014 moontlik gemaak om die YARR RegExp-enjin wat oorspronklik in Firefox gebruik is, te vervang met 'n vurk van die Irregexp-enjin van V8. Irregexp is gekoppel aan die V8 API, gekoppel aan die vullisverwyderaar, en gebruik 'n V8-spesifieke stringvoorstelling en objekmodel. In die proses om aan te pas by SpiderMonkey se interne API in 2014, is die Irregexp-enjin gedeeltelik herskryf, en opkomende veranderinge, soos die '\u'-vlag, waar moontlik oorgedra in 'n vurk wat deur Mozilla in stand gehou word.

Ongelukkig is die instandhouding van 'n gesinchroniseerde vurk moeilik en hulpbronintensief. Met die koms van nuwe kenmerke wat verband hou met gereelde uitdrukkings in die ECMAScript 2018-standaard, het Mozilla-ontwikkelaars gedink oor hoe om dit makliker te maak om veranderinge vanaf Irregexp te migreer. As 'n uitweg is 'n wikkelkonsep voorgestel, wat die gebruik van die byna onveranderde Irregexp-enjin in SpiderMonkey moontlik maak (die veranderinge word slegs verminder tot die outomatiese vervanging van "#include"-blokke).

Mozilla het oorgeskakel na die gebruik van 'n gewone gewone uitdrukking-enjin met Chromium

Die raamwerk verskaf aan Irregexp die nodige V8-spesifieke vermoëns, insluitend geheuebestuur en kodegenereringsfunksies, sowel as inheemse datastrukture wat geïmplementeer word deur gebruik te maak van geheuebestuurenjins, kodegenerators en SpiderMonkey-strukture.

Deur die RegExp-enjin op te dateer, sal Firefox funksies soos benoemde opnames, Unicode-karakterklas ontsnap, die dotAll-vlag en Lookbehind-modus ondersteun:

  • Benoemde groepe laat jou toe om dele van 'n string wat deur 'n gewone uitdrukking pas, te assosieer met spesifieke name in plaas van reeksnommers van passings (byvoorbeeld, in plaas van "/(\d{4})-(\d{2})-(\d{ 2})/” kan jy “/( ? \d{4})-(? \d{2})-(? \d{2})/" en kry toegang tot die jaar, nie deur resultaat[1], maar deur result.groups.year).
  • Ontsnap klasse Unicode-karakters voeg konstruksies \p{...} en \P{...} by, byvoorbeeld, \p{Number} definieer alle moontlike karakters wat getalle uitbeeld (insluitend karakters soos ①), \p{Alfabeties} - letters (insluitend hiërogliewe ), \p{Math} — wiskundige simbole, ens.
  • vlag dotAll veroorsaak dat die "."-masker brand. insluitend lynvoerkarakters.
  • regime Kyk agter laat jou toe om in 'n gereelde uitdrukking te bepaal dat een patroon 'n ander voorafgaan (byvoorbeeld om 'n dollarbedrag te pas sonder om die dollarteken vas te vang).

Die projek is uitgevoer met die deelname van V8-ontwikkelaars, wat op hul beurt gewerk het om die afhanklikheid van Irregexp van V8 te verminder, en sommige kenmerke wat nie met SpiderMonkey geïmplementeer kan word nie, verskuif het na deaktiveer "#ifdef"-blokke. Die samewerking het geblyk wedersyds voordelig te wees. Mozilla-ontwikkelaars het veranderings aan Irregexp voorgelê wat sommige uitskakel inkonsekwenthede met die vereistes van die JavaScript-standaard en verbeter kode kwaliteit. Ook, tydens fuzzing toetsing van Firefox, is voorheen onopgemerkte foute in die Irregexp-kode wat tot ineenstortings gelei het, geïdentifiseer en uitgeskakel.

Bron: opennet.ru

Voeg 'n opmerking