Mozilla премина към използване на общ механизъм за регулярни изрази с Chromium

JavaScript машината SpiderMonkey на Firefox преведено да използвате актуализирана реализация на регулярни изрази въз основа на текущия код Irregexp от двигателя V8 JavaScript, използван в браузъри, базирани на проекта Chromium. Нова реализация на RegExp ще бъде предложена в изданието на Firefox 78 от 30 юни и ще позволи на браузъра да внедри всички липсващи елементи на ECMAScript, свързани с регулярните изрази.

Отбелязва се, че RegExp енджинът в SpiderMonkey е проектиран като отделен компонент, което го прави относително независим и подходящ за замяна, без да е необходимо да се правят значителни промени в кодовата база. Модулността позволи през 2014 г. да се замени двигателят YARR RegExp, използван първоначално във Firefox, с разклонение на двигателя Irregexp от V8. Irregexp е свързан с V8 API, свързан със събирача на отпадъци, използва специфично за V8 низово представяне и обектен модел. В процеса на адаптиране към вътрешния API на SpiderMonkey през 2014 г., машината Irregexp беше частично пренаписана и промените, които се появяват, като флага „\u“, където е възможно изтърпял към разклонение, поддържано от Mozilla.

За съжаление поддържането на синхронизирана вилица е трудно и изисква много ресурси за поддръжка. С въвеждането на нови функции, свързани с регулярните изрази в стандарта ECMAScript 2018, разработчиците на Mozilla започнаха да мислят как могат лесно да пренасят промени от Irregexp. Като изход беше предложена концепцията за обвързване, която позволява използването на почти непроменения двигател Irregexp в SpiderMonkey (промените се свеждат само до автоматичната замяна на блоковете „#include“).

 Mozilla премина към използване на общ механизъм за регулярни изрази с Chromium

Свързването предоставя на Irregexp необходимите специфични за V8 характеристики, включително функции за управление на паметта и генериране на код, както и първоначални структури от данни, които са внедрени на базата на механизми за управление на паметта, генератори на кодове и структури на SpiderMonkey.

Актуализацията на механизма RegExp ще позволи на Firefox да поддържа функции като наименувани улавяня, екраниращи Unicode символни класове, флага dotAll и режим Lookbehind:

  • Именувани групи ви позволяват да асоциирате части от низ, съответстващ на регулярен израз, с определени имена вместо поредни номера на съвпадения (например вместо "/(\d{4})-(\d{2})-(\d{ 2})/" можете да посочите "/( ? \d{4})-(? \d{2})-(? \d{2})/" и достъп до годината не чрез резултат[1], а чрез резултат.групи.година).
  • Бягство от часовете Unicode символите добавят конструкциите \p{…} и \P{…}, например \p{Number} дефинира всички възможни знаци с изображение на числа (включително знаци като ①), \p{Alphabetic} - букви (включително йероглифи ), \p{Math} — математически символи и др.
  • флаг dotAll причинява маската "." включително знаци за нов ред.
  • режим Погледни назад ви позволява да определите в регулярен израз, че един шаблон предшества друг (например съвпадение на сума в долари, без да улавяте знака за долар).

Проектът беше реализиран с участието на разработчиците на V8, които от своя страна работиха за намаляване на зависимостта на Irregexp от V8 и преместиха някои функции, които не могат да бъдат внедрени на базата на SpiderMonkey, в деактивирани блокове "#ifdef". Сътрудничеството се оказа взаимноизгодно. От своя страна разработчиците на Mozilla внесоха промени в Irregexp, които премахват някои несъответствия с изискванията на стандарта JavaScript и подобряване качество на кода. Също така, по време на тестването на размиването на Firefox бяха идентифицирани и коригирани незабелязани преди това грешки в кода на Irregexp, водещи до сривове.

Източник: opennet.ru

Добавяне на нов коментар