Mozilla pasó a utilizar un motor de expresión regular común con Chromium

Motor JavaScript SpiderMonkey utilizado en Firefox transferido utilizar una implementación actualizada de expresiones regulares basadas en el código actual Irreexpreso del motor JavaScript V8 utilizado en navegadores basados ​​en el proyecto Chromium. La nueva implementación de RegExp se ofrecerá en Firefox 78, prevista para el 30 de junio, y traerá al navegador todos los elementos faltantes de ECMAScript relacionados con las expresiones regulares.

Cabe señalar que el motor RegExp en SpiderMonkey está diseñado como un componente separado, lo que lo hace relativamente independiente y adecuado para ser reemplazado sin la necesidad de realizar cambios significativos en la base del código. La modularidad hizo posible en 2014 reemplazar el motor YARR RegExp utilizado originalmente en Firefox con una bifurcación del motor Irregexp de V8. Irregexp está vinculado a la API V8, vinculado al recolector de basura y utiliza una representación de cadena y un modelo de objetos específicos de V8. En el proceso de adaptación a la API interna de SpiderMonkey en 2014, el motor Irregexp se reescribió parcialmente y surgieron cambios, como la bandera '\u', cuando fue posible. transferido en una bifurcación mantenida por Mozilla.

Desafortunadamente, mantener una bifurcación sincronizada es difícil y requiere muchos recursos. Con la llegada de nuevas funciones relacionadas con las expresiones regulares en el estándar ECMAScript 2018, los desarrolladores de Mozilla pensaron en cómo facilitar la migración de cambios desde Irregexp. Como salida, se propuso un concepto de envoltura que permite utilizar el motor Irregexp casi sin cambios en SpiderMonkey (los cambios se reducen solo al reemplazo automático de bloques "#include").

Mozilla pasó a utilizar un motor de expresión regular común con Chromium

El marco proporciona a Irregexp las capacidades necesarias específicas de V8, incluidas funciones de gestión de memoria y generación de código, así como estructuras de datos nativas que se implementan utilizando motores de gestión de memoria, generadores de código y estructuras SpiderMonkey.

La actualización del motor RegExp permitirá que Firefox admita funciones como capturas con nombre, escape de clases de caracteres Unicode, la bandera dotAll y el modo Lookbehind:

  • Grupos nombrados le permite asociar partes de una cadena que coincide con una expresión regular con nombres específicos en lugar de números de serie de coincidencias (por ejemplo, en lugar de “/(\d{4})-(\d{2})-(\d{ 2})/” puede especificar “/( ? \d{4})-(? \d{2})-(? \d{2})/" y accede al año no a través del resultado[1], sino a través del resultado.groups.year).
  • Escapar de clases Los caracteres Unicode agregan construcciones \p{...} y \P{...}, por ejemplo, \p{Number} define todos los caracteres posibles que representan números (incluidos caracteres como ①), \p{Alphabetic} - letras (incluyendo jeroglíficos ), \p{Math} — símbolos matemáticos, etc.
  • Bandera puntoTodos hace que se active la máscara "." incluyendo caracteres de avance de línea.
  • régimen Mira atrás le permite determinar en una expresión regular que un patrón precede a otro (por ejemplo, hacer coincidir una cantidad en dólares sin capturar el signo del dólar).

El proyecto se llevó a cabo con la participación de los desarrolladores de V8, quienes, por su parte, trabajaron para reducir la dependencia de Irregexp de V8 y trasladaron algunas características que no se pueden implementar usando SpiderMonkey a bloques deshabilitados “#ifdef”. La cooperación resultó ser mutuamente beneficiosa. Por su parte, los desarrolladores de Mozilla presentaron cambios a Irregexp que eliminan algunos inconsistencias con los requisitos del estándar JavaScript y mejorando calidad del código. Además, durante las pruebas de fuzzing de Firefox, se identificaron y eliminaron errores previamente desapercibidos en el código Irregexp que provocaban fallos.

Fuente: opennet.ru

Añadir un comentario