Κυκλοφόρησε το Rust 1.53. Η Google θα χρηματοδοτήσει την προσθήκη υποστήριξης Rust στον πυρήνα του Linux

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

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

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

  • Για πίνακες, έχει εφαρμοστεί το χαρακτηριστικό IntoIterator, το οποίο σας επιτρέπει να οργανώσετε την επανάληψη των στοιχείων του πίνακα κατά τιμές: για i στο [1, 2, 3] { .. }

    Είναι επίσης δυνατό να μεταβιβαστούν πίνακες σε μεθόδους που δέχονται επαναλήπτες, για παράδειγμα: let set = BTreeSet::from_iter([1, 2, 3]); για (α, β) σε some_iterator.chain([1]).zip([1, 2, 3]) { .. }

    Προηγουμένως, το IntoIterator υλοποιούνταν μόνο για αναφορές σε πίνακα, π.χ. για την επανάληψη των τιμών απαιτείται η χρήση αναφορών ("&[1, 2, 3]") ή "[1, 2, 3].iter()". Η υλοποίηση του IntoIterator για πίνακες παρεμποδίστηκε από προβλήματα συμβατότητας που προκλήθηκαν από μια προηγούμενη μετατροπή του μεταγλωττιστή από array.into_iter() σε (&array).into_iter(). Αυτά τα προβλήματα επιλύθηκαν με μια λύση - ο μεταγλωττιστής θα συνεχίσει να μετατρέπει το array.into_iter() σε (&array).into_iter() σαν να μην υπήρχε υλοποίηση του χαρακτηριστικού IntoIterator, αλλά μόνο όταν καλεί τη μέθοδο χρησιμοποιώντας το ".into_iter( )" σύνταξη και χωρίς να αγγίζετε τις κλήσεις με τη μορφή "in [1, 2, 3]", "iter.zip([1, 2, 3])", "IntoIterator::into_iter([1, 2, 3] )".

  • Είναι δυνατό να καθοριστούν εκφράσεις "|" (λογική λειτουργία Ή) σε οποιοδήποτε μέρος του προτύπου, για παράδειγμα, αντί για "Some(1) | Some(2)" μπορείτε τώρα να γράψετε "Some(1 | 2)": match result { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) = > { .. } _ => { .. } }
  • Επιτρέπεται η χρήση χαρακτήρων που δεν είναι ASCII σε αναγνωριστικά, συμπεριλαμβανομένων τυχόν εθνικών χαρακτήρων που ορίζονται στην προδιαγραφή Unicode UAX 31, αλλά εξαιρουμένων των χαρακτήρων emoji. Εάν χρησιμοποιείτε διαφορετικούς αλλά παρόμοιους χαρακτήρες, ο μεταγλωττιστής θα εκδώσει μια προειδοποίηση. const BLÅHAJ: &str = "🦈"; struct 人 { 名字: String, } έστω α = 1; letsos = 2; προειδοποίηση: το ζεύγος αναγνωριστικών θεωρείται συγχέεται μεταξύ "s" και "s"
  • Ένα νέο τμήμα API μεταφέρθηκε στη σταθερή κατηγορία, συμπεριλαμβανομένων των ακόλουθων σταθεροποιημένων:
    • πίνακας::from_ref
    • πίνακας::from_mut
    • AtomicBool::fetch_update
    • AtomicPtr::fetch_update
    • BTreeSet::retain
    • BTreeMap::retain
    • BufReader::seek_relative
    • cm::min_by
    • cmp::min_by_key
    • cmp::max_by
    • cmp::max_by_key
    • DebugStruct::finish_non_exhaustive
    • Διάρκεια::ΜΗΔΕΝ
    • Διάρκεια::ΜΕΓ
    • Διάρκεια::is_zero
    • Διάρκεια::saturating_add
    • Διάρκεια::saturating_sub
    • Διάρκεια::saturating_mul
    • f32::is_subnormal
    • f64::is_subnormal
    • IntoIterator για πίνακες
    • {integer}::BITS
    • io::Σφάλμα::Δεν υποστηρίζεται
    • NonZero*::leading_zeros
    • NonZero*::trailing_zeros
    • Επιλογή::εισαγωγή
    • Παραγγελία::is_eq
    • Παραγγελία::is_ne
    • Παραγγελία::is_lt
    • Παραγγελία::is_gt
    • Παραγγελία::is_le
    • Παραγγελία::is_ge
    • OsStr::make_ascii_lowcase
    • OsStr::make_ascii_uppercase
    • OsStr::to_ascii_lowcase
    • OsStr::to_ascii_uppercase
    • OsStr::is_ascii
    • OsStr::eq_ignore_ascii_case
    • Peekable::peek_mut
    • Rc::increment_strong_count
    • Rc::decrement_strong_count
    • slice::IterMut::as_slice
    • AsRef<[T]> για slice::IterMut
    • impl SliceIndex για (Δεσμ , Δεμένο )
    • Vec::extend_from_within
  • Το τρίτο επίπεδο υποστήριξης για την πλατφόρμα wasm64-άγνωστο-άγνωστο έχει υλοποιηθεί. Το τρίτο επίπεδο περιλαμβάνει βασική υποστήριξη, αλλά χωρίς αυτοματοποιημένες δοκιμές, δημοσίευση επίσημων εκδόσεων ή έλεγχο του αν μπορεί να κατασκευαστεί ο κώδικας.
  • Ο διαχειριστής πακέτων Cargo έχει μετακινηθεί για να χρησιμοποιεί το όνομα "main" για τον κύριο κλάδο του αποθετηρίου Git (HEAD) από προεπιλογή. Οι εξαρτήσεις που φιλοξενούνται σε αποθετήρια που χρησιμοποιούν το όνομα main αντί για κύριο δεν απαιτούν πλέον τη διαμόρφωση του branch = "main".
  • Στον μεταγλωττιστή, οι απαιτήσεις για την ελάχιστη έκδοση του LLVM ανεβαίνουν στο LLVM 10.

Επιπλέον, μπορούμε να σημειώσουμε την παροχή χρηματοδότησης για την ανάπτυξη ενσωμάτωσης στον πυρήνα Linux εργαλείων για την ανάπτυξη στοιχείων στη γλώσσα Rust. Οι εργασίες θα πραγματοποιηθούν στο πλαίσιο του έργου Prossimo υπό την αιγίδα του οργανισμού ISRG (Internet Security Research Group), ο οποίος είναι ο ιδρυτής του έργου Let's Encrypt και προωθεί το HTTPS και την ανάπτυξη τεχνολογιών για την αύξηση της ασφάλειας του Διαδίκτυο. Τα κεφάλαια θα διατεθούν από την Google, η οποία θα πληρώσει για το έργο του Miguel Ojeda, του συγγραφέα του έργου Rust-for-Linux. Προηγουμένως, η ISRG και η Google έχουν ήδη χρηματοδοτήσει τη δημιουργία ενός εναλλακτικού συστήματος υποστήριξης HTTP για το βοηθητικό πρόγραμμα curl και την ανάπτυξη μιας νέας ενότητας TLS για τον διακομιστή Apache http.

Σύμφωνα με τη Microsoft και την Google, περίπου το 70% των τρωτών σημείων προκαλούνται από μη ασφαλή χειρισμό μνήμης. Αναμένεται ότι η χρήση της γλώσσας Rust για την ανάπτυξη στοιχείων πυρήνα, όπως προγράμματα οδήγησης συσκευών, θα μειώσει τον κίνδυνο τρωτών σημείων που προκαλούνται από τον μη ασφαλή χειρισμό της μνήμης και θα εξαλείψει σφάλματα όπως η πρόσβαση σε μια περιοχή μνήμης μετά την απελευθέρωσή της και η υπέρβαση των ορίων buffer.

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

Πηγή: opennet.ru

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