Mozilla přešla na používání společného enginu regulárních výrazů s prohlížečem Chromium

SpiderMonkey JavaScript engine používaný ve Firefoxu přestoupil používat aktualizovanou implementaci regulárních výrazů na základě aktuálního kódu Irregexp z JavaScript enginu V8 používaného v prohlížečích založených na projektu Chromium. Nová implementace RegExp bude nabízena ve Firefoxu 78, naplánovaná na 30. června a přinese do prohlížeče všechny chybějící prvky ECMAScript související s regulárními výrazy.

Je třeba poznamenat, že engine RegExp ve SpiderMonkey je navržen jako samostatná komponenta, díky čemuž je relativně nezávislý a vhodný pro výměnu bez nutnosti provádět významné změny v základně kódu. Modularita umožnila v roce 2014 nahradit YARR RegExp engine původně používaný ve Firefoxu vidlicí enginu Irregexp z V8. Irregexp je svázán s V8 API, svázaný s garbage collectorem a používá V8 specifickou řetězcovou reprezentaci a objektový model. V procesu adaptace na interní API SpiderMonkey v roce 2014 byl engine Irregexp částečně přepsán a tam, kde to bylo možné, se objevily změny, jako je příznak '\u' přestoupil do forku spravovaného Mozillou.

Bohužel údržba synchronizované vidlice je obtížná a náročná na zdroje. S příchodem nových funkcí souvisejících s regulárními výrazy ve standardu ECMAScript 2018 vývojáři Mozilly přemýšleli o tom, jak usnadnit migraci změn z Irregexp. Jako východisko byl navržen koncept balení, který umožňuje použití téměř nezměněného enginu Irregexp ve SpiderMonkey (změny se omezují pouze na automatickou výměnu bloků „#include“).

Mozilla přešla na používání společného enginu regulárních výrazů s prohlížečem Chromium

Rámec poskytuje Irregexpu nezbytné schopnosti specifické pro V8, včetně funkcí správy paměti a generování kódu, stejně jako nativní datové struktury, které jsou implementovány pomocí modulů správy paměti, generátorů kódu a struktur SpiderMonkey.

Aktualizace enginu RegExp umožní Firefoxu podporovat funkce, jako jsou pojmenované zachycení, escapování třídy znaků Unicode, příznak dotAll a režim Lookbehind:

  • Pojmenované skupiny umožňují přidružit části řetězce odpovídající regulárnímu výrazu ke konkrétním jménům namísto pořadových čísel shod (například místo „/(\d{4})-(\d{2})-(\d{ 2})/“ můžete zadat „/( ? \d{4})-(? \d{2})-(? \d{2})/" a přístup k roku ne přes result[1], ale přes result.groups.year).
  • Únikové třídy Znaky Unicode přidávají konstrukce \p{...} a \P{...}, například \p{Číslo} definuje všechny možné znaky znázorňující čísla (včetně znaků jako ①), \p{Abecední} - písmena (včetně hieroglyfy ), \p{Math} — matematické symboly atd.
  • Vlajka dotAll způsobí odpálení masky ".". včetně znaků odřádkování.
  • režim Ohlédnout se umožňuje určit v regulárním výrazu, že jeden vzor předchází druhému (například shoda částky v dolaru bez zachycení znaku dolaru).

Projekt byl realizován za účasti vývojářů V8, kteří ze své strany pracovali na snížení závislosti Irregexp na V8 a přesunuli některé funkce, které nelze implementovat na SpiderMonkey, do bloků „#ifdef“. Spolupráce se ukázala jako oboustranně výhodná. Vývojáři Mozilly předložili Irregexpu změny, které některé eliminují nesrovnalosti s požadavky standardu JavaScript a zlepšení kvalita kódu. Během fuzzing testování Firefoxu byly také identifikovány a odstraněny dříve nepovšimnuté chyby v kódu Irregexp, které vedly k pádům.

Zdroj: opennet.ru

Přidat komentář