Mozilla перайшла на выкарыстанне агульнага з Chromium рухавічка рэгулярных выразаў

Ужывальны ў Firefox JavaScript-рухавічок SpiderMonkey пераведзены на выкарыстанне абноўленай рэалізацыі рэгулярных выразаў, заснаванай на актуальным кодзе 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{…} і \P{…}, напрыклад, \p{Number} вызначае ўсе магчымыя знакі з выявай лічбаў (уключаючы знакі выгляду ①), \p{Alphabetic} - літары (у тым ліку іерогліфы ), \p{Math} - матэматычныя сімвалы і да т.п.
  • сцяг dotAll прыводзіць да спрацоўвання маскі "." у тым ліку для сімвалаў перакладу радка.
  • рэжым Lookbehind дазваляе вызначыць у рэгулярным выразе, што адзін шаблон папярэднічае іншаму (напрыклад, супаставіць суму ў далярах без захопу знака даляра).

Праект быў ажыццёўлены пры ўдзеле распрацоўшчыкаў V8, якія са свайго боку правялі працу па скарачэнні залежнасці Irregexp ад V8, і вынеслі некаторыя асаблівасці, якія немагчыма рэалізаваць на базе SpiderMonkey, у адключаныя блокі "#ifdef". Супрацоўніцтва аказалася ўзаемавыгадным. Са свайго боку распрацоўнікі Mozilla перадалі ў Irregexp змены, якія ўхіляюць некаторыя. неадпаведнасці з патрабаваннямі стандарту JavaScript і паляпшаючыя якасць кода. Таксама падчас fuzzing-тэставанні Firefox былі выяўлены і ўхіленыя раней не заўважаныя памылкі ў кодзе Irregexp, якія прыводзяць да крахаў.

Крыніца: opennet.ru

Дадаць каментар