Κυκλοφορία της γλώσσας προγραμματισμού Rust 1.75 και unikernel Hermit 0.6.7

Δημοσιεύτηκε η κυκλοφορία της γλώσσας προγραμματισμού γενικής χρήσης Rust 1.75, που ιδρύθηκε από το έργο Mozilla, αλλά τώρα αναπτύχθηκε υπό την αιγίδα του ανεξάρτητου μη κερδοσκοπικού οργανισμού Rust Foundation. Η γλώσσα εστιάζει στην ασφάλεια της μνήμης και παρέχει τα μέσα για την επίτευξη υψηλού παραλληλισμού εργασιών, αποφεύγοντας τη χρήση απορριμματοσυλλέκτη και χρόνου εκτέλεσης (ο χρόνος εκτέλεσης μειώνεται στη βασική προετοιμασία και συντήρηση της τυπικής βιβλιοθήκης).

Οι μέθοδοι χειρισμού μνήμης του Rust σώζουν τον προγραμματιστή από σφάλματα κατά τον χειρισμό δεικτών και προστατεύουν από προβλήματα που προκύπτουν λόγω χειρισμού μνήμης χαμηλού επιπέδου, όπως πρόσβαση σε μια περιοχή μνήμης μετά την απελευθέρωσή της, αποαναφορά μηδενικών δεικτών, υπερβάσεις buffer κ.λπ. Για τη διανομή βιβλιοθηκών, την παροχή κατασκευών και τη διαχείριση εξαρτήσεων, το έργο αναπτύσσει τον διαχειριστή πακέτων Cargo. Το αποθετήριο crates.io υποστηρίζεται για τη φιλοξενία βιβλιοθηκών.

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

Βασικές καινοτομίες:

  • Προστέθηκε η δυνατότητα χρήσης "async fn" και του συμβολισμού "->impl Trait" σε ιδιωτικά χαρακτηριστικά. Για παράδειγμα, χρησιμοποιώντας το "->impl Trait" μπορείτε να γράψετε μια μέθοδο χαρακτηριστικού που επιστρέφει έναν επαναλήπτη: χαρακτηριστικό Container { fn items(&self) -> impl Iterator; } impl Container for MyContainer { fn items(&self) -> impl Iterator {self.items.iter().cloned() } }

    Μπορείτε επίσης να δημιουργήσετε χαρακτηριστικά χρησιμοποιώντας "async fn": χαρακτηριστικό HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // θα επεκταθεί σε: // fn fetch(&self, url: Url) -> impl Future; }

  • Προστέθηκε API για τον υπολογισμό των μετατοπίσεων byte σε σχέση με τους δείκτες. Όταν εργάζεστε με γυμνούς δείκτες ("*const T" και "*mut T"), ενδέχεται να απαιτούνται λειτουργίες για την προσθήκη μιας μετατόπισης στον δείκτη. Προηγουμένως, γι 'αυτό ήταν δυνατό να χρησιμοποιηθεί μια κατασκευή όπως "::add(1)", προσθέτοντας τον αριθμό των byte που αντιστοιχεί στο μέγεθος του "size_of::()". Το νέο API απλοποιεί αυτήν τη λειτουργία και καθιστά δυνατό τον χειρισμό μετατοπίσεων byte χωρίς πρώτα να μεταφέρετε τους τύπους σε "*const u8" ή "*mut u8".
    • δείκτης::byte_add
    • δείκτης::byte_offset
    • δείκτης::byte_offset_from
    • δείκτης::byte_sub
    • δείκτης::wrapping_byte_add
    • δείκτης::wrapping_byte_offset
    • δείκτης::wrapping_byte_sub
  • Συνεχίστηκε η εργασία για την αύξηση της απόδοσης του μεταγλωττιστή rustc. Προστέθηκε το εργαλείο βελτιστοποίησης BOLT, το οποίο εκτελείται στο στάδιο μετά τη σύνδεση και χρησιμοποιεί πληροφορίες από ένα προπαρασκευασμένο προφίλ εκτέλεσης. Η χρήση του BOLT σάς επιτρέπει να επιταχύνετε την εκτέλεση του μεταγλωττιστή κατά περίπου 2% αλλάζοντας τη διάταξη του κώδικα βιβλιοθήκης librustc_driver.so για πιο αποτελεσματική χρήση της κρυφής μνήμης του επεξεργαστή.

    Περιλαμβάνεται η κατασκευή του μεταγλωττιστή rustc με την επιλογή "-Ccodegen-units=1" για τη βελτίωση της ποιότητας βελτιστοποίησης στο LLVM. Οι δοκιμές που πραγματοποιήθηκαν δείχνουν αύξηση της απόδοσης στην περίπτωση της κατασκευής "-Ccodegen-units=1" κατά περίπου 1.5%. Οι πρόσθετες βελτιστοποιήσεις είναι ενεργοποιημένες από προεπιλογή μόνο για την πλατφόρμα x86_64-unknown-linux-gnu.

    Οι βελτιστοποιήσεις που αναφέρθηκαν προηγουμένως δοκιμάστηκαν από την Google για τη μείωση του χρόνου κατασκευής των στοιχείων πλατφόρμας Android που είναι γραμμένα σε Rust. Η χρήση του “-C codegen-units=1” κατά την κατασκευή του Android μας επέτρεψε να μειώσουμε το μέγεθος του κιτ εργαλείων κατά 5.5% και να αυξήσουμε την απόδοσή του κατά 1.8%, ενώ ο χρόνος κατασκευής του ίδιου του κιτ εργαλείων σχεδόν διπλασιάστηκε.

    Η ενεργοποίηση της συλλογής απορριμμάτων σε χρόνο σύνδεσης ("--gc-sections") έφερε το κέρδος απόδοσης έως και 1.9%, ενεργοποιώντας τη βελτιστοποίηση χρόνου σύνδεσης (LTO) έως και 7.7% και τις βελτιστοποιήσεις βάσει προφίλ (PGO) έως και 19.8% . Στο τέλος, εφαρμόστηκαν βελτιστοποιήσεις χρησιμοποιώντας το βοηθητικό πρόγραμμα BOLT, το οποίο επέτρεψε την αύξηση της ταχύτητας κατασκευής στο 24.7%, αλλά το μέγεθος του κιτ εργαλείων αυξήθηκε κατά 10.9%.

    Κυκλοφορία της γλώσσας προγραμματισμού Rust 1.75 και unikernel Hermit 0.6.7

  • Ένα νέο τμήμα του API έχει μετακινηθεί στην κατηγορία των σταθερών, συμπεριλαμβανομένων των μεθόδων και των εφαρμογών των χαρακτηριστικών έχουν σταθεροποιηθεί:
    • Atomic*::from_ptr
    • FileTimes
    • FileTimesExt
    • Αρχείο::set_modified
    • Αρχείο::set_times
    • IpAddr::to_canonical
    • Ipv6Addr::to_canonical
    • Επιλογή::as_slice
    • Επιλογή::as_mut_slice
    • δείκτης::byte_add
    • δείκτης::byte_offset
    • δείκτης::byte_offset_from
    • δείκτης::byte_sub
    • δείκτης::wrapping_byte_add
    • δείκτης::wrapping_byte_offset
    • δείκτης::wrapping_byte_sub
  • Το χαρακτηριστικό "const", το οποίο καθορίζει τη δυνατότητα χρήσης του σε οποιοδήποτε πλαίσιο αντί για σταθερές, χρησιμοποιείται στις συναρτήσεις:
    • Ipv6Addr::to_ipv4_mapped
    • MaybeUninit::assume_init_read
    • MaybeUninit::zeroed
    • mem::discriminant
    • mem::zeroed
  • Το τρίτο επίπεδο υποστήριξης έχει εφαρμοστεί για τις πλατφόρμες csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd και mipsel-unknown-netbsd. Το τρίτο επίπεδο περιλαμβάνει βασική υποστήριξη, αλλά χωρίς αυτοματοποιημένες δοκιμές, δημοσίευση επίσημων εκδόσεων ή έλεγχο του αν μπορεί να κατασκευαστεί ο κώδικας.

Επιπλέον, μπορούμε να σημειώσουμε μια νέα έκδοση του έργου Hermit, η οποία αναπτύσσει έναν εξειδικευμένο πυρήνα (unikernel), γραμμένο στη γλώσσα Rust, παρέχοντας εργαλεία για τη δημιουργία αυτόνομων εφαρμογών που μπορούν να εκτελούνται πάνω από έναν hypervisor ή γυμνό υλικό χωρίς πρόσθετα επίπεδα και χωρίς λειτουργικό σύστημα. Κατά την κατασκευή, η εφαρμογή συνδέεται στατικά με μια βιβλιοθήκη, η οποία υλοποιεί ανεξάρτητα όλες τις απαραίτητες λειτουργίες, χωρίς να συνδέεται με τον πυρήνα του λειτουργικού συστήματος και τις βιβλιοθήκες του συστήματος. Ο κώδικας του έργου διανέμεται υπό τις άδειες Apache 2.0 και MIT. Το Assembly υποστηρίζεται για αυτόνομη εκτέλεση εφαρμογών γραμμένων σε Rust, Go, Fortran, C και C++. Το έργο αναπτύσσει επίσης το δικό του bootloader που σας επιτρέπει να εκκινήσετε το Hermit χρησιμοποιώντας QEMU και KVM.

Πηγή: opennet.ru

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