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

Ingegneri di Cloudflare, Mozilla, Facebook e Bloomberg offerta nuovo formato binarioAST per accelerare la consegna e l'elaborazione del codice JavaScript quando si aprono siti in un browser. BinaryAST sposta la fase di analisi sul lato server e fornisce un albero di sintassi astratto già generato (AST). Dopo aver ricevuto un BinaryAST, il browser può procedere immediatamente alla fase di compilazione, ignorando l'analisi del codice sorgente JavaScript.

Per i test preparato implementazione di riferimento fornita sotto licenza MIT. I componenti Node.js vengono utilizzati per l'analisi e il codice per l'ottimizzazione e la generazione di AST è scritto in Rust. Supporto lato browser
BinaryAST è già disponibile in costruzioni notturne Firefox. Il codificatore in BinaryAST può essere utilizzato sia a livello di strumenti del sito finale che per creare pacchetti di script di siti esterni sul lato di un proxy o di una rete di distribuzione dei contenuti. Attualmente il processo di standardizzazione di BinaryAST da parte del gruppo di lavoro è già iniziato ECMATC39, dopodiché il formato potrà coesistere con i metodi di compressione dei contenuti esistenti, come 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

Durante l'elaborazione di JavaScript, viene spesa una notevole quantità di tempo nella fase di caricamento e analisi del codice. Considerando che il volume di JavaScript scaricato su molti siti popolari è vicino a 10 MB (ad esempio, per LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), l'elaborazione iniziale di JavaScript introduce un ritardo significativo. Anche la fase di analisi lato browser è rallentata a causa dell'impossibilità di costruire completamente l'AST al volo mentre il codice viene caricato (il browser deve attendere il completamento del caricamento dei blocchi di codice, come la fine delle funzioni, per ottenere le informazioni mancanti per analizzare gli elementi correnti).

Stanno cercando di risolvere parzialmente il problema distribuendo il codice in una forma ridotta e compressa, nonché memorizzando nella cache il bytecode generato dal browser. Sui siti moderni, il codice viene aggiornato abbastanza spesso, quindi la memorizzazione nella cache risolve solo parzialmente il problema. WebAssembly potrebbe essere una soluzione, ma richiede la digitazione esplicita del codice e non è adatto per accelerare l'elaborazione del codice JavaScript esistente.

Un'altra opzione è quella di fornire bytecode compilato già pronto invece di script JavaScript, ma gli sviluppatori di motori di browser sono contrari perché il bytecode di terze parti è difficile da verificare, la sua elaborazione diretta può portare alla stratificazione del Web, insorgono ulteriori rischi per la sicurezza e lo sviluppo di bytecode compilati già pronti anziché script JavaScript. è richiesto un formato bytecode universale.

BinaryAST ti consente di adattarti al tuo attuale modello di sviluppo e distribuzione del codice senza creare nuovo bytecode o modificare il linguaggio JavaScript. La dimensione dei dati nel formato BinaryAST è paragonabile al codice JavaScript minimizzato compresso e la velocità di elaborazione grazie all'eliminazione della fase di analisi del testo sorgente aumenta notevolmente. Inoltre, il formato consente la compilazione in bytecode quando viene caricato BinaryAST, senza attendere il completamento di tutti i dati. Inoltre, l'analisi lato server consente di escludere funzioni inutilizzate e codice non necessario dalla rappresentazione BinaryAST restituita, il che, durante l'analisi lato browser, fa perdere tempo sia nell'analisi che nella trasmissione di traffico non necessario.

Una caratteristica di BinaryAST è anche la capacità di ripristinare JavaScript leggibile che non è esattamente uguale alla versione originale, ma è semanticamente equivalente e include gli stessi nomi di variabili e funzioni (BinaryAST salva i nomi, ma non salva le informazioni sulle posizioni nel file codice, formattazione e commenti). L’altro lato della medaglia è l’emergere di nuovi vettori di attacco, ma secondo gli sviluppatori sono molto più piccoli e più controllabili rispetto a quando si utilizzano alternative, come la distribuzione del bytecode.

I test del codice facebook.com hanno dimostrato che l'analisi di JavaScript consuma il 10-15% delle risorse della CPU e l'analisi richiede più tempo rispetto alla generazione del bytecode e alla generazione iniziale del codice per JIT. Nel motore SpiderMonkey, il tempo per costruire completamente un AST richiede 500-800 ms e l'uso di BinaryAST ha ridotto questa cifra del 70-90%.
In generale, per la maggior parte dei fuochi d'artificio web, quando si utilizza BinaryAST, il tempo di analisi JavaScript viene ridotto del 3-10% nella modalità senza ottimizzazione e del 90-97% quando è abilitata la modalità di ignoranza delle funzioni inutilizzate.
Durante l'esecuzione di un set di test JavaScript da 1.2 MB, l'utilizzo di BinaryAST ha consentito di accelerare 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

Aggiungi un commento