Il motore JavaScript SpiderMonkey utilizzato in Firefox per l'uso di una versione aggiornata delle espressioni regolari, basata sul codice attuale del motore JavaScript V8, utilizzato nei browser basati sul progetto Chromium. La nuova implementazione di RegExp sarà proposta nel rilascio di Firefox 78, previsto per il 30 giugno, e permetterà di implementare nel browser tutti gli elementi mancanti di ECMAScript relativi alle espressioni regolari.
Va notato che il motore RegExp in SpiderMonkey è strutturato come un componente separato, rendendolo relativamente indipendente e idoneo a essere sostituito senza necessità di apportare modifiche significative al codice sorgente. La modularità ha consentito nel 2014 di sostituire il motore RegExp YARR inizialmente utilizzato in Firefox con un fork del motore Irregexp di V8. Irregexp è legato all'API di V8, è collegato al garbage collector, utilizza rappresentazioni delle stringhe e modelli ad oggetti specifici di V8. Durante l'adattamento all'API interna di SpiderMonkey nel 2014, il motore Irregexp è stato parzialmente riscritto, e le modifiche emergenti, come il flag '\u', sono state per quanto possibile in un ramo supportato da Mozilla.
Purtroppo, mantenere un fork sincronizzato è un compito difficile e la sua manutenzione richiede molte risorse. Con l'emergere di nuove funzionalità legate alle espressioni regolari nello standard ECMAScript 2018, gli sviluppatori di Mozilla si sono chiesti come semplificare il trasferimento delle modifiche da Irregexp. Come soluzione, è stata proposta una concezione di wrapping, che consente di utilizzare in SpiderMonkey un motore Irregexp quasi invariato (le modifiche si limitano alla sostituzione automatica dei blocchi '#include').
Il wrapping fornisce a Irregexp le necessarie funzionalità specifiche di V8, comprese le funzioni di gestione della memoria e generazione di codice, oltre alle strutture dati originali, realizzate sulla base dei meccanismi di gestione della memoria, dei generatori di codice e delle strutture di SpiderMonkey.
L'aggiornamento del motore RegExp permetterà a Firefox di supportare funzionalità come gruppi nominati (named captures), l'escape di classi di caratteri Unicode, il flag dotAll e la modalità Lookbehind:
- consentono di collegare le parti della stringa corrisposte da espressioni regolari a nomi specifici invece che a numeri di occorrenza (ad esempio, invece di «\/(\d{4})-(\d{2})-(\d{2})\/» si può specificare «\/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})\/» e accedere all'anno non tramite result[1], ma attraverso result.groups.year).
- I caratteri Unicode sono aggiunti dalle costruzioni \p{…} e \P{…}, ad esempio, \p{Number} definisce tutti i possibili segni con immagini di numeri (inclusi simboli come ①), \p{Alphabetic} — lettere (incluse le ideogrammi), \p{Math} — simboli matematici e così via.
- Bandiera fa sì che la maschera «.» funzioni anche per i caratteri di fine riga.
- Modalità consente di definire in un'espressione regolare che un modello precede un altro (ad esempio, corrispondere l'importo in dollari senza catturare il simbolo del dollaro).
Il progetto è stato realizzato con la partecipazione degli sviluppatori di V8, che da parte loro hanno lavorato per ridurre la dipendenza di Irregexp da V8, portando alcune peculiarità che non possono essere implementate su base SpiderMonkey in blocchi disattivabili «#ifdef». La cooperazione si è rivelata reciprocamente vantaggiosa. Gli sviluppatori di Mozilla hanno trasferito in Irregexp le modifiche che risolvono alcune con i requisiti dello standard JavaScript e la qualità del codice. Inoltre, durante i test di fuzzing di Firefox, sono stati individuati e corretti errori precedentemente non rilevati nel codice di Irregexp, che portavano a crash.
Fonte: opennet.ru
