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

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

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

Ο κύριος καινοτομίες:

  • Σταθεροποιήθηκε μια νέα σύνταξη ασύγχρονου προγραμματισμού που βασίζεται στη συνάρτηση "async", το μπλοκ async move { ... } και τον τελεστή ".await", που διευκολύνει τη σύνταξη χειριστών που δεν εμποδίζουν τη ροή κύριας εντολών. Σε σύγκριση με το API που προσφέρθηκε προηγουμένως για ασύγχρονες εισόδους/εξόδους, οι κατασκευές async/.await είναι απλές στην κατανόηση, ευανάγνωστες και σας επιτρέπουν να εφαρμόσετε πολύπλοκες ασύγχρονες αλληλεπιδράσεις χρησιμοποιώντας γνωστές τεχνικές ελέγχου ροής που βασίζονται σε βρόχους, δηλώσεις υπό όρους και εξαιρέσεις.

    Η σύνταξη Async-wait σάς επιτρέπει να δημιουργήσετε συναρτήσεις που μπορούν να θέσουν σε παύση την εκτέλεσή τους, να επιστρέψουν τον έλεγχο στο κύριο νήμα και, στη συνέχεια, να συνεχίσουν την εκτέλεση από το σημείο που σταμάτησαν. Για παράδειγμα, απαιτείται μια τέτοια παύση κατά την επεξεργασία I/O, στην οποία μπορούν να γίνουν άλλες εργασίες ενόσω περιμένουμε να φτάσει το επόμενο κομμάτι δεδομένων. Οι συναρτήσεις και τα μπλοκ που ορίζονται με "async fn" και "async move" επιστρέφουν ένα χαρακτηριστικό Μελλοντικός, το οποίο ορίζει μια αναπαραγόμενη ασύγχρονη αναπαράσταση υπολογισμού. Μπορείτε να ξεκινήσετε απευθείας έναν αναβαλλόμενο υπολογισμό και να λάβετε το αποτέλεσμα χρησιμοποιώντας τον τελεστή ".wait". Καμία ενέργεια δεν εκτελείται ή προσχεδιάζεται εκ των προτέρων έως ότου κληθεί το .wait, επιτρέποντας τη δημιουργία σύνθετων ένθετων κατασκευών χωρίς επιπλέον επιβάρυνση.

    async fn first_function() -> u32 { .. }
    ...
    let future = first_function();
    ...
    έστω αποτέλεσμα: u32 = future.wait;

  • Σταθεροποιήθηκε "#![feature(bind_by_move_pattern_guards)]", που επιτρέπει τη χρήση μεταβλητών με τον τύπο σύνδεσης "με κίνηση" σε πρότυπα και χρησιμοποιήστε αναφορές σε αυτές τις μεταβλητές στην ενότητα "αν" της έκφρασης "ταιριάζω". Για παράδειγμα, πλέον επιτρέπονται οι ακόλουθες κατασκευές:

    fn main() {
    let array: Box<[u8; 4]> = Πλαίσιο::new([1, 2, 3, 4]);

    αντιστοίχιση πίνακα {
    nums
    αν nums.iter().sum::() == 10

    => {
    drop(αριθμοί);
    }
    _ => απρόσιτο!(),
    }
    }

  • Επιτρέπεται η ένδειξη γνωρίσματα κατά τον ορισμό παραμέτρων συναρτήσεων, κλεισίματος και δεικτών συνάρτησης. Υποστηρίζονται χαρακτηριστικά μεταγλώττισης υπό όρους (cfg, cfg_attr) που ελέγχουν τα διαγνωστικά μέσω lint (αποδοχή, προειδοποίηση, άρνηση και απαγόρευση) και βοηθητικές ιδιότητες κλήσης μακροεντολών.

    fn len(
    #[cfg(windows)] slice: &[u16], // χρησιμοποιήστε την παράμετρο στα Windows
    #[cfg(not(windows))] slice: &[u8], // χρήση σε άλλο λειτουργικό σύστημα
    ) -> χρήση {
    slice.len()
    }

  • Προειδοποιήσεις σχετικά με προβλήματα που εντοπίστηκαν κατά τον έλεγχο του δανεισμού μεταβλητών (έλεγχος δανεισμού) χρησιμοποιώντας την τεχνική NLL (Non-Lexical Lifetimes), μεταφρασμένο στην κατηγορία των μοιραίων σφαλμάτων. Ας υπενθυμίσουμε ότι το σύστημα επαλήθευσης που βασίζεται σε έναν νέο μηχανισμό για τη συνεκτίμηση της διάρκειας ζωής των δανεισμένων μεταβλητών κατέστησε δυνατό τον εντοπισμό ορισμένων προβλημάτων που πέρασαν απαρατήρητα από τον παλιό κωδικό επαλήθευσης. Δεδομένου ότι η έξοδος σφάλματος για τέτοιους ελέγχους θα μπορούσε να επηρεάσει τη συμβατότητα με τον κώδικα που λειτουργούσε προηγουμένως, αρχικά εκδόθηκαν προειδοποιήσεις αντί για σφάλματα. Οι προειδοποιήσεις έχουν πλέον αντικατασταθεί με σφάλματα κατά την εκτέλεση σε λειτουργία Rust 2018. Στην επόμενη έκδοση, η έξοδος σφάλματος θα εφαρμοστεί επίσης στη λειτουργία Rust 2015, η οποία τελικά θα απαλλαγεί από τον παλιό ελεγκτή δανείου.
  • Το χαρακτηριστικό "const", το οποίο καθορίζει τη δυνατότητα χρήσης σε οποιοδήποτε πλαίσιο αντί για σταθερές, χρησιμοποιείται για τις συναρτήσεις Vec::new, String::new, LinkedList::new, str::len, [T]::len , str::as_bytes,
    κοιλιακούς, wrapping_abs και overflowing_abs.

  • Ένα νέο τμήμα API μεταφέρθηκε στη σταθερή κατηγορία, συμπεριλαμβανομένων μεθόδων που έχουν σταθεροποιηθεί
    Pin::into_inner, Instant::checked_duration_since και Instant::saturating_duration_since;

  • Ο διαχειριστής πακέτων φορτίου έχει πλέον τη δυνατότητα να χρησιμοποιεί την επέκταση ".toml" για αρχεία διαμόρφωσης. Προστέθηκε προκαταρκτική υποστήριξη για την κατασκευή της τυπικής βιβλιοθήκης απευθείας από την Cargo. Προστέθηκε η σημαία "--χώρος εργασίας", αντικαθιστώντας την αμφιλεγόμενη σημαία "--όλα". Ένα νέο πεδίο προστέθηκε στα μεταδεδομένα "δημοσιεύει", που σας επιτρέπει να δημοσιεύετε εξαρτήσεις καθορίζοντας μια ετικέτα git και τον αριθμό έκδοσης. Προστέθηκε η επιλογή δοκιμής "-Ztimings" για τη δημιουργία μιας αναφοράς HTML των χρόνων εκτέλεσης διαφόρων σταδίων μεταγλώττισης.
  • Στον μεταγλωττιστή rustc, τα διαγνωστικά μηνύματα περιλαμβάνουν την περικοπή των ουρών του κώδικα που δεν χωράει στο τερματικό. Παρέχεται τρίτο επίπεδο υποστήριξης για πλατφόρμες-στόχους
    i686-unknown-uefi και sparc64-unknown-openbsd. Το τρίτο επίπεδο περιλαμβάνει βασική υποστήριξη, αλλά χωρίς αυτοματοποιημένες δοκιμές και δημοσίευση επίσημων εκδόσεων.

Πηγή: opennet.ru

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