Mozilla перейшла на використання спільного з Chromium двигуна регулярних виразів

JavaScript-движок SpiderMonkey, що застосовується в Firefox перекладено на використання оновленої реалізації регулярних виразів, що базується на актуальному коді Irregexp з JavaScript-движка V8, який використовується в браузерах на основі проекту Сhromium. Нова реалізація RegExp буде запропонована у випуску Firefox 78, наміченому на 30 червня, і дозволить реалізувати у браузері всі елементи ECMAScript, пов'язані з регулярними висловлюваннями.

Зазначається, що движок RegExp SpiderMonkey оформлений у вигляді окремого компонента, що робить його відносно незалежним і придатним для заміни без необхідності внесення значних змін в кодову базу. Модульність дозволила в 2014 році замінити спочатку застосовуваний в Firefox RegExp-движок YARR на форк двигун Irregexp з V8. Irregexp зав'язаний на API V8, прив'язаний до збирача сміття, використовує специфічні для V8 уявлення рядків та об'єктну модель. У процесі адаптації до внутрішнього API SpiderMonkey в 2014 році двигун Irregexp частково переписали, а зміни, такі як прапор '\u', по можливості переносили у відгалуження, що підтримується Mozilla.

На жаль, підтримка синхронізованого форка є важким завданням та його супровід потребує великих ресурсів. З появою в стандарті ECMAScript 2018 нових можливостей, пов'язаних з регулярними висловлюваннями, розробники Mozilla замислилися, як можна спростити перенесення змін з Irregexp. В якості виходу була запропонована концепція обв'язки, що дозволяє використовувати в SpiderMonkey майже незмінений двигун Irregexp (зміни зводяться тільки до автоматичної заміни блоків #include).

Mozilla перейшла на використання спільного з Chromium двигуна регулярних виразів

Обв'язка надає 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 {Math} - математичні символи і т.п.
  • прапор dotAll призводить до спрацьовування маски "." у тому числі для символів перекладу рядка.
  • режим Подивись позаду дозволяє визначити у регулярному вираженні, що один шаблон передує іншому (наприклад, зіставити суму у доларах без захоплення знака долара).

Проект був здійснений за участю розробників V8, які зі свого боку провели роботу зі скорочення залежності Irregexp від V8, і винесли деякі особливості, які неможливо реалізувати на базі SpiderMonkey, у блоки «#ifdef», що відключаються. Співпраця виявилася взаємовигідною. Зі свого боку, розробники Mozilla передали в Irregexp зміни, що усувають деякі невідповідності з вимогами стандарту JavaScript та покращують якість коду. Також у ході fuzzing-тестування Firefox було виявлено та усунено раніше не помічені помилки в коді Irregexp, що призводять до крахів.

Джерело: opennet.ru

Додати коментар або відгук