Cloudflare, Mozilla e Facebook sviluppano BinaryAST per accelerare il caricamento di JavaScript

Ingegneri delle aziende Cloudflare, Mozilla, Facebook e Bloomberg hanno proposto nuovo formato BinaryAST per accelerare la consegna e l'elaborazione del codice JavaScript durante l'apertura dei siti nel browser. BinaryAST sposta la fase di analisi sintattica sul server e fornisce già un albero sintattico astratto (AST). Al ricevimento di BinaryAST, il browser può immediatamente passare alla fase di compilazione, saltando il parsing del codice sorgente JavaScript.

Per il testing è stata preparata una implementazione di riferimento, fornita sotto licenza MIT. Per l'analisi si utilizzano componenti di Node.js, mentre il codice per l'ottimizzazione e la formazione dell'AST è scritto in Rust. Sul lato dei browser, il supporto
per BinaryAST è già disponibile in versioni notturne Firefox. Il codificatore in BinaryAST può essere utilizzato sia a livello di strumenti del sito finale, sia per confezionare script di siti esterni sul lato proxy o della rete di distribuzione dei contenuti. Attualmente è già iniziato il processo di standardizzazione di BinaryAST da parte del gruppo di lavoro ECMA TC39, dopo il quale il formato potrà coesistere con i metodi esistenti di compressione dei contenuti forniti, quali gzip e brotli.

Cloudflare, Mozilla e Facebook sviluppano BinaryAST per accelerare il caricamento di JavaScript

Cloudflare, Mozilla e Facebook sviluppano BinaryAST per accelerare il caricamento di JavaScript

Un tempo significativo nell'elaborazione del JavaScript è occupato dalla fase di caricamento e analisi del codice. Considerando che il volume di JavaScript caricato su molti siti popolari si avvicina a 10 MB (ad esempio per LinkedIn — 7.2MB, Facebook — 7.1MB, Gmail — 3.9MB), il trattamento iniziale del JavaScript introduce un notevole ritardo. La fase di parsing sul lato del browser è anche rallentata a causa dell'impossibilità di costruire completamente l'AST al volo, man mano che il codice viene caricato (il browser deve attendere il completamento del caricamento dei blocchi di codice, come la fine delle funzioni, per ottenere informazioni necessarie per analizzare gli elementi attuali).

Parzialmente il problema viene cercato di risolvere attraverso la diffusione del codice in forma minimizzata e compressa, nonché mediante l'utilizzo della cache del bytecode generato dal browser. Nei siti moderni, il codice viene aggiornato abbastanza spesso, quindi la cache risolve solo parzialmente il problema. Una soluzione potrebbe essere rappresentata da WebAssembly, ma richiede l'uso di tipizzazione esplicita nel codice e non si presta bene ad accelerare l'elaborazione del codice JavaScript già esistente.

Un'altra opzione è la consegna di bytecode compilato pronto invece che di script JavaScript, ma gli sviluppatori dei motori dei browser si oppongono, poiché il bytecode di terzi è difficile da verificare, la sua elaborazione diretta può portare a un frazionamento del Web, emergono ulteriori minacce alla sicurezza e richiede lo sviluppo di un formato di bytecode universale.

BinaryAST consente di integrarsi nel modello attuale di sviluppo e distribuzione del codice senza creare un nuovo bytecode e senza modificare il linguaggio JavaScript. La dimensione dei dati nel formato BinaryAST è paragonabile al codice JavaScript compresso e minimizzato, e la velocità di elaborazione aumenta notevolmente grazie all'esclusione della fase di parsing dei testi sorgente. Inoltre, il formato consente di eseguire la compilazione in bytecode man mano che viene caricato BinaryAST, senza attendere il completamento del download di tutti i dati. Infine, il parsing lato server consente di escludere dalla rappresentazione restituita dal BinaryAST funzioni inutilizzate e codice superfluo, il cui parsing lato browser richiede tempo sia per l'analisi che per la trasmissione di traffico eccessivo.

Una caratteristica del BinaryAST è anche la possibilità di ricostruire JavaScript leggibile che non è identico all'originale, ma semanticamente equivalente e include gli stessi nomi di variabili e funzioni (BinaryAST conserva i nomi, ma non conserva informazioni sulle posizioni nel codice, formattazione e commenti). Il rovescio della medaglia è la comparsa di nuovi vettori per attacchi, ma secondo gli sviluppatori, sono significativamente meno e più controllabili rispetto all'uso di alternative, come la diffusione del bytecode.

I test del codice di facebook.com hanno mostrato che l'analisi di JavaScript richiede il 10-15% delle risorse CPU e il parsing richiede più tempo rispetto alla generazione di bytecode e alla creazione iniziale del codice per JIT. Nel motore SpiderMonkey, il tempo totale per costruire l'AST è di 500-800 ms e l'applicazione di BinaryAST ha permesso di ridurre questo indicatore del 70-90%.
In generale, per la maggior parte dei framework web, l'implementazione di BinaryAST riduce il tempo di parsing di JavaScript del 3-10% in modalità senza ottimizzazione e del 90-97% attivando la modalità di ignorare le funzioni non utilizzate.
Durante l'esecuzione di un set di test JavaScript di 1,2 MB, l'applicazione di BinaryAST ha consentito di ridurre il tempo di avvio da 338 a 314 ms su un sistema desktop (Intel i7) e da 2019 a 1455 ms su un dispositivo mobile (HTC One M8).

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster