El motor JavaScript SpiderMonkey utilizado en Firefox para la implementación actualizada de expresiones regulares, basada en el código actualizado del motor JavaScript V8, utilizado en navegadores basados en el proyecto Chromium. La nueva implementación de RegExp se ofrecerá en la versión de Firefox 78, programada para el 30 de junio, y permitirá implementar en el navegador todos los elementos faltantes de ECMAScript relacionados con expresiones regulares.
Se observa que el motor RegExp en SpiderMonkey está diseñado como un componente independiente, lo que lo hace relativamente autónomo y adecuado para ser reemplazado sin necesidad de realizar cambios significativos en la base de código. La modularidad permitió, en 2014, reemplazar el motor RegExp YARR inicialmente utilizado en Firefox por un fork del motor Irregexp de V8. Irregexp está vinculado a la API de V8, atado al recolector de basura, utiliza una representación de cadenas 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 fue parcialmente reescrito, y los cambios emergentes, como la bandera '\u', se trasladaron cuando fue posible Desafortunadamente, mantener un fork sincronizado es una tarea difícil y su mantenimiento requiere muchos recursos. Con la llegada de nuevas características en el estándar ECMAScript 2018 relacionadas con expresiones regulares, los desarrolladores de Mozilla comenzaron a pensar en cómo simplificar el traslado de cambios desde Irregexp. Como solución, se propuso un concepto de envoltura que permite usar en SpiderMonkey un motor Irregexp casi sin cambios (los cambios se limitan solo a la sustitución automática de bloques "#include").
La envoltura proporciona a Irregexp las capacidades específicas necesarias de V8, incluidas funciones de gestión de memoria y generación de código, así como las estructuras de datos originales que se implementan sobre la base de mecanismos de gestión de memoria, generadores de código y estructuras de SpiderMonkey.
La actualización del motor RegExp permitirá ofrecer en Firefox soporte para características como grupos nombrados (named captures), escape de clases de caracteres Unicode, bandera dotAll y modo Lookbehind:
Обновление RegExp-движка позволит обеспечить в Firefox поддержку таких возможностей, как именованные группы (named captures), экранирование классов Unicode-символов, флаг dotAll и режим Lookbehind:
- que permiten vincular partes de la cadena coincidentes con la expresión regular a nombres específicos en lugar de números ordinales de coincidencias (por ejemplo, en lugar de «/(\d{4})-(\d{2})-(\d{2})/» se puede indicar «/(?\d{4})-(?\d{2})-(?\d{2})/» y acceder al año no a través de result[1], sino a través de result.groups.year).
- Los símbolos Unicode se agregan con la construcción \p{…} y \P{…}, por ejemplo, \p{Number} define todos los caracteres que representan dígitos (incluyendo símbolos como ①), \p{Alphabetic} — letras (incluyendo jeroglíficos), \p{Math} — símbolos matemáticos, etc.
- El flag provoca que la máscara «.» también funcione para caracteres de nueva línea.
- Modo 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, a su vez, trabajaron para reducir la dependencia de Irregexp de V8, y llevaron algunas características que no se pueden implementar en SpiderMonkey a bloques desactivables «#ifdef». La colaboración resultó ser beneficiosa para ambas partes. Por su parte, los desarrolladores de Mozilla incorporaron a Irregexp cambios que eliminan algunas con los requisitos del estándar JavaScript y la calidad del código. También, durante las pruebas de fuzzing en Firefox, se identificaron y corrigieron errores previamente no detectados en el código de Irregexp que provocaban fallos.
Fuente: opennet.ru
