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

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

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

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

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

  • Η μορφή των μηνυμάτων που εκδίδονται από τον προεπιλεγμένο χειριστή σφαλμάτων προγράμματος (πανικός) έχει επανασχεδιαστεί. Το κείμενο που καθορίζεται στη μακροεντολή "πανικός!" εμφανίζεται τώρα σε ξεχωριστή γραμμή χωρίς εισαγωγικά, κάνοντας το μήνυμα πιο ευανάγνωστο και εξαλείφοντας τη σύγχυση όταν υπάρχουν ένθετα εισαγωγικά ή χωρίζονται σε πολλές γραμμές. fn main() { let file = "ferris.txt"; πανικός! ("ωχ όχι! {αρχείο:?} δεν βρέθηκε!"); } Υπήρχε νήμα «κύριο» πανικόβλητος στο «ω όχι! Το "ferris.txt" δεν βρέθηκε!', src/main.rs:3:5 Το νήμα "main" πανικοβλήθηκε στο src/main.rs:3:5: ω όχι! Το "ferris.txt" δεν βρέθηκε!

    Η έξοδος των μηνυμάτων που εμφανίζονται όταν ενεργοποιούνται οι μακροεντολές "assert_eq" και "assert_ne" έχει επίσης επεξεργαστεί εκ νέου. fn main() { assert_eq!("🦀", "🐟", "Το Ferris δεν είναι ψάρι"); } Υπήρχε το νήμα 'main' πανικόβλητο στο 'η διεκδίκηση απέτυχε: `(αριστερά == δεξιά)` αριστερά: `"🦀"`, δεξιά: `"🐟"`: το ferris δεν είναι ψάρι', src/main.rs: 2 :5 Το νήμα 'main' πανικοβλήθηκε στο src/main.rs:2:5: ο ισχυρισμός `αριστερά == δεξιά` απέτυχε: το ferris δεν είναι ψάρι αριστερά: "🦀" δεξιά: "🐟"

  • Σύμφωνα με το RFC 3184, έχει προστεθεί η δυνατότητα απευθείας χειρισμού των κλειδιών αποθήκευσης τοπικού νήματος (thread_local) LocalKey > και LocalKey > μέσω της χρήσης των μεθόδων get(), set(), take() και replace(), αντί της χρήσης ενός κλεισίματος "with(|inner| ...)", το οποίο εξαλείφει την ανάγκη εκτέλεσης πρόσθετου κώδικα προετοιμασίας για το προεπιλεγμένες τιμές που καθορίζονται για νέα νήματα όταν χρησιμοποιείτε τη μακροεντολή "thread_local!" thread_local! { static THINGS: Cell > = Κελλί::new(Vec::new()); } fn f() { // was THINGS.with(|i| i.set(vec![32, 1, 2])); // έγινε THINGS.set(vec![3, 1, 2]); // ... // δόθηκε v = THINGS.with(|i| i.take()); // έγινε let v: Vec = THINGS.take(); }
  • Ένα νέο τμήμα του API έχει μετακινηθεί στην κατηγορία των σταθερών, συμπεριλαμβανομένων των μεθόδων και των εφαρμογών των χαρακτηριστικών έχουν σταθεροποιηθεί:
    • Ανυπόγραφο {integer}::div_ceil
    • Ανυπόγραφο {integer}::next_multiple_of
    • Ανυπόγραφο {integer}::checked_next_multiple_of
    • std::ffi::FromBytesUntilNulError
    • std::os::unix::fs::chown
    • std::os::unix::fs::fchown
    • std::os::unix::fs::lfchown
    • Τοπικό κλειδί:: >::πάρε
    • Τοπικό κλειδί:: >:: set
    • Τοπικό κλειδί:: >::πάρε
    • Τοπικό κλειδί:: >::αντικατάσταση
    • Τοπικό κλειδί:: >::with_borrow
    • Τοπικό κλειδί:: >::with_borrow_mut
    • Τοπικό κλειδί:: >:: set
    • Τοπικό κλειδί:: >::πάρε
    • Τοπικό κλειδί:: >::αντικατάσταση
  • Το χαρακτηριστικό "const", το οποίο καθορίζει τη δυνατότητα χρήσης του σε οποιοδήποτε πλαίσιο αντί για σταθερές, χρησιμοποιείται στις συναρτήσεις:
    • rc::Αδύναμο::νέο
    • συγχρονισμός::Αδύναμο::νέο
    • NonNull::as_ref
  • Ο μεταγλωττιστής παρέχει καταγραφή των πληροφοριών έκδοσης στην ενότητα ".comment", παρόμοια με το GCC και το Clang.
  • Το τρίτο επίπεδο υποστήριξης έχει εφαρμοστεί για τις πλατφόρμες aarch64-unknown-teeos, csky-unknown-linux-gnuabiv2, riscv64-linux-android, riscv64gc-unknown-hermit, x86_64-unikraft-linux-musl και x86_64-unknown-linux -ωχός. Το τρίτο επίπεδο περιλαμβάνει βασική υποστήριξη, αλλά χωρίς αυτοματοποιημένες δοκιμές, δημοσίευση επίσημων εκδόσεων ή έλεγχο του αν μπορεί να κατασκευαστεί ο κώδικας.
  • Το δεύτερο επίπεδο υποστήριξης για την πλατφόρμα στόχο wasm32-wasi-preview1-threads έχει υλοποιηθεί. Το δεύτερο επίπεδο υποστήριξης περιλαμβάνει εγγύηση συναρμολόγησης.

Πηγή: opennet.ru

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