Το Cloudflare, η Mozilla και το Facebook αναπτύσσουν το BinaryAST για να επιταχύνουν τη φόρτωση JavaScript

Μηχανικοί από τις Cloudflare, Mozilla, Facebook και Bloomberg προσφέρεται νέα μορφή Δυαδικό για να επιταχύνετε την παράδοση και την επεξεργασία του κώδικα JavaScript κατά το άνοιγμα τοποθεσιών στο πρόγραμμα περιήγησης. Το BinaryAST μετακινεί τη φάση ανάλυσης στην πλευρά του διακομιστή και παρέχει ένα ήδη δημιουργημένο αφηρημένο δέντρο σύνταξης (AST). Με τη λήψη ενός BinaryAST, το πρόγραμμα περιήγησης μπορεί να προχωρήσει αμέσως στο στάδιο της μεταγλώττισης, παρακάμπτοντας την ανάλυση του πηγαίο κώδικα JavaScript.

Για δοκιμή έτοιμος υλοποίηση αναφοράς που παρέχεται βάσει της άδειας MIT. Τα στοιχεία Node.js χρησιμοποιούνται για ανάλυση και ο κώδικας για τη βελτιστοποίηση και τη δημιουργία AST είναι γραμμένος σε Rust. Υποστήριξη από την πλευρά του προγράμματος περιήγησης
Το BinaryAST είναι ήδη διαθέσιμο σε νυχτερινή συνέλευση Firefox. Ο κωδικοποιητής στο BinaryAST μπορεί να χρησιμοποιηθεί τόσο στο επίπεδο εργαλείων τελικής τοποθεσίας όσο και για τη συσκευασία σεναρίων εξωτερικών τοποθεσιών στο πλάι ενός διακομιστή μεσολάβησης ή ενός δικτύου παράδοσης περιεχομένου. Επί του παρόντος, η διαδικασία τυποποίησης του BinaryAST από την ομάδα εργασίας έχει ήδη ξεκινήσει ECMA TC39, μετά την οποία η μορφή θα μπορεί να συνυπάρχει με τις υπάρχουσες μεθόδους συμπίεσης περιεχομένου, όπως το gzip και το brotli.

Το Cloudflare, η Mozilla και το Facebook αναπτύσσουν το BinaryAST για να επιταχύνουν τη φόρτωση JavaScript

Το Cloudflare, η Mozilla και το Facebook αναπτύσσουν το BinaryAST για να επιταχύνουν τη φόρτωση JavaScript

Κατά την επεξεργασία JavaScript, δαπανάται σημαντικός χρόνος στη φάση φόρτωσης και ανάλυσης του κώδικα. Λαμβάνοντας υπόψη ότι ο όγκος του ληφθέντος JavaScript σε πολλούς δημοφιλείς ιστότοπους είναι κοντά στα 10 MB (για παράδειγμα, για το LinkedIn - 7.2 MB, το Facebook - 7.1 MB, το Gmail - 3.9 MB), η αρχική επεξεργασία του JavaScript εισάγει σημαντική καθυστέρηση. Το στάδιο ανάλυσης στην πλευρά του προγράμματος περιήγησης επιβραδύνεται επίσης λόγω της αδυναμίας πλήρους δημιουργίας του AST κατά τη φόρτωση του κώδικα (το πρόγραμμα περιήγησης πρέπει να περιμένει να ολοκληρωθεί η φόρτωση των μπλοκ κώδικα, όπως το τέλος των συναρτήσεων, για να αποκτήσει οι πληροφορίες που λείπουν για την ανάλυση των τρεχόντων στοιχείων).

Προσπαθούν να λύσουν εν μέρει το πρόβλημα με τη διανομή του κώδικα σε ελαχιστοποιημένη και συμπιεσμένη μορφή, καθώς και με την προσωρινή αποθήκευση του bytecode που δημιουργείται από το πρόγραμμα περιήγησης. Σε σύγχρονους ιστότοπους, ο κώδικας ενημερώνεται αρκετά συχνά, επομένως η προσωρινή αποθήκευση λύνει μόνο εν μέρει το πρόβλημα. Το WebAssembly θα μπορούσε να είναι μια λύση, αλλά απαιτεί ρητή πληκτρολόγηση του κώδικα και δεν είναι κατάλληλο για την επιτάχυνση της επεξεργασίας του υπάρχοντος κώδικα JavaScript.

Μια άλλη επιλογή είναι η παράδοση έτοιμου μεταγλωττισμένου bytecode αντί για σενάρια JavaScript, αλλά οι προγραμματιστές μηχανών προγράμματος περιήγησης είναι αντίθετοι επειδή ο bytecode τρίτου μέρους είναι δύσκολο να επαληθευτεί, η άμεση επεξεργασία του μπορεί να οδηγήσει σε διαστρωμάτωση Ιστού, προκύπτουν πρόσθετοι κίνδυνοι ασφάλειας και ανάπτυξη απαιτείται μια γενική μορφή bytecode.

Το BinaryAST σάς επιτρέπει να εντάσσεστε στο τρέχον μοντέλο ανάπτυξης και παράδοσης κώδικα χωρίς να δημιουργήσετε νέο bytecode ή να αλλάξετε τη γλώσσα JavaScript. Το μέγεθος των δεδομένων στη μορφή BinaryAST είναι συγκρίσιμο με τον συμπιεσμένο ελαχιστοποιημένο κώδικα JavaScript και η ταχύτητα επεξεργασίας με την εξάλειψη της φάσης ανάλυσης κειμένου προέλευσης αυξάνεται αισθητά. Επιπλέον, η μορφή επιτρέπει τη μεταγλώττιση σε bytecode καθώς φορτώνεται το BinaryAST, χωρίς να περιμένει να ολοκληρωθούν όλα τα δεδομένα. Επιπλέον, η ανάλυση από την πλευρά του διακομιστή σάς επιτρέπει να εξαιρέσετε αχρησιμοποίητες συναρτήσεις και περιττό κώδικα από την επιστρεφόμενη αναπαράσταση BinaryAST, η οποία, κατά την ανάλυση στην πλευρά του προγράμματος περιήγησης, σπαταλά χρόνο τόσο στην ανάλυση όσο και στη μετάδοση περιττής κίνησης.

Ένα χαρακτηριστικό του BinaryAST είναι επίσης η δυνατότητα επαναφοράς αναγνώσιμης JavaScript που δεν είναι ακριβώς ίδια με την αρχική έκδοση, αλλά είναι σημασιολογικά ισοδύναμη και περιλαμβάνει τα ίδια ονόματα μεταβλητών και συναρτήσεων (Το BinaryAST αποθηκεύει ονόματα, αλλά δεν αποθηκεύει πληροφορίες για θέσεις στο κώδικας, μορφοποίηση και σχόλια). Η άλλη όψη του νομίσματος είναι η εμφάνιση νέων διανυσμάτων επίθεσης, αλλά σύμφωνα με τους προγραμματιστές, είναι πολύ μικρότερα και πιο ελεγχόμενα από ό,τι όταν χρησιμοποιούνται εναλλακτικές λύσεις, όπως η διανομή bytecode.

Οι δοκιμές του κώδικα του facebook.com έδειξαν ότι η ανάλυση JavaScript καταναλώνει το 10-15% των πόρων της CPU και η ανάλυση απαιτεί περισσότερο χρόνο από τη δημιουργία bytecode και αρχικής δημιουργίας κώδικα για το JIT. Στον κινητήρα SpiderMonkey, ο χρόνος για την πλήρη κατασκευή ενός AST διαρκεί 500-800 ms και η χρήση του BinaryAST μείωσε αυτό το ποσοστό κατά 70-90%.
Γενικά, για τα περισσότερα πυροτεχνήματα ιστού, όταν χρησιμοποιείται BinaryAST, ο χρόνος ανάλυσης JavaScript μειώνεται κατά 3-10% στη λειτουργία χωρίς βελτιστοποίηση και κατά 90-97% όταν είναι ενεργοποιημένη η λειτουργία παράβλεψης αχρησιμοποίητων συναρτήσεων.
Κατά την εκτέλεση ενός δοκιμαστικού σετ JavaScript 1.2 MB, η χρήση του BinaryAST επέτρεψε στον χρόνο εκκίνησης να επιταχυνθεί από 338 σε 314 ms σε επιτραπέζιο σύστημα (Intel i7) και από το 2019 σε 1455 ms σε φορητή συσκευή (HTC One M8).

Πηγή: opennet.ru

Προσθέστε ένα σχόλιο