O motor JavaScript SpiderMonkey usado no Firefox para usar uma implementação atualizada de expressões regulares, baseada em código recente do motor JavaScript V8, usado em navegadores baseados no projeto Chromium. A nova implementação RegExp será proposta na versão do Firefox 78, programada para 30 de junho, e permitirá implementar no navegador todos os recursos ausentes do ECMAScript relacionados a expressões regulares.
Observa-se que o motor RegExp no SpiderMonkey está estruturado como um componente separado, o que o torna relativamente independente e adequado para substituições sem a necessidade de grandes alterações na base de código. A modularidade permitiu, em 2014, substituir o motor RegExp YARR inicialmente usado no Firefox por um fork do motor Irregexp do V8. O Irregexp está vinculado à API do V8, dependendo do coletor de lixo, e utiliza uma representação de strings e um modelo de objeto específicos do V8. No processo de adaptação à API interna do SpiderMonkey em 2014, o motor Irregexp foi parcialmente reescrito, e as mudanças que surgiram, como a flag '\u', foram para um branch mantido pela Mozilla.
Infelizmente, manter um fork sincronizado é uma tarefa difícil e sua manutenção requer muitos recursos. Com a introdução de novos recursos relacionados a expressões regulares no padrão ECMAScript 2018, os desenvolvedores da Mozilla estão considerando como simplificar a transferência de mudanças do Irregexp. Como solução, foi proposta a ideia de um wrapper, que permite usar no SpiderMonkey um motor Irregexp quase inalterado (as mudanças se restringem apenas à substituição automática de blocos '#include').
O wrapper fornece ao Irregexp as funcionalidades específicas do V8 necessárias, incluindo gerenciamento de memória e geração de código, bem como as estruturas de dados originais que são implementadas com base nos mecanismos de gerenciamento de memória, geradores de código e estruturas do SpiderMonkey.
A atualização do motor RegExp permitirá que o Firefox suporte recursos como grupos nomeados (named captures), escape de classes de caracteres Unicode, flag dotAll e modo Lookbehind:
- permitem vincular partes da string correspondidas pela expressão regular a nomes específicos em vez de números de sequência (por exemplo, em vez de "/(\d{4})-(\d{2})-(\d{2})/" pode-se usar "/(?\d{4})-(?\d{2})-(?\d{2})/" e acessar o ano não através de result[1], mas através de result.groups.year).
- Os caracteres Unicode adicionam as construções \p{…} e \P{…}, por exemplo, \p{Number} define todos os possíveis caracteres que representam números (incluindo caracteres como ①), \p{Alphabetic} — letras (incluindo hieróglifos), \p{Math} — símbolos matemáticos, etc.
- A bandeira faz com que a máscara «.» corresponda também a caracteres de nova linha.
- Modo permite determinar em uma expressão regular que um padrão precede outro (por exemplo, corresponder a uma soma em dólares sem capturar o símbolo do dólar).
O projeto foi realizado com a participação dos desenvolvedores do V8, que, por sua vez, trabalharam na redução da dependência do Irregexp em relação ao V8, isolando algumas características que não podiam ser implementadas com o SpiderMonkey em blocos desativáveis "#ifdef". A colaboração se revelou mutuamente benéfica. Da sua parte, os desenvolvedores da Mozilla enviaram para o Irregexp alterações que resolveram algumas com os requisitos do padrão JavaScript e a qualidade do código. Além disso, durante os testes de fuzzing no Firefox, erros que antes não haviam sido detectados no código do Irregexp, levando a falhas, foram identificados e corrigidos.
Fonte: opennet.ru
