Μηχανικοί από τις Cloudflare, Mozilla, Facebook και Bloomberg
Για δοκιμή
Το BinaryAST είναι ήδη διαθέσιμο σε
Κατά την επεξεργασία 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