Mozilla 轉而使用 Chromium 的通用正則表達式引擎

Firefox 的 SpiderMonkey JavaScript 引擎 翻譯的 使用基於當前代碼的正則表達式的更新實現 不正則表達式 來自基於 Chromium 項目的瀏覽器中使用的 V8 JavaScript 引擎。 RegExp 的新實現將在 78 月 30 日發布的 Firefox XNUMX 中提出,並將允許瀏覽器實現與正則表達式相關的所有缺失的 ECMAScript 元素。

需要注意的是,SpiderMonkey中的RegExp引擎被設計為一個單獨的組件,這使得它相對獨立並且適合替換,而不需要對代碼庫進行重大更改。 2014 年,模塊化允許用 V8 的 Irregexp 引擎的分支來取代最初在 Firefox 中使用的 YARR RegExp 引擎。 Irregexp 與 V8 API 綁定,與垃圾收集器綁定,使用 V8 特定的字符串表示形式和對像模型。 2014年在適配SpiderMonkey內部API的過程中,對Irregexp引擎進行了部分重寫,出現的變化,比如'\u'標誌,在可能的情況下 忍受 到 Mozilla 維護的一個分支。

不幸的是,維護同步分叉很困難,並且需要大量資源來維護。 隨著 ECMAScript 2018 標準中引入與正則表達式相關的新功能,Mozilla 開發人員開始考慮如何輕鬆地從 Irregexp 移植更改。 作為一種出路,綁定的概念被提出,它允許在 SpiderMonkey 中使用幾乎不變的 Irregexp 引擎(變化僅在於自動替換“#include”塊)。

Mozilla 轉而使用 Chromium 的通用正則表達式引擎

該綁定為 Irregexp 提供了必要的 V8 特定功能,包括內存管理和代碼生成函數,以及基於內存管理機制、代碼生成器和 SpiderMonkey 結構實現的初始數據結構。

RegExp 引擎的更新將允許 Firefox 支持命名捕獲、轉義 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} — 數學符號等。
  • 點全 導致掩碼“.” 包括換行符。
  • 政權 向後看 允許您在正則表達式中確定一種模式在另一種模式之前(例如,匹配美元金額而不捕獲美元符號)。

該項目是在 V8 開發人員的參與下實現的,他們致力於減少 Irregexp 對 V8 的依賴,並將一些無法基於 SpiderMonkey 實現的功能移至禁用的“#ifdef”塊中。 事實證明,這次合作是互惠互利的。 就 Mozilla 開發人員而言,他們已經提交了對 Irregexp 的更改,消除了一些 不一致之處 符合 JavaScript 標準的要求和 改善 代碼質量。 此外,在 Firefox 模糊測試過程中,還發現並修復了 Irregexp 代碼中之前未被注意到的導致崩潰的錯誤。

來源: opennet.ru

添加評論