Mozilla siirtyi käyttämään yhteistä säännöllistä lauseketta Chromiumin kanssa

SpiderMonkey JavaScript-moottori, jota käytetään Firefoxissa siirretty käyttääksesi päivitettyä säännöllisten lausekkeiden toteutusta nykyiseen koodiin perustuen Irregexp V8 JavaScript -moottorista, jota käytetään Chromium-projektiin perustuvissa selaimissa. Uusi RegExp-toteutus tarjotaan Firefox 78:ssa 30. kesäkuuta ja tuo kaikki puuttuvat säännöllisiin lausekkeisiin liittyvät ECMAScript-elementit selaimeen.

On huomattava, että SpiderMonkeyn RegExp-moottori on suunniteltu erilliseksi komponentiksi, mikä tekee siitä suhteellisen itsenäisen ja sopivan vaihdettavaksi ilman, että koodipohjaan tarvitsee tehdä merkittäviä muutoksia. Modulaarisuus mahdollisti vuonna 2014 Firefoxissa alun perin käytetyn YARR RegExp -moottorin korvaamisen V8:n Irregexp-moottorin haarukalla. Irregexp on sidottu V8 API:hen, sidottu roskakeräimeen ja käyttää V8-spesifistä merkkijonoesitystä ja objektimallia. Sopeutumisprosessissa SpiderMonkeyn sisäiseen API:hen vuonna 2014 Irregexp-moottori kirjoitettiin osittain uudelleen ja uusia muutoksia, kuten \u-lippu, mahdollisuuksien mukaan. siirretty Mozillan ylläpitämään haarukkaan.

Valitettavasti synkronoidun haarukan ylläpitäminen on vaikeaa ja resursseja vaativaa. ECMAScript 2018 -standardin säännöllisiin lausekkeisiin liittyvien uusien ominaisuuksien myötä Mozillan kehittäjät miettivät, kuinka helpottaa muutosten siirtämistä Irregexpista. Ulospääsyksi ehdotettiin käärintäkonseptia, joka mahdollistaa lähes muuttumattoman Irregexp-moottorin käytön SpiderMonkeyssa (muutokset rajoittuvat vain "#include"-lohkojen automaattiseen korvaamiseen).

Mozilla siirtyi käyttämään yhteistä säännöllistä lauseketta Chromiumin kanssa

Kehys tarjoaa Irregexpille tarvittavat V8-spesifiset ominaisuudet, mukaan lukien muistinhallinta- ja koodintuotantotoiminnot sekä alkuperäiset tietorakenteet, jotka on toteutettu käyttämällä muistinhallintamoottoreita, koodigeneraattoreita ja SpiderMonkey-rakenteita.

RegExp-moottorin päivittäminen antaa Firefoxille mahdollisuuden tukea ominaisuuksia, kuten nimetyt kaappaukset, Unicode-merkkiluokan poisto, dotAll-lippu ja Lookbehind-tila:

  • Nimetyt ryhmät voit liittää säännöllisen lausekkeen mukaisen merkkijonon osia tiettyihin nimiin vastaavuuksien sarjanumeroiden sijaan (esimerkiksi "/(\d{4})-(\d{2})-(\d{" 2})/" voit määrittää "/( ? \d{4})-(? \d{2})-(? \d{2})/" ja käytä vuotta ei tuloksen[1] kautta, vaan tulos.ryhmät.vuosi).
  • Luokkien pakeneminen Unicode-merkit lisäävät rakenteita \p{...} ja \P{...}, esimerkiksi \p{Number} määrittää kaikki mahdolliset numeroita kuvaavat merkit (mukaan lukien merkit, kuten ①), \p{Aakkosellinen} - kirjaimet (mukaan lukien hieroglyfit ), \p{Math} - matemaattiset symbolit jne.
  • lippu dotAll aiheuttaa "."-naamion syttymisen. mukaan lukien rivinsyöttömerkit.
  • järjestelmä Katso taakse voit määrittää säännöllisessä lausekkeessa, että yksi kuvio edeltää toista (esimerkiksi sovittamalla dollarin summa ilman dollarimerkkiä).

Projekti toteutettiin V8-kehittäjien kanssa, jotka omalta osaltaan pyrkivät vähentämään Irregexpin riippuvuutta V8:sta ja siirsivät joitain ominaisuuksia, joita ei voida toteuttaa SpiderMonkeyn perusteella, "#ifdef" -lohkoihin. Yhteistyö osoittautui molempia osapuolia hyödyttäväksi. Mozillan kehittäjät puolestaan ​​toimittivat Irregexpiin muutoksia, jotka poistavat osan epäjohdonmukaisuuksia JavaScript-standardin ja parantaa koodin laatu. Firefoxin fuzzing-testauksen aikana tunnistettiin ja poistettiin myös aiemmin huomaamattomat virheet Irregexp-koodissa, jotka johtivat kaatumisiin.

Lähde: opennet.ru

Lisää kommentti