Mozilla-ն անցավ Chromium-ի հետ սովորական արտահայտման շարժիչի օգտագործմանը

Firefox-ի SpiderMonkey JavaScript շարժիչը թարգմանված օգտագործել կանոնավոր արտահայտությունների թարմացված կատարում՝ հիմնված ընթացիկ կոդի վրա Irregexp V8 JavaScript շարժիչից, որն օգտագործվում է Chromium նախագծի հիման վրա բրաուզերներում: RegExp-ի նոր ներդրումը կառաջարկվի Firefox 78-ի հունիսի 30-ի թողարկումում, որը թույլ կտա զննարկիչին ներդնել կանոնավոր արտահայտությունների հետ կապված բոլոր բացակայող ECMAScript տարրերը:

Նշվում է, որ SpiderMonkey-ում RegExp շարժիչը նախագծված է որպես առանձին բաղադրիչ, ինչը այն դարձնում է համեմատաբար անկախ և հարմար փոխարինման համար՝ առանց կոդի բազայում էական փոփոխություններ կատարելու անհրաժեշտության։ Մոդուլյարությունը թույլ տվեց 2014 թվականին փոխարինել YARR RegExp շարժիչը, որն ի սկզբանե օգտագործվում էր Firefox-ում V8-ից Irregexp շարժիչի պատառաքաղով: Irregexp-ը կապված է V8 API-ի հետ, կապված է աղբի հավաքիչի հետ, օգտագործում է V8-ի հատուկ լարային ներկայացում և օբյեկտի մոդել: 2014 թվականին SpiderMonkey-ի ներքին API-ին հարմարվելու գործընթացում Irregexp շարժիչը մասամբ վերաշարադրվել է, և երևացող փոփոխությունները, օրինակ՝ «\u» դրոշը, որտեղ հնարավոր է: դիմացավ դեպի պատառաքաղ, որը պահպանվում է Mozilla-ի կողմից:

Ցավոք սրտի, սինխրոն պատառաքաղի պահպանումը դժվար է և պահանջում է մեծ ռեսուրսներ դրա պահպանման համար: ECMAScript 2018 ստանդարտում կանոնավոր արտահայտությունների հետ կապված նոր գործառույթների ներդրմամբ Mozilla-ի մշակողները սկսեցին մտածել այն մասին, թե ինչպես կարող են հեշտությամբ տեղափոխել փոփոխությունները Irregexp-ից: Որպես ելք առաջարկվեց կապի հայեցակարգը, որը թույլ է տալիս օգտագործել գրեթե անփոփոխ Irregexp շարժիչը SpiderMonkey-ում (փոփոխությունները վերաբերում են միայն «#include» բլոկների ավտոմատ փոխարինմանը):

Mozilla-ն անցավ Chromium-ի հետ սովորական արտահայտման շարժիչի օգտագործմանը

Պարտադիրը Irregexp-ին տրամադրում է V8-ին հատուկ անհրաժեշտ հատկանիշներ, ներառյալ հիշողության կառավարման և կոդի ստեղծման գործառույթները, ինչպես նաև տվյալների նախնական կառուցվածքները, որոնք իրականացվում են հիշողության կառավարման մեխանիզմների, կոդերի գեներատորների և SpiderMonkey կառուցվածքների հիման վրա:

RegExp շարժիչի թարմացումը թույլ կտա Firefox-ին աջակցել այնպիսի գործառույթների, ինչպիսիք են անվանական նկարները, Unicode-ի նիշերի դասերից խուսափելը, dotAll դրոշը և Lookbehind ռեժիմը.

  • Անվանված խմբեր թույլ է տալիս կանոնավոր արտահայտությամբ համընկնող տողի մասերը կապել որոշակի անունների հետ համընկնումների սերիական համարների փոխարեն (օրինակ՝ «/(\d{4})-(\d{2})-(\d{-ի փոխարեն: 2})/" կարող եք նշել "/( ? \d{4}) - (? \d{2})-(? \d{2})/" և մուտք գործեք տարի ոչ թե result[1], այլ result.groups.year միջոցով):
  • Դասերից փախչող Յունիկոդի նիշերն ավելացնում են \p{…} և \P{…} կառուցվածքները, օրինակ, \p{Number}-ը սահմանում է բոլոր հնարավոր նիշերը թվերի պատկերով (ներառյալ ① նիշերը), \p{Այբբենական} - տառերը (ներառյալ հիերոգլիֆներ ), \p{Math} — մաթեմատիկական նշաններ և այլն։
  • Դրոշ dotAll առաջացնում է դիմակ "." ներառյալ նոր տող նիշերը:
  • Ռեժիմը Ետ նայիր թույլ է տալիս կանոնավոր արտահայտությամբ որոշել, որ մի օրինաչափություն նախորդում է մյուսին (օրինակ՝ համընկնել դոլարի գումարի հետ՝ առանց դոլարի նշանը գրավելու):

Նախագիծն իրականացվել է V8 ծրագրավորողների մասնակցությամբ, որոնք, իրենց հերթին, աշխատել են նվազեցնել Irregexp-ի կախվածությունը V8-ից և որոշ գործառույթներ, որոնք հնարավոր չէ իրականացնել SpiderMonkey-ի հիման վրա, տեղափոխել են հաշմանդամ «#ifdef» բլոկներ։ Համագործակցությունը փոխշահավետ էր։ Իրենց հերթին, Mozilla-ի մշակողները փոփոխություններ են ներկայացրել Irregexp-ում, որոնք վերացնում են որոշները անհամապատասխանություններ JavaScript ստանդարտի պահանջներով և բարելավվելով կոդի որակը: Նաև Firefox-ի fuzzing թեստավորման ժամանակ հայտնաբերվել և ուղղվել են Irregexp կոդի նախկինում չնկատված սխալներ, որոնք հանգեցնում են խափանումների:

Source: opennet.ru

Добавить комментарий