Mozilla przeszła na używanie wspólnego silnika wyrażeń regularnych z Chromium

Silnik JavaScript SpiderMonkey używany w przeglądarce Firefox przeniesiony aby użyć zaktualizowanej implementacji wyrażeń regularnych w oparciu o bieżący kod Nieregularne z silnika JavaScript V8 stosowanego w przeglądarkach opartych na projekcie Chromium. Nowa implementacja RegExp będzie dostępna w przeglądarce Firefox 78, a jej premiera zaplanowana jest na 30 czerwca i wprowadzi do przeglądarki wszystkie brakujące elementy ECMAScript związane z wyrażeniami regularnymi.

Należy zauważyć, że silnik RegExp w SpiderMonkey jest zaprojektowany jako oddzielny komponent, co czyni go stosunkowo niezależnym i odpowiednim do wymiany bez konieczności dokonywania znaczących zmian w bazie kodu. Modularność umożliwiła w 2014 roku zastąpienie silnika YARR RegExp oryginalnie używanego w Firefoksie forkiem silnika Irregexp z V8. Irregexp jest powiązany z API V8, powiązany z modułem zbierającym elementy bezużyteczne i wykorzystuje specyficzną dla V8 reprezentację ciągów i model obiektowy. W procesie dostosowywania do wewnętrznego API SpiderMonkey w 2014 roku silnik Irregexp został częściowo przepisany, a pojawiające się zmiany, takie jak flaga „\u”, tam gdzie było to możliwe przeniesiony do forka obsługiwanego przez Mozillę.

Niestety utrzymanie zsynchronizowanego widelca jest trudne i wymaga dużych zasobów. Wraz z pojawieniem się nowych funkcji związanych z wyrażeniami regularnymi w standardzie ECMAScript 2018 programiści Mozilli zastanawiali się, jak ułatwić migrację zmian z Irregexp. Jako wyjście zaproponowano koncepcję wrappingu, która pozwala na wykorzystanie niemal niezmienionego silnika Irregexp w SpiderMonkey (zmiany ograniczają się jedynie do automatycznej wymiany bloków „#include”).

Mozilla przeszła na używanie wspólnego silnika wyrażeń regularnych z Chromium

Framework zapewnia Irregexp niezbędne możliwości specyficzne dla V8, w tym funkcje zarządzania pamięcią i generowania kodu, a także natywne struktury danych implementowane przy użyciu silników zarządzania pamięcią, generatorów kodu i struktur SpiderMonkey.

Aktualizacja silnika RegExp umożliwi przeglądarce Firefox obsługę takich funkcji, jak nazwane przechwytywanie, zmiana znaczenia klas znaków Unicode, flaga dotAll i tryb Lookbehind:

  • Nazwane grupy umożliwiają powiązanie części ciągu znaków dopasowanych za pomocą wyrażenia regularnego z określonymi nazwami zamiast numerami seryjnymi dopasowań (na przykład zamiast „/(\d{4})-(\d{2})-(\d{ 2})/” możesz określić „/(? \d{4})-(? \d{2})-(? \d{2})/" i uzyskaj dostęp do roku nie poprzez wynik[1], ale poprzez wynik.grupy.rok).
  • Ucieczka z zajęć Znaki Unicode dodają konstrukcje \p{...} i \P{...}, np. \p{Number} definiuje wszystkie możliwe znaki przedstawiające liczby (w tym znaki takie jak ①), \p{Alfabetyczny} - litery (w tym hieroglify ), \p{Math} — symbole matematyczne itp.
  • Flaga kropkaWszystkie powoduje uruchomienie maski „.” łącznie ze znakami nowego wiersza.
  • Tryb Spojrzeć za siebie pozwala określić w wyrażeniu regularnym, że jeden wzorzec poprzedza inny (na przykład dopasowanie kwoty w dolarach bez przechwytywania znaku dolara).

Projekt został zrealizowany przy udziale programistów V8, którzy ze swojej strony pracowali nad zmniejszeniem zależności Irregexp od V8 i przenieśli niektóre funkcje, których nie można zaimplementować przy użyciu SpiderMonkey, do bloków „#ifdef”. Współpraca okazała się korzystna dla obu stron. Ze swojej strony programiści Mozilli przesłali zmiany do Irregexp, które eliminują niektóre niespójności z wymaganiami standardu JavaScript i poprawa jakość kodu. Ponadto podczas fuzzingowych testów Firefoksa zidentyfikowano i wyeliminowano wcześniej niezauważone błędy w kodzie Irregexp, które prowadziły do ​​awarii.

Źródło: opennet.ru

Dodaj komentarz