Използваният в Firefox JavaScript движещ SpiderMonkey за използване на обновената реализация на регулярни изрази, базирана на актуалния код от JavaScript двигателя V8, използван в браузерите на базата на проекта Chromium. Новата реализация на RegExp ще бъде предложена в изданието на Firefox 78, насрочено за 30 юни, и ще позволи реализирането в браузера на всички липсващи елементи на ECMAScript, свързани с регулярни изрази.
Отбелязва се, че двигателят RegExp в SpiderMonkey е оформен като отделен компонент, което го прави сравнително независим и подходящ за замяна без необходимост от значителни промени в кодовата база. Модулността позволи през 2014 година да бъде заменен изначално използваният в Firefox RegExp двигател YARR с fork на двигателя Irregexp от V8. Irregexp е свързан с API V8, привързан към сборщика на боклук, използва специфични за V8 представяния на низове и обектна модел. В процеса на адаптация към вътрешния API на SpiderMonkey през 2014 година, двигателят Irregexp е частично пренаписан, а появяващите се промени, като флага ‘\u’, по възможност в клон, поддържан от Mozilla.
За съжаление, поддържането на синхронизирано fork е трудна задача и неговото поддържане изисква големи ресурси. С появата на нови възможности в стандарта ECMAScript 2018, свързани с регулярни изрази, разработчиците на Mozilla се запитаха как могат да опростят преноса на промени от Irregexp. Като решение беше предложена концепция за обвивка, позволяваща използването в SpiderMonkey на почти непроменен двигател Irregexp (промените се свеждат само до автоматична подмяна на блокове «#include»).
Обвивката предоставя на Irregexp необходимите специфични възможности на V8, включително функции за управление на паметта и генериране на код, както и изходни структури от данни, които са реализирани на базата на механизми за управление на паметта, генератори на код и структури на SpiderMonkey.
Актуализацията на регистриращия двигател RegExp ще позволи в Firefox поддръжка на такива възможности, като именувани групи (named captures), екраниране на класове Unicode символи, флаг dotAll и режим Lookbehind:
- позволяват да свържете съвпаденията на регулярни изрази с определени имена, вместо да използвате порядкови номера на съвпадения (например, вместо «/(\d{4})-(\d{2})-(\d{2})/» можете да укажете «/(?\d{4})-(?\d{2})-(?\d{2})/» и да получите достъп до годината не чрез result[1], а чрез result.groups.year).
- Unicode символите добавят конструкции \p{…} и \P{…}, например, \p{Number} определя всички възможни знаци с изображение на цифри (включително знаци от вида ①), \p{Alphabetic} — букви (включително иероглифи), \p{Math} — математически символи и т.н.
- FPIPE предизвиква задействането на шаблона «.» и за символи, представляващи нов ред.
- Режим позволява да се определи в регулярния израз, че един шаблон предшества друг (например, да се съпостави сума в долари без да се улавя знака за долар).
Проектът беше осъществен с участието на разработчиците на V8, които от своя страна извършиха работа по намаляване на зависимостта на Irregexp от V8 и изнесоха някои особености, които не могат да бъдат реализирани на базата на SpiderMonkey, в изключаеми блокове «#ifdef». Сътрудничеството се оказа взаимовигодна. с изискванията на стандарта JavaScript и качеството на кода. Също така, по време на fuzzing тестове на Firefox бяха открити и отстранени преди това незабелязани грешки в кода на Irregexp, които водеха до сривове.
Източник: opennet.ru
