Ingegneri di aziende come Cloudflare, Mozilla, Facebook e Bloomberg un nuovo formato per accelerare la consegna e l'elaborazione del codice JavaScript durante l'apertura dei siti nei browser. BinaryAST sposta la fase di parsing sul server e fornisce già un albero sintattico astratto (). Al ricevimento di BinaryAST, il browser può subito passare alla fase di compilazione, evitando il parsing del codice sorgente JavaScript.
Per il test Implementazione di riferimento, rilasciata sotto licenza MIT. Per il parsing vengono utilizzati componenti di Node.js, mentre il codice per l'ottimizzazione e la generazione dell'AST è scritto in Rust. Su lato browser, il supporto
di BinaryAST è già disponibile in Firefox. Il codificatore in BinaryAST può essere applicato sia a livello di strumenti del sito finale che per l'imballaggio di script di siti esterni sul lato proxy o nella rete di distribuzione dei contenuti. Attualmente è già iniziato il processo di standardizzazione del BinaryAST da parte del gruppo di lavoro , al termine del quale il formato potrà coesistere con i metodi esistenti di compressione dei contenuti, come gzip e brotli.
Un tempo significativo nella lavorazione di JavaScript è rappresentato dalla fase di caricamento e analisi del codice. Considerando che la dimensione del JavaScript caricato su molti siti popolari si avvicina a 10 MB (ad esempio, per LinkedIn sono 7,2 MB, per Facebook 7,1 MB, e per Gmail 3,9 MB), il processamento iniziale di JavaScript causa un ritardo notevole. La fase di analisi nel browser è ulteriormente rallentata a causa dell'impossibilità di costruire correttamente l'AST in tempo reale, 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 le informazioni mancanti necessarie all'analisi degli elementi attuali).
Parzialmente, si cerca di affrontare il problema diffondendo il codice in versioni minimizzate e compresse, oltre che attraverso la memorizzazione nella cache del bytecode generato dal browser. Poiché sui siti moderni il codice viene aggiornato con una certa frequenza, la memorizzazione nella cache risolve solo parzialmente il problema. Una possibile soluzione potrebbe essere WebAssembly, ma richiede l'uso di una tipizzazione esplicita nel codice e non è adatta per accelerare l'elaborazione del codice JavaScript esistente.
Un'altra opzione è la consegna di bytecode precompilato invece di script JavaScript, ma gli sviluppatori dei motori dei browser si oppongono, poiché il bytecode esterno è difficile da verificare, la sua elaborazione diretta può portare a una frammentazione del Web, vengono create ulteriori minacce alla sicurezza e richiede lo sviluppo di un formato di bytecode universale.
BinaryAST si integra nel modello attuale di sviluppo e distribuzione del codice senza creare un nuovo bytecode e senza modificare il linguaggio JavaScript. La dimensione dei dati in formato BinaryAST è comparabile a quella di JavaScript compresso e minificato, mentre la velocità di elaborazione aumenta notevolmente grazie all'esclusione della fase di parsing dei testi sorgente. Inoltre, il formato consente la compilazione in bytecode durante il caricamento di BinaryAST, senza attendere il completamento della ricezione di tutti i dati. Inoltre, il parsing lato server consente di escludere dal rendering di BinaryAST funzioni non utilizzate e codice superfluo, il che risparmia tempo sia durante il parsing nel browser che nella trasmissione di traffico inutile.
Una caratteristica di BinaryAST è la capacità di ripristinare JavaScript leggibile che non corrisponde esattamente alla versione originale, ma è semanticamente equivalente e include gli stessi nomi di variabili e funzioni (BinaryAST conserva i nomi, ma non mantiene le informazioni sulle posizioni nel codice, la formattazione e i commenti). D'altra parte, si presentano nuovi vettori per attacchi, sebbene gli sviluppatori ritengano che siano significativamente inferiori e più controllabili rispetto all'uso di alternative, come la distribuzione del bytecode.
I test del codice di facebook.com hanno dimostrato che l'analisi di JavaScript consuma il 10-15% delle risorse CPU e il parsing richiede più tempo rispetto alla generazione del bytecode e alla creazione iniziale del codice per JIT. Nel motore SpiderMonkey, il tempo di costruzione totale dell'AST è di 500-800 ms e l'uso di BinaryAST ha permesso di ridurre questo valore del 70-90%.
In generale, per la maggior parte dei framework web, l'uso di BinaryAST riduce il tempo di parsing di JavaScript del 3-10% in modalità non ottimizzata e del 90-97% quando viene attivata la modalità di ignorare le funzioni non utilizzate.
Durante l'esecuzione di un pacchetto di test JavaScript di 1,2 Mb, l'uso 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
