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)를 통해 연도에 액세스합니다.
  • 이스케이프 클래스 유니코드 문자는 \p{...} 및 \P{...} 구성을 추가합니다. 예를 들어 \p{Number}는 숫자(XNUMX과 같은 문자 포함)를 설명하는 모든 가능한 문자를 정의하고, \p{Alphabetic} - 문자(포함)를 정의합니다. hieroglyphs ), \p{Math} — 수학 기호 등
  • 깃발 도트 올 "." 마스크가 실행됩니다. 줄 바꿈 문자를 포함합니다.
  • 제도 뒤돌아보기 정규식에서 한 패턴이 다른 패턴보다 앞에 있는지 확인할 수 있습니다(예: 달러 기호를 캡처하지 않고 달러 금액 일치).

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

출처 : opennet.ru

코멘트를 추가