Inginerii de la companiile Cloudflare, Mozilla, Facebook și Bloomberg un nou format pentru a accelera livrarea și procesarea codului JavaScript atunci când se deschid site-uri în browser. BinaryAST externalizează faza de analiză sintactică pe server și furnizează deja un arbore sintactic abstract format (). La primirea BinaryAST, browserul poate trece imediat la etapa de compilare, sărind peste analiza codului sursă JavaScript.
Pentru testare o implementare de referință, furnizată sub licența MIT. Pentru analiză se folosesc componente Node.js, iar codul pentru optimizarea și formarea AST este scris în limbajul Rust. Pe partea browserelor, suportul
BinaryAST este deja disponibil în Firefox. Codificatorul din BinaryAST poate fi aplicat atât la nivelul instrumentarului site-ului final, cât și pentru ambalarea scripturilor site-urilor externe de partea unui proxy sau a unei rețele de livrare a conținutului. În prezent, a început deja procesul de standardizare a BinaryAST de către grupul de lucru , după finalizarea căruia formatul va putea coexista alături de metodele existente de comprimare a conținutului livrat, cum ar fi gzip și brotli.
Un timp semnificativ în procesarea JavaScript este consumat de faza de încărcare și analiză sintactică a codului. Având în vedere că volumul de JavaScript încărcat pe multe site-uri populare se apropie de 10 MB (de exemplu, pentru LinkedIn - 7.2MB, Facebook - 7.1MB, Gmail - 3.9MB), procesarea inițială a JavaScript-ului aduce întârzieri semnificative. Etapa de analiză pe partea browserului este de asemenea încetinită din cauza imposibilității de a construi complet AST în timp real, pe măsură ce codul este încărcat (browserul trebuie să aștepte finalizarea încărcării blocurilor de cod, de exemplu, sfârșitul funcțiilor, pentru a obține informațiile necesare pentru analizarea elementelor curente).
Parțial, problema este abordată prin distribuirea codului într-o formă minimizată și comprimată, precum și prin stocarea în cache de către browser a codului byte generat. Pe site-urile moderne, codul este actualizat destul de frecvent, astfel încât stocarea în cache rezolvă doar parțial problema. O soluție ar putea fi WebAssembly, dar necesită utilizarea tipizării explicite în cod și nu este potrivit pentru accelerarea procesării codului existent pe JavaScript.
O altă opțiune este livrarea codului byte compilat gata, în loc de scripturi JavaScript, însă dezvoltatorii motoarelor de browser se opun, deoarece bytecode-ul terț este greu de verificat, procesarea sa directă poate duce la fragmentarea web-ului, apar amenințări suplimentare la adresa securității și este necesară dezvoltarea unui format de bytecode universal.
BinaryAST se integrează în modelul actual de dezvoltare și livrare a codului fără a crea un nou bytecode și fără a modifica limbajul JavaScript. Dimensiunea datelor în format BinaryAST este comparabilă cu JavaScript-ul comprimat și minificat, iar viteza de procesare crește semnificativ datorită excluderii etapei de analiză a textelor sursă. În plus, formatul permite compilarea în bytecode pe măsură ce se încarcă BinaryAST, fără a aștepta finalizarea primirii tuturor datelor. De asemenea, analiza pe partea serverului permite excluderea din reprezentarea livrată a funcțiilor neutilizate și a codului inutil, pentru care analiza pe partea browserului consumă timp atât pentru analiză, cât și pentru transmiterea unui trafic suplimentar.
O caracteristică a BinaryAST este și posibilitatea de a restaura JavaScript-ul lizibil care nu coincide 1:1 cu varianta originală, ci este echivalent semnatic și include aceleași nume de variabile și funcții (BinaryAST păstrează numele, dar nu păstrează informațiile despre pozițiile în cod, formatarea și comentariile). Latura negativă a medaliei este apariția de noi vectori pentru atacuri, dar, conform dezvoltatorilor, aceștia sunt semnificativ mai reduși și mai controlați decât în cazul utilizării alternativelor, cum ar fi distribuția bytecode-ului.
Testele de cod facebook.com au arătat că pentru analiza JavaScript se consumă 10-15% din resursele CPU și că analiza durează mai mult decât generarea bytecode-ului și formarea inițială a codului pentru JIT. În motorul SpiderMonkey, timpul necesar pentru construirea completă a AST este de 500-800 ms, iar utilizarea BinaryAST a permis reducerea acestui timp cu 70-90%.
În general, pentru majoritatea framework-urilor web, utilizarea BinaryAST reduce timpul de analiză JavaScript cu 3-10% în modul fără optimizare și cu 90-97% atunci când se activează modul de ignorare a funcțiilor neutilizate.
În timpul testării unui set JavaScript de 1,2 MB, utilizarea BinaryAST a permis reducerea timpului de pornire de la 338 la 314 ms pe un sistem desktop (Intel i7) și de la 2019 la 1455 ms pe un dispozitiv mobil (HTC One M8).
Sursa: opennet.ro
