Suicide
18.06.2020, 20:16
Применяемый в Firefox JavaScript-движок SpiderMonkey переведён (https://hacks.mozilla.org/2020/06/a-new-regexp-engine-in-spidermonkey/) на использование обновлённой реализации регулярных выражений, основанной на актуальном коде Irregexp (https://blog.chromium.org/2009/02/irregexp-google-chromes-new-regexp.html) из 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', по возможности переносили (https://bugzilla.mozilla.org/show_bug.cgi?id=1135377) в ответвление, поддерживаемое Mozilla.
К сожалению, поддержание синхронизированного форка является трудной задачей и его сопровождение требует больших ресурсов. С появлением в стандарте ECMAScript 2018 новых возможностей, связанных с регулярными выражениями, разработчики Mozilla задумались как можно упростить перенос изменений из Irregexp. В качестве выхода была предложена концепция обвязки, позволяющая использовать в SpiderMonkey почти неизменённый движок Irregexp (изменения сводятся только к автоматической замене блоков "#include").
https://www.opennet.ru/opennews/pics_base/0_1592466939.png (https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2020/06/blog-post-architecture.png)
Обвязка предоставляет для Irregexp необходимые специфичные возможности V8, включая функции управления памятью и генерацией кода, а также исходные структуры данных, которые реализованы на основе механизмов управления памятью, генераторов кода и структур SpiderMonkey.
Обновление RegExp-движка позволит обеспечить в Firefox поддержку таких возможностей, как именованные группы (named captures), экранирование классов Unicode-символов, флаг dotAll и режим Lookbehind:
Именованные группы (https://github.com/tc39/proposal-regexp-named-groups) позволяют связать сопоставленные регулярным выражением части строки с определёнными именами вместо порядковых номеров совпадений (например, вместо "/(\d{4})-(\d{2})-(\d{2})/" можно указать "/(?\d{4})-(?\d{2})-(?\d{2})/" и получить доступ к году не через result[1], а через result.groups.year).
Экранирование классов (https://github.com/tc39/proposal-regexp-unicode-property-escapes) Unicode-символов добавляет конструкции \p{…} и \P{…}, например, \p{Number} определяет все возможные знаки с изображением цифр (включая символы вида ①), \p{Alphabetic} - буквы (в том числе иероглифы), \p{Math} - математические символы и т.п.
Флаг dotAll (https://github.com/tc39/proposal-regexp-dotall-flag) приводит к срабатыванию маски "." в том числе для символов перевода строки.
Режим Lookbehind (https://github.com/tc39/proposal-regexp-lookbehind) позволяет определить в регулярном выражении, что один шаблон предшествует другому (например, сопоставить сумму в долларах без захвата знака доллара).
Проект был осуществлён при участии разработчиков V8, которые со своей стороны провели работу по сокращению зависимости Irregexp от V8, и вынесли некоторые особенности, которые невозможно реализовать на базе SpiderMonkey, в отключаемые блоки "#ifdef". Сотрудничество оказалось взаимовыгодным. Со своей стороны разработчики Mozilla передали в Irregexp изменения, устраняющие некоторые несоответствия (https://github.com/v8/v8/commit/3fab9d05cf34a7f0bc0e9405729ab8b78c0671ac#diff-e6fcde109771fe732204b134d8602427) с требованиями стандарта JavaScript и улучшающие (https://github.com/v8/v8/commit/1637b617b990427ed8aa0b19984780fe319aaef3#diff-e6fcde109771fe732204b134d8602427) качество кода. Также в ходе fuzzing-тестирования Firefox были выявлены и устранены ранее не замеченные ошибки в коде Irregexp, приводящие к крахам.
18.06.2020
https://www.opennet.ru/opennews/art.shtml?num=53173
Отмечается, что движок RegExp в SpiderMonkey оформлен в виде отдельного компонента, что делает его относительно независимым и пригодным для замены без необходимости внесения значительных изменений в кодовую базу. Модульность позволила в 2014 году заменить изначально применяемый в Firefox RegExp-движок YARR на форк движка Irregexp из V8. Irregexp завязан на API V8, привязан к сборщику мусора, использует специфичные для V8 представление строк и объектную модель. В процессе адаптации к внутреннему API SpiderMonkey в 2014 году движок Irregexp частично переписали, а появляющиеся изменения, такие как флаг '\u', по возможности переносили (https://bugzilla.mozilla.org/show_bug.cgi?id=1135377) в ответвление, поддерживаемое Mozilla.
К сожалению, поддержание синхронизированного форка является трудной задачей и его сопровождение требует больших ресурсов. С появлением в стандарте ECMAScript 2018 новых возможностей, связанных с регулярными выражениями, разработчики Mozilla задумались как можно упростить перенос изменений из Irregexp. В качестве выхода была предложена концепция обвязки, позволяющая использовать в SpiderMonkey почти неизменённый движок Irregexp (изменения сводятся только к автоматической замене блоков "#include").
https://www.opennet.ru/opennews/pics_base/0_1592466939.png (https://2r4s9p1yi1fa2jd7j43zph8r-wpengine.netdna-ssl.com/files/2020/06/blog-post-architecture.png)
Обвязка предоставляет для Irregexp необходимые специфичные возможности V8, включая функции управления памятью и генерацией кода, а также исходные структуры данных, которые реализованы на основе механизмов управления памятью, генераторов кода и структур SpiderMonkey.
Обновление RegExp-движка позволит обеспечить в Firefox поддержку таких возможностей, как именованные группы (named captures), экранирование классов Unicode-символов, флаг dotAll и режим Lookbehind:
Именованные группы (https://github.com/tc39/proposal-regexp-named-groups) позволяют связать сопоставленные регулярным выражением части строки с определёнными именами вместо порядковых номеров совпадений (например, вместо "/(\d{4})-(\d{2})-(\d{2})/" можно указать "/(?\d{4})-(?\d{2})-(?\d{2})/" и получить доступ к году не через result[1], а через result.groups.year).
Экранирование классов (https://github.com/tc39/proposal-regexp-unicode-property-escapes) Unicode-символов добавляет конструкции \p{…} и \P{…}, например, \p{Number} определяет все возможные знаки с изображением цифр (включая символы вида ①), \p{Alphabetic} - буквы (в том числе иероглифы), \p{Math} - математические символы и т.п.
Флаг dotAll (https://github.com/tc39/proposal-regexp-dotall-flag) приводит к срабатыванию маски "." в том числе для символов перевода строки.
Режим Lookbehind (https://github.com/tc39/proposal-regexp-lookbehind) позволяет определить в регулярном выражении, что один шаблон предшествует другому (например, сопоставить сумму в долларах без захвата знака доллара).
Проект был осуществлён при участии разработчиков V8, которые со своей стороны провели работу по сокращению зависимости Irregexp от V8, и вынесли некоторые особенности, которые невозможно реализовать на базе SpiderMonkey, в отключаемые блоки "#ifdef". Сотрудничество оказалось взаимовыгодным. Со своей стороны разработчики Mozilla передали в Irregexp изменения, устраняющие некоторые несоответствия (https://github.com/v8/v8/commit/3fab9d05cf34a7f0bc0e9405729ab8b78c0671ac#diff-e6fcde109771fe732204b134d8602427) с требованиями стандарта JavaScript и улучшающие (https://github.com/v8/v8/commit/1637b617b990427ed8aa0b19984780fe319aaef3#diff-e6fcde109771fe732204b134d8602427) качество кода. Также в ходе fuzzing-тестирования Firefox были выявлены и устранены ранее не замеченные ошибки в коде Irregexp, приводящие к крахам.
18.06.2020
https://www.opennet.ru/opennews/art.shtml?num=53173