Firefoxi JavaScript-i mootori SpiderMonkey kasutamine uuendatud regulaaravaldiste rakendamisele, mis pÔhinevad kÀesoleval koodil JavaScript-i mootori V8 pÔhjal, mida kasutatakse Chromiumi projekti pÔhjal loodud brauserites. Uus RegExp rakendus pakutakse vÀlja Firefox 78 vÀljalaskes, mis on planeeritud 30. juuniks, ning see vÔimaldab brauseris realiseerida kÔik puuduolevad ECMAScripti elemendid, mis on seotud regulaaravaldistega.
Pange tĂ€hele, et SpiderMonkey-s on RegExp mootori struktuur eraldi komponendina, mis teeb selle suhteliselt iseseisvaks ja vahetatavateks ilma mĂ€rkimisvÀÀrsete muudatusteta koodibaasis. Moodulsuse tĂ”ttu asendati 2014. aastal Firefoxi algselt kasutatud RegExp-mootor YARR V8-mootori Irregexp haruga. Irregexp on seotud V8 API-ga, seondub prĂŒgikogumise mehhanismiga, kasutab V8 spetsiifilist stringi ja objekti mudelit. SpiderMonkey sisemiste API-dega kohandamise kĂ€igus 2014. aastal kirjutati Irregexp mootori osaliselt ĂŒmber, ning tekkivate muudatuste, nagu lipu '\u', edasiviimine. Mozilla toetatavasse haru.
Kahjuks on sĂŒnkroonitud haru sĂ€ilitamine keeruline ĂŒlesanne ja selle hoidmine nĂ”uab suuri ressursse. ECMAScript 2018 standardi uute regulaaravaldistega seotud vĂ”imaluste tekkimisega mĂ”istsid Mozilla arendajad, kuidas saaks lihtsustada muudatuste edasiviimist Irregexp-ist. Lahenduseks pakuti vĂ€lja mĂ€hise kontseptsioon, mis vĂ”imaldab SpiderMonkey's kasutada peaaegu muutumatut Irregexp mootori (muudatused piirduvad vaid automaatse include plokkide asendamisega).
MÀhis annab Irregexpile vajalikke V8 spetsiifilisi omadusi, sealhulgas mÀlu ja koodi genereerimise halduse funktsioone, samuti algstruktuure, mis on rakendatud SpiderMonkey mÀlu haldamise mehhanismide, koodi genereerimise ja struktuuride pÔhjal.
RegExp mootori vĂ€rskendus vĂ”imaldab Firefoxis toetada selliseid vĂ”imalusi nagu nimetatud grupid (named captures), Unicode-sĂŒmbolite klasside eskapeerimine, dotAll lipp ja Lookbehind reĆŸiim:
- kasutavad regulaaravaldistega leitavate stringi osade sidumist teatud nimedega mitte jÀrjestusnumbritega (nt "\/(?\d{4})-(?\d{2})-(?\d{2})\/" asemel saab mÀrkida "\/(?\d{4})-(?\d{2})-(?\d{2})\/" ja pÀÀseda aastale ligi mitte result[1] kaudu, vaid result.groups.year kaudu).
- Unicode-mĂ€rgid lisavad konstruktsioonid \p{âŠ} ja \P{âŠ}, nĂ€iteks \p{Number} mÀÀratleb kĂ”ik vĂ”imalikud numbritega seotud mĂ€rgid (sealhulgas â tĂŒĂŒpi mĂ€rgid), \p{Alphabetic} - tĂ€hed (sealhulgas hiina hieroglĂŒfid), \p{Math} - matemaatilised mĂ€rgid jne.
- Lipp toob kaasa selle, et mask â.â töötab ka rea murru sĂŒmbolite puhul.
- ReĆŸiim vĂ”imaldab mÀÀrata regulaaravaldises, et ĂŒks muster eelneb teisele (nĂ€iteks dollarites summa vĂ”rreldes ilma dollari mĂ€rki hĂ”ivamata).
Projekt viidi ellu V8 arendajate osalusel, kes omakorda töötasid Irregexp sĂ”ltuvuse vĂ€hendamise kallal V8-st ning suunasid mĂ”ned omadused, mida SpiderMonkey baasil ellu viia ei olnud vĂ”imalik, vĂ€lja lĂŒlitatavateks blokkideks "#ifdef". Koostöö osutus vastastikku kasulikuks. Mozilla arendajad edastasid Irregexp'ile muudatused, mis kĂ”rvaldavad mĂ”ned JavaScripti standardite nĂ”uetega ja koodi kvaliteeti. Samuti leiti ja kĂ”rvaldas Firefoxi fuzzing-testimise kĂ€igus varasemalt mitteavaldatud vigad, mis viisid Irregexp krahhideni.
Allikas: opennet.ru
