Inxhinierët nga kompanitë Cloudflare, Mozilla, Facebook dhe Bloomberg formati i ri për të përshpejtuar dërgimin dhe përpunimin e kodit JavaScript kur hapen faqet në shfletues. BinaryAST e shtyn fazën e analizës sintaksore në anën e serverit dhe ofron një pemë përfaqësuese të sintaksës (). Kur merr BinaryAST, shfletuesi mund të kalojë menjëherë në fazën e kompilimit, duke shmangur parsimimin e kodit burimor JavaScript.
Për testimin një implementim referencë, i ofruar nën licencën MIT. Për parsimimin përdoren komponentët e Node.js, ndërsa kodi për optimizimin dhe formimin e AST është shkruar në gjuhën Rust. Nga ana e shfletuesve, mbështetje
BinaryAST është tashmë e disponueshme në të Firefox. Koduesi në BinaryAST mund të përdoret si në nivelin e instrumenteve të faqes finale, ashtu edhe për paketimin e skripteve të faqeve të jashtme në anën e proxy-t ose rrjetit të shpërndarjes së përmbajtjes. Aktualisht, procesi i standardizimit të BinaryAST ka filluar nga grupi i punës , pas përfundimit të saj formati do të mund të bashkëjetojë me metodat ekzistuese të kompresimit të përmbajtjes, si gzip dhe brotli.
Një kohë e konsiderueshme gjatë përpunimit të JavaScript-it merret nga faza e ngarkesës dhe analizës sintaksore të kodit. Duke pasur parasysh se sasia e JavaScript-it të ngarkuar në shumë faqe të njohura arrin afërsisht në 10 MB (për shembull, për LinkedIn - 7.2MB, Facebook - 7.1MB, Gmail - 3.9MB), përpunimi fillestar i JavaScript-it sjell një shtesë të konsiderueshme vonese. Faza e analizës në anën e shfletuesit gjithashtu ngadalësohet për shkak të pamundësisë për të ndërtuar AST-në në fluks, me kalimin e ngarkesës së kodit (shfletuesi duhet të presë përfundimin e ngarkesës së blloqeve të kodit, për shembull fundin e funksioneve, për të marrë informacionin e nevojshëm për analizën e elementeve aktuale).
Një zgjidhje për këtë problem është të shpërndahet kodi në një formë të minimizuar dhe të kompresuar, si dhe duke ndihmuar në memorizimin e kodit të gjeneruar nga shfletuesi. Në faqet moderne, kodi përditësohet mjaft shpesh, prandaj memorizimi ofron vetëm një zgjidhje të pjesshme. Një alternativë mund të ishte WebAssembly, por ai kërkon përdorimin e tipizimit të qartë në kod dhe nuk është shumë efektiv për akcelerimin e përpunimit të kodit ekzistues në JavaScript.
Një tjetër opsion është dërgimi i kodit të gatshëm të kompiluar në vend të skriptave JavaScript, por zhvilluesit e motorëve të shfletuesit janë kundër, pasi kodi i jashtëm është i vështirë për t'u verifikuar, përpunimi i tij direkt mund të çojë në ndarjen e Web-it, krijon kërcënime shtesë për sigurinë dhe kërkon zhvillimin e një formati universale për kodin e kompiluar.
BinaryAST i lejon për të përshtatur në modelin aktual të zhvillimit dhe shpërndarjes së kodit pa krijuar një kod bajt dhe pa ndryshuar gjuhën JavaScript. Madhësia e të dhënave në formatin BinaryAST është e krahasueshme me JavaScript-in e ngjeshur dhe të minifikuar, dhe shpejtësia e procesimit rritet ndjeshëm duke përjashtuar fazën e analizës së teksteve burimore. Për më tepër, formati lejon përpunimin në kod bajt gjatë ngarkimit të BinaryAST, pa pritur për të përfunduar marrjen e të gjitha të dhënave. Gjithashtu, analizimi në anën e serverit lejon përjashtimin e funksioneve të papërdorura dhe kodit të panevojshëm nga përfaqësimi i dhënë nga BinaryAST, duke kursyer kohë gjatë analizimit në anën e shfletuesit, si për analizim, ashtu edhe për transmetimin e trafikut të panevojshëm.
Një karakteristikë e BinaryAST është gjithashtu mundësia për të rikuperuar JavaScript të lexueshëm që nuk është përputhës exact me versionin origjinal, por është semantikisht ekuivalent dhe përfshin të njëjtat emra variablash dhe funksionesh (BinaryAST ruan emrat, por nuk mban informacion mbi pozitat në kod, formatimin dhe komentet). Anë negative është shfaqja e vektorëve të rinj për sulme, por sipas zhvilluesve, ato janë ndjeshëm më të pakta dhe më të kontrollueshme se sa me përdorimin e alternativave, të tilla si shpërndarja e bajtkodit.
Testet e kodit në facebook.com treguan se përpunimi i JavaScript merr 10-15% të burimeve të CPU dhe për analizën merr më shumë kohë se sa për krijimin e bajtkodit dhe formimin fillestar të kodit për JIT. Në motorin SpiderMonkey, koha e ndërtimit të plotë të AST është 500-800 ms dhe përdorimi i BinaryAST mundësoi reduktimin e këtij treguesi me 70-90%.
Në përgjithësi, për shumicën e framework-eve web, përdorimi i BinaryAST redukton kohën e analizës JavaScript me 3-10% në mënyrën pa optimizim dhe me 90-97% kur është aktivizuar mënyra e injorimit të funksioneve të pa përdorura.
Gjatë testimit të setit JavaScript me përmasa 1.2 MB, përdorimi i BinaryAST ndihmoi për të shkurtuar kohën e nisjes nga 338 në 314 ms në sistemin desktop (Intel i7) dhe nga 2019 në 1455 ms në një pajisje mobile (HTC One M8).
Burimi: opennet.ru
