Firefoxi JavaScripti mootor SpiderMonkey uuendatud regulaaravaldiste rakendamiseks, mis põhinevad aktuaalsel koodil JavaScripti mootori V8 põhjal, mida kasutatakse Chromiumi projektil põhinevates brauserites. Uus RegExp'i rakendus suurendatakse Firefox 78 väljaandes, mis on planeeritud 30. juuniks, ning see võimaldab meie brauseris rakendada kõiki puuduvaid ECMAScripti elemente, mis on seotud regulaaravaldistega.
RegExp'i mootor SpiderMonkey's on märgitud kui eraldiseisev komponent, mistõttu on see suures osas iseseisev ja asendatav ilma oluliste muudatusteta koodibaasis. Modulaarsus võimaldas 2014. aastal asendada Firefoxis algselt kasutatud RegExp mootor YARR forkiga V8 mootori Irregexp'st. Irregexp on seotud V8 API-ga, seondub jäätme kogumise süsteemiga, kasutab V8 spetsiifilisi stringide ja objekti mudelit. SpiderMonkey sisemise API kohandamisel 2014. aastal kirjutati Irregexp mootor osaliselt ümber, ning uued muudatused, nagu lipp '\u', kätkeb võimaluse kohaselt Mozilla toetatud harule.
Kahjuks on sünkroniseeritud forki säilitamine keeruline ülesanne, mis nõuab palju ressursse. ECMAScript 2018 standardis ilmnenud uute võimaluste tõttu regulaarsete väljendite osas hakkasid Mozilla arendajad mõtlema, kuidas lihtsustada muudatuste üleviimist Irregexpist. Lahenduseks pakkus välja sidumisconcept, mis võimaldab SpiderMonkey's kasutada peaaegu muutumatut Irregexp mootorratast (muudatused piirduvad vaid plokkide "#include" automaatse asendamisega).
Sidumine annab Irregexpile vajalikud V8 spetsiifilised funktsioonid, sealhulgas mälu- ja koodigeneratsiooni juhtimise funktsioonid, samuti algsed andmestruktuurid, mis on rakendatud mälu haldamise, koodigeneratsiooni ja SpiderMonkey struktuuride mehhanismide põhjal.
RegExp mootori uuendamine tagab Firefoxis selliste võimaluste toe nagu nimelised grupid (named captures), Unicode-sümbolite klasside varjamine, dotAll lipp ja Lookbehind režiim:
- võimaldavad siduda regulaarselt väljendatud stringi osad teatud nimedega, pigem kui järjestikuste numbritega (näiteks "/(\d{4})-(\d{2})-(\d{2})/" asemel võite kasutada "/(?\d{4})-(?\d{2})-(?\d{2})/" ja ligipääs aastale ei toimu result[1] kaudu, vaid result.groups.year kaudu).
- Unicode-märgid lisavad konstruktsioone \p{…} ja \P{…}, näiteks \p{Number} määratleb kõik võimalikud numbrite sümbolid (sealhulgas ① tüüpi sümbolid), \p{Alphabetic} – tähed (sealhulgas hieroglüüfid), \p{Math} – matemaatilised sümbolid jne.
- Lipp toob kaasa maski „.“ aktiveerimise, sealhulgas reavahetuste sümbolite jaoks.
- Režiim võimaldab määrata regulaarses väljendis, et üks mustri eeldab teist (näiteks sobitada dollarites summa ilma dollarimärki haaramata).
Projekt toimus V8 arendajate osalusel, kes vähendasid Irregexp'i sõltuvust V8-st ja tõid välja mõned tunnused, mida ei olnud võimalik rakendada SpiderMonkey baasil, väljalülitatavatesse blokkidesse «#ifdef». Koostöö osutus vastastikku kasulikuks. Mozilla arendajad edastasid Irregexp'isse muudatused, mis kõrvaldasid mõned JavaScripti standardi nõuetega ja koodi kvaliteeti. Samuti tuvastati ja kõrvaldati Firefoxi fuzzing-testeerimise käigus varem tundmatud vead Irregexp'i koodis, mis põhjustasid kokkuvarisemisi.
Allikas: opennet.ru
