Η πλατφόρμα Bun, που αναπτύχθηκε ως εναλλακτική του Node.js και έχει σχεδιαστεί για αυτόνομη εκτέλεση εφαρμογών γραμμένων σε JavaScript, JSX και TypeScript, έχει μια πειραματική ικανότητα να μεταγλωττίζει και να εκτελεί χειριστές γραμμένους σε C. Προηγουμένως, η κλήση κώδικα χαμηλού επιπέδου απαιτούσε είτε τη δημιουργία πρόσθετων N-API είτε τη μεταγλώττιση του κώδικα σε μορφή WebAssembly (WASM/WASI), γεγονός που περιέπλεξε την ανάπτυξη και επέβαλε ορισμένους περιορισμούς. Τώρα ο κώδικας C μπορεί να ενσωματωθεί απευθείας σε JavaScript και να μεταγλωττιστεί αμέσως χρησιμοποιώντας τον μεταγλωττιστή TinyCC, καθώς και δυναμικά συνδεδεμένες βιβλιοθήκες. εισαγωγή { cc } από "bun:ffi"; export const { symbols: { hello }, } = cc({ source: "./hello.c", symbols: { hello: { returns: "void", args: [], }, }, }); Γειά σου();
Για την εργασία με τη γλώσσα C, χρησιμοποιείται το επίπεδο bun:ffi, το οποίο μεταγλωττίζει τον πηγαίο κώδικα σε οδηγίες μηχανής, τον εισάγει στη μνήμη κατά την εκτέλεση και παρέχει αυτόματη μετατροπή τύπων δεδομένων μεταξύ JavaScript και C. Σημειώνεται ότι η επιβάρυνση κατά την πρόσβαση σε μεταγλωττισμένο κώδικα C ελαχιστοποιείται και οδηγεί σε καθυστέρηση περίπου 2 νανοδευτερόλεπτων για κάθε κλήση σε εξωτερικές λειτουργίες C. Για παράδειγμα, παρουσιάζεται πώς μπορείτε να αποκτήσετε απευθείας πρόσβαση σε βιβλιοθήκες FFmpeg για να μετατρέψετε σύντομα βίντεο - εξαλείφοντας λειτουργίες όπως η διοχέτευση μιας ξεχωριστής διαδικασίας και η κατανομή μνήμης για κάθε βίντεο, ο συνολικός χρόνος εκτέλεσης της δοκιμαστικής εργασίας κατά τη χρήση του bun:ffi μειώθηκε κατά τρεις φορές.
Επιπλέον, στην κυκλοφορία του Bun 1.1.29, προστέθηκε υποστήριξη για N-API (napi) για τον κώδικα C, χάρη στον οποίο οι χειριστές γραμμένοι σε C μπορούν να επιστρέφουν αντικείμενα, συμβολοσειρές, πίνακες και άλλες μη πρωτόγονες τιμές JavaScript, επιπλέον τους τύπους που είναι εγγενείς στη γλώσσα C, όπως int και float. Ο μηχανισμός για την κλήση χειριστών στη γλώσσα C λειτουργεί επίσης κατά τη δυναμική φόρτωση οποιωνδήποτε βιβλιοθηκών με το C ABI, ανεξάρτητα από τη γλώσσα στην οποία γράφτηκαν αρχικά (C++, Rust, Zig, κ.λπ.), η οποία σας επιτρέπει να καλείτε από κώδικα JavaScript που παρέχονται από αυτές τις βιβλιοθήκες λειτουργεί χωρίς ξεχωριστό στάδιο επανασυναρμολόγησης. Για παράδειγμα, μπορείτε πλέον να έχετε πρόσβαση σε API συστήματος από JavaScript.
Θυμηθείτε ότι το έργο Bun αναπτύσσεται με στόχο τη διασφάλιση της συμβατότητας με εφαρμογές διακομιστή που έχουν γραφτεί για το Node.js και υποστηρίζει το μεγαλύτερο μέρος του Node.js API. Η πλατφόρμα περιλαμβάνει ένα σύνολο εργαλείων για τη δημιουργία και εκτέλεση εφαρμογών σε JavaScript και TypeScript, καθώς και χρόνο εκτέλεσης για εκτέλεση εφαρμογών JavaScript χωρίς πρόγραμμα περιήγησης, διαχειριστή πακέτων (συμβατό με NPM), εργαλεία για εκτέλεση δοκιμών και σύστημα δημιουργίας αυτο- περιείχε συσκευασίες. Όσον αφορά την απόδοση, το Bun προηγείται αισθητά από τα Deno και Node.js (σε δοκιμές που βασίζονται στο πλαίσιο React, η πλατφόρμα Bun είναι 2 φορές ταχύτερη από την Deno και σχεδόν 5 φορές πιο γρήγορη από το Node.js). Ο κώδικας του Bun είναι γραμμένος σε Zig και C++ και διανέμεται με την άδεια MIT. Για την εκτέλεση JavaScript, χρησιμοποιείται η μηχανή JavaScriptCore JavaScript και τα στοιχεία του έργου WebKit με πρόσθετες ενημερώσεις κώδικα.
Πηγή: opennet.ru
