Motorul JavaScript utilizat în Firefox, SpiderMonkey la utilizarea unei implementări actualizate a expresiilor regulate, bazată pe codul actual din motorul JavaScript V8, folosit în browsere bazate pe proiectul Chromium. Noua implementare RegExp va fi oferită în versiunea Firefox 78, programată pentru 30 iunie, și va permite browserului să implementeze toate elementele lipsă ECMAScript legate de expresiile regulate.
Se remarcă faptul că motorul RegExp din SpiderMonkey este structurat ca un component separat, ceea ce îl face relativ independent și potrivit pentru înlocuire fără a necesita modificări semnificative în codul sursă. Modularitatea a permis, în 2014, înlocuirea motorului RegExp YARR inițial utilizat în Firefox cu un fork al motorului Irregexp din V8. Irregexp depinde de API-ul V8, este legat de colectorul de gunoi, folosește reprezentări de șiruri și modele de obiecte specifice V8. În procesul de adaptare la API-ul intern SpiderMonkey în 2014, motorul Irregexp a fost parțial rescris, iar modificările apărute, cum ar fi flag-ul ‘\u’, au fost în măsura posibilului în ramura susținută de Mozilla.
Din păcate, menținerea unui fork sincronizat este o sarcină dificilă și întreținerea sa necesită resurse mari. Odată cu apariția noilor funcționalități legate de expresiile regulate în standardul ECMAScript 2018, dezvoltatorii Mozilla s-au gândit cum ar putea simplifica transferul modificărilor din Irregexp. Ca soluție, a fost propusă concepția de legare, care permite utilizarea în SpiderMonkey a motorului Irregexp aproape nemodificat (modificările sunt reduse doar la înlocuirea automată a blocurilor „#include”).
Legătura oferă pentru Irregexp funcționalitățile specifice necesare V8, inclusiv funcții de gestionare a memoriei și generare de cod, precum și structuri de date originale, care sunt implementate pe baza mecanismelor de gestionare a memoriei, generatorilor de cod și structurilor SpiderMonkey.
Actualizarea motorului RegExp va asigura în Firefox suport pentru funcționalități precum grupuri numite (named captures), escaparea claselor de caractere Unicode, flag-ul dotAll și modul Lookbehind:
- permit asocierea părților de șir de caractere potrivite cu expresia regulată cu nume specifice, în loc de numerele ordinale ale potrivirilor (de exemplu, în loc de „/(\d{4})-(\d{2})-(\d{2})/” se poate specifica „/(?\d{4})-(?\d{2})-(?\d{2})/” și se poate accesa anul nu prin result[1], ci prin result.groups.year).
- simbolurilor Unicode adaugă structuri \p{…} și \P{…}, de exemplu, \p{Number} definește toate posibilele caractere care reprezintă cifre (inclusiv simboluri de tip ①), \p{Alphabetic} – litere (inclusiv hieroglife), \p{Math} – simboluri matematice etc.
- Steagul duce la activarea măștii „.” inclusiv pentru caracterele de sfârșit de linie.
- Modul permite definirea într-o expresie regulată astfel încât un șablon să preceadă altul (de exemplu, a potrivi o sumă în dolari fără a captura simbolul dolarului).
Proiectul a fost realizat cu participarea dezvoltatorilor V8, care au lucrat la reducerea dependenței Irregexp de V8 și au mutat anumite caracteristici, imposibil de implementat pe baza SpiderMonkey, în blocuri dezactivabile «#ifdef». Colaborarea s-a dovedit a fi reciproc avantajoasă. Din partea lor, dezvoltatorii Mozilla au transmis în Irregexp modificări care elimină anumite cu cerințele standardului JavaScript și calitatea codului. De asemenea, în timpul testării fuzzing a Firefox au fost identificate și corectate erori anterioare în codul Irregexp care duceau la blocaje.
Sursa: opennet.ro
