Προγραμματισμός

Τι είναι το WebAss Assembly; Η πλατφόρμα ιστού επόμενης γενιάς εξήγησε

Εδώ και δύο δεκαετίες, διαθέτουμε μόνο μία γλώσσα προγραμματισμού για χρήση εγγενώς σε πρόγραμμα περιήγησης ιστού: JavaScript. Ο αργός θάνατος των δυαδικών προσθηκών τρίτων έχει αποκλείσει άλλες γλώσσες, όπως η Java και το ActionScript του Flash, ως πολίτες πρώτης κατηγορίας για την ανάπτυξη ιστού. Άλλες γλώσσες ιστού, όπως το CoffeeScript, συντάσσονται απλώς σε JavaScript.

Αλλά τώρα έχουμε μια νέα δυνατότητα: WebAss Assembly ή WASM για συντομία. Το WebAssembly είναι μια μικρή, γρήγορη δυαδική μορφή που υπόσχεται σχεδόν εγγενή απόδοση για εφαρμογές ιστού. Επιπλέον, το WebAssembly έχει σχεδιαστεί για να αποτελεί στόχο συλλογής για οποιαδήποτε γλώσσα, με το JavaScript να είναι μόνο μία από αυτές. Με κάθε μεγάλο πρόγραμμα περιήγησης που υποστηρίζει τώρα το WebAssembly, ήρθε η ώρα να αρχίσετε να σκέφτεστε σοβαρά τη σύνταξη εφαρμογών από τον πελάτη για τον ιστό που μπορούν να μεταγλωττιστούν ως WebAssembly.

Αξίζει να σημειωθεί ότι οι εφαρμογές WebAss Assembly δεν προορίζονται αντικαθιστώ Εφαρμογές JavaScript — τουλάχιστον, όχι ακόμα. Αντ 'αυτού, σκεφτείτε το WebAss Assembly ως σύντροφος σε JavaScript. Όπου η JavaScript είναι ευέλικτη, δυναμικά δακτυλογραφημένη και παραδίδεται μέσω πηγαίου κώδικα αναγνώσιμου από τον άνθρωπο, το WebAssembly είναι υψηλής ταχύτητας, έντονα δακτυλογραφημένο και παραδίδεται μέσω συμπαγής δυαδικής μορφής.

Οι προγραμματιστές θα πρέπει να εξετάσουν το WebAss Assembly για περιπτώσεις έντασης απόδοσης, όπως παιχνίδια, ροή μουσικής, επεξεργασία βίντεο και εφαρμογές CAD.

Πώς λειτουργεί το WebAss Assembly

Το WebAssembly, που αναπτύχθηκε από το W3C, είναι στα λόγια των δημιουργών του ως «στόχος συλλογής». Οι προγραμματιστές δεν γράφουν απευθείας το WebAss Assembly. γράφουν στη γλώσσα της επιλογής τους, η οποία στη συνέχεια συντάσσεται σε bytecode WebAssembly. Στη συνέχεια, ο bytecode εκτελείται στον πελάτη - συνήθως σε πρόγραμμα περιήγησης ιστού - όπου μεταφράζεται σε εγγενή κώδικα μηχανής και εκτελείται με υψηλή ταχύτητα.

Ο κώδικας WebAssembly προορίζεται να είναι πιο γρήγορος για φόρτωση, ανάλυση και εκτέλεση από το JavaScript. Όταν το WebAssembly χρησιμοποιείται από ένα πρόγραμμα περιήγησης ιστού, εξακολουθεί να υπάρχει η γενική επιβάρυνση της λήψης της μονάδας WASM και της ρύθμισής της, αλλά όλα τα άλλα πράγματα που είναι ισότιμα ​​το WebAssembly εκτελείται πιο γρήγορα. Το WebAssembly παρέχει επίσης ένα μοντέλο εκτέλεσης με sandbox, βασισμένο στα ίδια μοντέλα ασφαλείας που υπάρχουν τώρα για το JavaScript.

Αυτήν τη στιγμή, η εκτέλεση του WebAssembly σε προγράμματα περιήγησης ιστού είναι η πιο συνηθισμένη περίπτωση χρήσης, αλλά το WebAssembly προορίζεται να είναι κάτι περισσότερο από μια λύση που βασίζεται στον Ιστό. Τελικά, καθώς η προδιαγραφή WebAss Assembly σχηματίζεται και περισσότερες λειτουργίες προστίθενται σε αυτό, μπορεί να γίνει χρήσιμη σε εφαρμογές για κινητά, εφαρμογές για επιτραπέζιους υπολογιστές, διακομιστές και σε άλλα περιβάλλοντα εκτέλεσης.

Περιπτώσεις χρήσης WebAss Assembly

Η πιο βασική περίπτωση χρήσης για το WebAssembly είναι ως στόχος για τη σύνταξη λογισμικού στο πρόγραμμα περιήγησης. Τα στοιχεία που μεταγλωττίζονται στο WebAssembly μπορούν να γραφτούν σε οποιαδήποτε από τις διάφορες γλώσσες. Το τελικό ωφέλιμο φορτίο WebAss Assembly παραδίδεται έπειτα μέσω JavaScript στον πελάτη.

Το WebAssembly έχει σχεδιαστεί λαμβάνοντας υπόψη μια σειρά εντατικών επιδόσεων, που βασίζονται σε προγράμματα περιήγησης: παιχνίδια, ροή μουσικής, επεξεργασία βίντεο, CAD, κρυπτογράφηση και αναγνώριση εικόνας, για να αναφέρουμε μερικά μόνο.

Γενικότερα, είναι διδακτικό να εστιάζετε σε αυτούς τους τρεις τομείς κατά τον προσδιορισμό της συγκεκριμένης περίπτωσης χρήσης του WebAss Assembly:

  • Κωδικός υψηλής απόδοσης που υπάρχει ήδη σε γλώσσα με δυνατότητα στόχευσης. Για παράδειγμα, εάν έχετε ήδη μια μαθηματική συνάρτηση υψηλής ταχύτητας γραμμένη στο C και θέλετε να την ενσωματώσετε σε μια εφαρμογή ιστού, θα μπορούσατε να την αναπτύξετε ως λειτουργική μονάδα WebAss Assembly. Τα λιγότερο κρίσιμα για την απόδοση τμήματα της εφαρμογής μπορούν να παραμείνουν σε JavaScript.
  • Κωδικός υψηλής απόδοσης που πρέπει να γραφτεί από το μηδέν, όπου η JavaScript δεν είναι ιδανική. Προηγουμένως, κάποιος θα μπορούσε να χρησιμοποιήσει το asm.js για να γράψει έναν τέτοιο κώδικα. Μπορείτε ακόμα να το κάνετε, αλλά το WebAss Assembly τοποθετείται ως μια καλύτερη μακροπρόθεσμη λύση.
  • Μεταφορά μιας εφαρμογής επιτραπέζιου υπολογιστή σε περιβάλλον ιστού. Πολλές από τις τεχνολογικές επιδείξεις για asm.js και WebAss Assembly εμπίπτουν σε αυτήν την κατηγορία. Το WebAss Assembly μπορεί να παρέχει ένα υπόστρωμα για εφαρμογές που είναι πιο φιλόδοξες από ένα GUI που παρουσιάζεται μέσω HTML. (Δείτε τις επιδείξεις WebDSP, Zen Garden και Tanks.) Ωστόσο, αυτό δεν είναι μια ασήμαντη άσκηση, καθώς όλοι οι τρόποι με τους οποίους η εφαρμογή επιτραπέζιας διεπαφής με το χρήστη πρέπει να αντιστοιχιστεί σε ισοδύναμα WebAssembly / HTML / JavaScript.

Εάν διαθέτετε μια υπάρχουσα εφαρμογή JavaScript που δεν ωθεί φακέλους απόδοσης, καλύτερα να μείνετε μόνοι σε αυτό το στάδιο ανάπτυξης του WebAss Assembly. Αλλά αν χρειάζεστε αυτήν την εφαρμογή για να προχωρήσετε πιο γρήγορα, το WebAss Assembly μπορεί να βοηθήσει.

Υποστήριξη γλωσσών WebAss Assembly

Το WebAss Assembly δεν προορίζεται να γραφτεί απευθείας. Όπως υποδηλώνει το όνομα, μοιάζει περισσότερο με μια γλώσσα συναρμολόγησης, κάτι που καταναλώνει το μηχάνημα, από μια υψηλού επιπέδου, φιλική προς τον άνθρωπο γλώσσα προγραμματισμού. Το WebAss Assembly είναι πιο κοντά στην ενδιάμεση αναπαράσταση (IR) που δημιουργείται από την υποδομή σύνταξης γλωσσών LLVM, από ότι είναι όπως C ή Java.

Έτσι, τα περισσότερα σενάρια εργασίας με το WebAssembly περιλαμβάνουν τη σύνταξη κώδικα σε γλώσσα υψηλού επιπέδου και τη μετατροπή του σε WebAssembly. Αυτό μπορεί να γίνει με οποιονδήποτε από τους τρεις βασικούς τρόπους:

  • Άμεση συλλογή. Η πηγή μεταφράζεται στο WebAss Assembly μέσω της εργαλειοθήκης μεταγλωττιστή της γλώσσας. Οι Rust, C / C ++, Kotlin / Native και D τώρα έχουν όλοι εγγενείς τρόπους να εκπέμπουν WASM από μεταγλωττιστές που υποστηρίζουν αυτές τις γλώσσες.
  • Εργαλεία τρίτων. Η γλώσσα δεν διαθέτει εγγενή υποστήριξη WASM στην αλυσίδα εργαλείων της, αλλά ένα βοηθητικό πρόγραμμα τρίτου μέρους μπορεί να χρησιμοποιηθεί για μετατροπή σε WASM. Java, Lua και η οικογένεια γλωσσών .Net έχουν κάποια υποστήριξη σαν αυτό.
  • Διερμηνέας με βάση το WebAss Assembly. Εδώ, η ίδια η γλώσσα δεν μεταφράζεται σε WebAss Assembly. μάλλον, ένας διερμηνέας για τη γλώσσα, γραμμένος στο WebAss Assembly, εκτελεί κώδικα γραμμένο στη γλώσσα. Αυτή είναι η πιο δυσκίνητη προσέγγιση, καθώς ο διερμηνέας μπορεί να είναι αρκετά megabyte κώδικα, αλλά επιτρέπει στον τρέχοντα κώδικα που είναι γραμμένος στη γλώσσα να τρέχει όλους αλλά χωρίς αλλαγή. Οι Python και Ruby έχουν διερμηνείς μεταφρασμένους στο WASM.

Δυνατότητες WebAss Assembly

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

Πρωτόγονα συλλογής απορριμμάτων

Το WebAss Assembly δεν υποστηρίζει άμεσα γλώσσες που χρησιμοποιούν μοντέλα μνήμης που συλλέγονται σκουπίδια. Γλώσσες όπως η Lua ή η Python μπορούν να υποστηριχθούν μόνο με τον περιορισμό των συνόλων λειτουργιών ή με την ενσωμάτωση ολόκληρου του χρόνου εκτέλεσης ως εκτελέσιμο WebAss Assembly. Υπάρχει, ωστόσο, έργο για την υποστήριξη μοντέλων μνήμης που συλλέγονται σκουπίδια ανεξάρτητα από τη γλώσσα ή την εφαρμογή.

Νήμα

Η εγγενής υποστήριξη για το νήμα είναι κοινή σε γλώσσες όπως το Rust και το C ++. Η απουσία υποστήριξης νήματος στο WebAssembly σημαίνει ότι ολόκληρες κατηγορίες λογισμικού με στόχευση WebAssembly δεν μπορούν να γραφτούν σε αυτές τις γλώσσες. Η πρόταση για προσθήκη νήματος στο WebAssembly χρησιμοποιεί το μοντέλο σπειρώματος C ++ ως μία από τις εμπνευσμένες του.

Λειτουργίες μαζικής μνήμης και SIMD

Οι λειτουργίες μαζικής μνήμης και ο παραλληλισμός SIMD (μεμονωμένες οδηγίες, πολλαπλά δεδομένα) είναι απαραίτητες για εφαρμογές που αλέθονται μέσω σωρών δεδομένων και χρειάζονται εγγενή επιτάχυνση της CPU για να αποφύγουν το πνιγμό, όπως μηχανική μάθηση ή επιστημονικές εφαρμογές. Οι προτάσεις βρίσκονται στο τραπέζι για να προσθέσετε αυτές τις δυνατότητες στο WebAss Assembly μέσω νέων χειριστών.

Γλωσσικές κατασκευές υψηλού επιπέδου

Πολλές άλλες δυνατότητες εξετάζονται για χαρτογράφηση WebAss Assembly απευθείας σε κατασκευές υψηλού επιπέδου σε άλλες γλώσσες.

  • Εξαιρέσεις μπορεί να μιμηθεί στο WebAssembly, αλλά δεν μπορεί να εφαρμοστεί εγγενώς μέσω του συνόλου οδηγιών του WebAssembly. Το προτεινόμενο σχέδιο για εξαιρέσεις περιλαμβάνει εξαίρεση πρωτότυπα συμβατά με το μοντέλο εξαίρεσης C ++, τα οποία με τη σειρά τους θα μπορούσαν να χρησιμοποιηθούν από άλλες γλώσσες που έχουν συνταχθεί στο WebAssembly.
  • Τύποι αναφοράς διευκολύνετε τη μεταφορά αντικειμένων που χρησιμοποιούνται ως αναφορές στο περιβάλλον του κεντρικού υπολογιστή. Αυτό θα διευκόλυνε τη συλλογή απορριμμάτων και μια σειρά από άλλες λειτουργίες υψηλού επιπέδου στο WebAss Assembly.
  • Ουρές κλήσεων, ένα μοτίβο σχεδίασης που χρησιμοποιείται σε πολλές γλώσσες.
  • Λειτουργίες που επιστρέφουν πολλές τιμές, π.χ., μέσω πλειάδων στο Python ή στο C #.
  • Τελεστές επέκτασης σημάτων, μια χρήσιμη λειτουργία μαθηματικών χαμηλού επιπέδου. (Το LLVM τα υποστηρίζει επίσης.)

Εργαλεία εντοπισμού σφαλμάτων και δημιουργίας προφίλ

Ένα από τα μεγαλύτερα προβλήματα με τη μεταγλωττισμένη JavaScript ήταν η δυσκολία εντοπισμού σφαλμάτων και δημιουργίας προφίλ, λόγω της αδυναμίας συσχέτισης μεταξύ του μεταφερόμενου κώδικα και της πηγής. Με το WebAss Assembly, έχουμε ένα παρόμοιο πρόβλημα και αντιμετωπίζεται με παρόμοιο τρόπο (υποστήριξη χάρτη προέλευσης). Δείτε τη σημείωση του έργου σχετικά με την προγραμματισμένη υποστήριξη εργαλείων.