Mozilla è passata all'utilizzo di un comune motore di espressioni regolari con Chromium

Motore JavaScript SpiderMonkey di Firefox tradotto per utilizzare un'implementazione aggiornata delle espressioni regolari basata sul codice corrente Irregexp dal motore JavaScript V8 utilizzato nei browser basati sul progetto Chromium. Una nuova implementazione di RegExp sarà proposta nella versione del 78 giugno di Firefox 30 e consentirà al browser di implementare tutti gli elementi ECMAScript mancanti relativi alle espressioni regolari.

Va notato che il motore RegExp in SpiderMonkey è progettato come un componente separato, il che lo rende relativamente indipendente e adatto alla sostituzione senza la necessità di apportare modifiche significative al codice base. La modularità ha consentito nel 2014 di sostituire il motore YARR RegExp originariamente utilizzato in Firefox con un fork del motore Irregexp da V8. Irregexp è legato all'API V8, legato al garbage collector, utilizza la rappresentazione di stringhe e il modello a oggetti specifici di V8. Nel processo di adattamento all'API interna di SpiderMonkey nel 2014, il motore Irregexp è stato parzialmente riscritto e le modifiche visualizzate, come il flag '\u', ove possibile sopportato a un fork gestito da Mozilla.

Sfortunatamente, mantenere un fork sincronizzato è difficile e richiede molte risorse. Con l'introduzione di nuove funzionalità relative alle espressioni regolari nello standard ECMAScript 2018, gli sviluppatori di Mozilla hanno iniziato a pensare a come trasferire facilmente le modifiche da Irregexp. Come soluzione è stato proposto il concetto di associazione, che consente di utilizzare il motore Irregexp quasi invariato in SpiderMonkey (le modifiche si riducono solo alla sostituzione automatica dei blocchi “#include”).

Mozilla è passata all'utilizzo di un comune motore di espressioni regolari con Chromium

L'associazione fornisce a Irregexp le necessarie funzionalità specifiche della V8, comprese le funzioni di gestione della memoria e di generazione del codice, nonché strutture di dati iniziali che vengono implementate sulla base di meccanismi di gestione della memoria, generatori di codice e strutture SpiderMonkey.

Un aggiornamento al motore RegExp consentirà a Firefox di supportare funzionalità come acquisizioni con nome, escape delle classi di caratteri Unicode, il flag dotAll e la modalità Lookbehind:

  • Gruppi nominati consentono di associare parti di una stringa a cui corrisponde un'espressione regolare con determinati nomi anziché numeri seriali di corrispondenze (ad esempio, invece di "/(\d{4})-(\d{2})-(\d{ 2})/" è possibile specificare "/( ? \d{4})-(? \d{2})-(? \d{2})/" e accedi all'anno non tramite result[1], ma tramite result.groups.year).
  • Fuggire dalle lezioni I caratteri Unicode aggiungono i costrutti \p{…} e \P{…}, ad esempio, \p{Number} definisce tutti i caratteri possibili con l'immagine dei numeri (inclusi caratteri come ①), \p{Alphabetic} - lettere (inclusi geroglifici ), \p{Math} — simboli matematici, ecc.
  • bandiera puntoTutto provoca la maschera "." compresi i caratteri di nuova riga.
  • regime Guarda dietro consente di determinare in un'espressione regolare che un modello precede un altro (ad esempio, corrispondere a un importo in dollari senza acquisire il simbolo del dollaro).

Il progetto è stato realizzato con la partecipazione degli sviluppatori V8, che, da parte loro, hanno lavorato per ridurre la dipendenza di Irregexp da V8, e hanno spostato alcune funzionalità che non possono essere implementate sulla base di SpiderMonkey in blocchi "#ifdef" disabilitati. La collaborazione si è rivelata reciprocamente vantaggiosa. Da parte loro, gli sviluppatori di Mozilla hanno presentato modifiche a Irregexp che ne eliminano alcune incongruenze con i requisiti dello standard JavaScript e migliorando qualità del codice. Inoltre, durante il test fuzzing di Firefox, sono stati identificati e corretti errori precedentemente non rilevati nel codice Irregexp, che portavano a arresti anomali.

Fonte: opennet.ru

Aggiungi un commento