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

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

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

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

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

    Για να προσθέσετε ένα εξωτερικό μητρώο στο ~/.cargo/config
    παρέχεται μια νέα επιλογή "my-registry" στην ενότητα "[registries]" και έχει προστεθεί μια επιλογή "Other-crate" για να αναφέρεται το εξωτερικό μητρώο σε εξαρτήσεις στο Cargo.toml στην ενότητα "[εξαρτήσεις]". Για να συνδεθείτε σε ένα πρόσθετο μητρώο, απλώς τοποθετήστε το διακριτικό ελέγχου ταυτότητας στο αρχείο ~/.cargo/credentials και εκτελέστε την εντολή
    "cargo login --registry=my-registry" και για δημοσίευση πακέτου -
    "cargo publication -registry=my-registry";

  • Προστέθηκε πλήρης υποστήριξη για τη χρήση του τελεστή "?". σε doctests, τα οποία σας επιτρέπουν να χρησιμοποιείτε παράδειγμα κώδικα από την τεκμηρίωση ως δοκιμές. Προηγουμένως χειριστής
    "?" θα μπορούσε να χρησιμοποιηθεί για τη διαχείριση σφαλμάτων κατά την εκτέλεση της δοκιμής μόνο παρουσία της συνάρτησης "fn main()" ή στις συναρτήσεις "#[test]".

  • Σε προσαρμοσμένα χαρακτηριστικά που ορίζονται με χρήση διαδικαστικών μακροεντολών, είναι δυνατή η χρήση αυθαίρετων συνόλων διακριτικών ("#[attr($tokens)]", "#[attr[$tokens]] και #[attr{$tokens}]") . Προηγουμένως, τα στοιχεία μπορούσαν να καθοριστούν μόνο σε δέντρο/αναδρομική μορφή χρησιμοποιώντας κυριολεκτικά συμβολοσειρών, για παράδειγμα "#[foo(bar, baz(quux, foo = "bar"))]", αλλά τώρα είναι δυνατή η χρήση απαριθμήσεων (' #[εύρος (0. .10)]') και κατασκευές όπως "#[bound(T: MyTrait)]".
  • Τα χαρακτηριστικά TryFrom και TryInto έχουν σταθεροποιηθεί, επιτρέποντας μετατροπές τύπων με χειρισμό σφαλμάτων. Για παράδειγμα, μέθοδοι όπως from_be_bytes με ακέραιους τύπους χρησιμοποιούν πίνακες ως είσοδο, αλλά τα δεδομένα συχνά έρχονται σε τύπο Slice και η μετατροπή μεταξύ πινάκων και τμημάτων είναι προβληματική να γίνει με μη αυτόματο τρόπο. Με τη βοήθεια νέων χαρακτηριστικών, η καθορισμένη λειτουργία μπορεί να εκτελεστεί εν κινήσει μέσω μιας κλήσης στο .try_into(), για παράδειγμα, "let num = u32::from_be_bytes(slice.try_into()?)". Για μετατροπές που πάντα πετυχαίνουν (για παράδειγμα, από τον τύπο u8 σε u32), έχει προστεθεί ένας τύπος σφάλματος Infallible για να επιτρέπεται η διαφανής χρήση του
    TryFrom για όλες τις υπάρχουσες υλοποιήσεις του "From".

  • Καταργήθηκε η συνάρτηση CommandExt::before_exec, η οποία επέτρεπε την εκτέλεση ενός προγράμματος χειρισμού πριν από το exec που εκτελέστηκε στο πλαίσιο μιας θυγατρικής διεργασίας που διακλαδώθηκε μετά την κλήση της fork(). Κάτω από τέτοιες συνθήκες, ορισμένοι πόροι της γονικής διαδικασίας, όπως οι περιγραφείς αρχείων και οι αντιστοιχισμένες περιοχές μνήμης, θα μπορούσαν να αντιγραφούν, γεγονός που θα μπορούσε να οδηγήσει σε απροσδιόριστη συμπεριφορά και λανθασμένη λειτουργία των βιβλιοθηκών.
    Αντί για before_exec, συνιστάται η χρήση της μη ασφαλούς συνάρτησης CommandExt::pre_exec.

  • Σταθεροποιημένοι προσημειωμένοι και ανυπόγραφοι ατομικοί ακέραιοι τύποι που κυμαίνονται σε μέγεθος από 8 έως 64 bit (για παράδειγμα, AtomicU8), καθώς και προσημειωμένοι τύποι NonZeroI[8|16|32|54|128].
  • Ένα νέο τμήμα του API έχει μετακινηθεί στη σταθερή κατηγορία, συμπεριλαμβανομένων των Any::type_id, Error::type_id, slice::sort_by_cached_key, str::escape_*, str::split_ascii_whitespace, Instant::checked_[add|sub Οι μέθοδοι ] και SystemTime έχουν σταθεροποιηθεί ::checked_[add|sub]. Οι συναρτήσεις iter::from_fn και iter::successors έχουν σταθεροποιηθεί.
  • Για όλους τους ακέραιους τύπους, εφαρμόζονται οι μέθοδοι checked_pow, saturating_pow, wrapping_pow και overflowing_pow.
  • Προστέθηκε η δυνατότητα ενεργοποίησης βελτιστοποιήσεων στο στάδιο της σύνδεσης, καθορίζοντας την επιλογή δημιουργίας «-C linker-plugin-lto» (το Rustc μεταγλωττίζει τον κώδικα Rust σε bitcode LLVM, ο οποίος επιτρέπει την εφαρμογή βελτιστοποιήσεων LTO).

Πηγή: opennet.ru

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