Κυκλοφορία γλώσσας προγραμματισμού Rust 1.64

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

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

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

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

  • Οι απαιτήσεις για το περιβάλλον Linux στον μεταγλωττιστή, τον διαχειριστή πακέτων Cargo και την τυπική βιβλιοθήκη libstd έχουν αυξηθεί - οι ελάχιστες απαιτήσεις για το Glibc αυξήθηκαν από την έκδοση 2.11 στην 2.17 και τον πυρήνα του Linux από την έκδοση 2.6.32 στην 3.2. Οι περιορισμοί ισχύουν επίσης για εκτελέσιμα εφαρμογές Rust που έχουν δημιουργηθεί με libstd. Τα κιτ διανομής RHEL 7, SLES 12-SP5, Debian 8 και Ubuntu 14.04 πληρούν τις νέες απαιτήσεις. Η υποστήριξη για RHEL 6, SLES 11-SP4, Debian 7 και Ubuntu 12.04 θα διακοπεί. Οι χρήστες που χρησιμοποιούν εκτελέσιμα αρχεία που έχουν δημιουργηθεί με Rust σε περιβάλλοντα με παλαιότερο πυρήνα Linux ενθαρρύνονται να αναβαθμίσουν τα συστήματά τους, να παραμείνουν σε παλαιότερες εκδόσεις του μεταγλωττιστή ή να διατηρήσουν το δικό τους libstd fork με επίπεδα για να διατηρήσουν τη συμβατότητα.

    Μεταξύ των λόγων για τον τερματισμό της υποστήριξης για παλαιότερα συστήματα Linux είναι οι περιορισμένοι πόροι για τη διατήρηση της συμβατότητας με παλαιότερα περιβάλλοντα. Η υποστήριξη για το Glibc παλαιού τύπου απαιτεί τη χρήση εργαλείων παλαιού τύπου κατά τον έλεγχο σε ένα σύστημα συνεχούς ενοποίησης, ενόψει των αυξανόμενων απαιτήσεων έκδοσης σε βοηθητικά προγράμματα LLVM και πολλαπλής μεταγλώττισης. Η αύξηση των απαιτήσεων έκδοσης πυρήνα οφείλεται στη δυνατότητα χρήσης νέων κλήσεων συστήματος στο libstd χωρίς την ανάγκη διατήρησης επιπέδων για τη διασφάλιση της συμβατότητας με παλαιότερους πυρήνες.

  • Το χαρακτηριστικό IntoFuture έχει σταθεροποιηθεί, το οποίο μοιάζει με το IntoIterator, αλλά διαφέρει από το τελευταίο χρησιμοποιώντας βρόχους ".wait" αντί για "for ... in ...". Όταν συνδυάζεται με το IntoFuture, η λέξη-κλειδί ".wait" μπορεί να περιμένει όχι μόνο ένα χαρακτηριστικό Μελλοντικό, αλλά και οποιουσδήποτε άλλους τύπους που μπορούν να μετατραπούν σε Μελλοντικό.
  • Το βοηθητικό πρόγραμμα αναλυτής σκουριάς περιλαμβάνεται στη συλλογή βοηθητικών προγραμμάτων που παρέχονται με τις εκδόσεις Rust. Το βοηθητικό πρόγραμμα είναι επίσης διαθέσιμο για εγκατάσταση με χρήση rustup (συστατικό rutup add rust-analyzer).
  • Ο διαχειριστής πακέτων Cargo περιλαμβάνει κληρονομικότητα χώρου εργασίας για την εξάλειψη της αντιγραφής κοινών τιμών πεδίων μεταξύ πακέτων, όπως οι εκδόσεις Rust και οι διευθύνσεις URL αποθετηρίου. Προστέθηκε επίσης υποστήριξη για δημιουργία για πολλές πλατφόρμες στόχων ταυτόχρονα (μπορείτε τώρα να καθορίσετε περισσότερες από μία παραμέτρους στην επιλογή "--target").
  • Ένα νέο τμήμα του API έχει μετακινηθεί στην κατηγορία των σταθερών, συμπεριλαμβανομένων των μεθόδων και των εφαρμογών των χαρακτηριστικών έχουν σταθεροποιηθεί:
    • future::IntoFuture
    • num::NonZero*::checked_mul
    • num::NonZero*::checked_pow
    • num::NonZero*::saturating_mul
    • num::NonZero*::saturating_pow
    • num::NonZeroI*::abs
    • num::NonZeroI*::checked_abs
    • num::NonZeroI*::overflowing_abs
    • num::NonZeroI*::saturating_abs
    • num::NonZeroI*::unsigned_abs
    • num::NonZeroI*::wrapping_abs
    • num::NonZeroU*::checked_add
    • num::NonZeroU*::checked_next_power_of_two
    • num::NonZeroU*::saturating_add
    • os::unix::process::CommandExt::process_group
    • os::windows::fs::FileTypeExt::is_symlink_dir
    • os::windows::fs::FileTypeExt::is_symlink_file
  • Τύποι συμβατοί με C, που είχαν προηγουμένως σταθεροποιηθεί στη μονάδα std::ffi, έχουν προστεθεί στον πυρήνα και στη βιβλιοθήκη κατανομής:
    • πυρήνας::ffi::CStr
    • πυρήνας::ffi::FromBytesWithNulError
    • κατανομή::ffi::CString
    • alloc::ffi::FromVecWithNulError
    • alloc::ffi::IntoStringError
    • alloc::ffi::NulError
  • Οι τύποι C που είχαν προηγουμένως σταθεροποιηθεί στη μονάδα std::os::raw έχουν προστεθεί στις μονάδες πυρήνα::ffi και std::ffi (για παράδειγμα, οι τύποι c_uint και c_ulong έχουν προταθεί για τους τύπους uint και ulong C):
    • ffi::c_char
    • ffi::c_double
    • ffi::c_float
    • ffi::c_int
    • ffi::c_long
    • ffi::c_longlong
    • ffi::c_schar
    • ffi::c_short
    • ffi::c_uchar
    • ffi::c_uint
    • ffi::c_ulong
    • ffi::c_ulonglong
    • ffi::c_ushort
  • Οι χειριστές χαμηλού επιπέδου έχουν σταθεροποιηθεί για χρήση με τον μηχανισμό Poll (στο μέλλον σχεδιάζεται η παροχή ενός απλοποιημένου API που δεν απαιτεί τη χρήση δομών χαμηλού επιπέδου όπως το Pull and Pin):

    • future::poll_fn
    • εργασία:: έτοιμος!
  • Το χαρακτηριστικό "const", το οποίο καθορίζει τη δυνατότητα χρήσης του σε οποιοδήποτε πλαίσιο αντί για σταθερές, χρησιμοποιείται στη συνάρτηση slice::from_raw_parts.
  • Για πιο συμπαγή αποθήκευση δεδομένων, η διάταξη μνήμης των δομών Ipv4Addr, Ipv6Addr, SocketAddrV4 και SocketAddrV6 έχει αλλάξει. Ενδέχεται να υπάρχει πρόβλημα συμβατότητας με πακέτα μεμονωμένων κιβωτίων που χρησιμοποιούν std::mem::transmute για χειρισμό δομών χαμηλού επιπέδου.
  • Η κατασκευή του μεταγλωττιστή rust για την πλατφόρμα των Windows χρησιμοποιεί βελτιστοποιήσεις PGO (profile-guided optimization), οι οποίες κατέστησαν δυνατή την αύξηση της απόδοσης μεταγλώττισης κώδικα κατά 10-20%.
  • Ο μεταγλωττιστής έχει εφαρμόσει μια νέα προειδοποίηση σχετικά με τα αχρησιμοποίητα πεδία σε ορισμένες δομές.

Επιπλέον, μπορείτε να σημειώσετε την αναφορά κατάστασης σχετικά με την ανάπτυξη μιας εναλλακτικής εφαρμογής του μεταγλωττιστή γλώσσας Rust, που προετοιμάστηκε από το έργο gccrs (GCC Rust) και εγκρίθηκε για συμπερίληψη στο GCC. Μετά την ενσωμάτωση της διεπαφής, τα τυπικά εργαλεία GCC μπορούν να χρησιμοποιηθούν για τη μεταγλώττιση προγραμμάτων στη γλώσσα Rust χωρίς την ανάγκη εγκατάστασης του μεταγλωττιστή rustc, που έχει δημιουργηθεί με βάση τις εξελίξεις LLVM. Εφόσον η ανάπτυξη είναι σε καλό δρόμο και εκτός απρόβλεπτων προβλημάτων, το Rust frontend θα ενσωματωθεί στην κυκλοφορία του GCC 13 που έχει προγραμματιστεί για τον Μάιο του επόμενου έτους. Η εφαρμογή του Rust στο GCC 13 θα βρίσκεται σε κατάσταση beta, δεν είναι ακόμη ενεργοποιημένη από προεπιλογή.

Πηγή: opennet.ru

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