Version du langage de programmation Rust 1.40

Publié version du langage de programmation système Rouille 1.40, fondé par le projet Mozilla. Le langage se concentre sur la sécurité de la mémoire, assure une gestion automatique de la mémoire et fournit des outils permettant d'atteindre un parallélisme élevé des tâches sans utiliser de garbage collector et d'exécution.

La gestion automatique de la mémoire de Rust libère le développeur de la manipulation du pointeur et le protège contre les problèmes résultant de la manipulation de la mémoire de bas niveau, tels que les accès mémoire après libération, les déréférences de pointeur nul, les dépassements de tampon, etc. Un gestionnaire de packages est en cours de développement pour distribuer les bibliothèques, assurer l'assemblage et gérer les dépendances par le projet. Cargaison, vous permettant d'obtenir les bibliothèques nécessaires au programme en un clic. Un référentiel est pris en charge pour héberger des bibliothèques caisses.io.

principal les innovations:

  • Ajout de la possibilité de marquer les structures (struct) et les énumérations (enum avec bloc Variant) à l'aide de l'attribut "#[non_exhaustif]", lequel il permet à l'avenir, ajoutez de nouveaux champs et options aux structures et énumérations déclarées. Par exemple, les développeurs de modules comportant des structures avec des champs déclarés publiquement peuvent utiliser "#[non_exhaustive]" pour marquer les structures susceptibles d'avoir de nouveaux champs ajoutés à l'avenir. Jusqu'à présent, dans cette situation, le développeur était obligé de choisir entre déclarer les champs de manière privée et se lier à une liste de champs immuable. Le nouvel attribut supprime cette limitation et vous permet d'ajouter de nouveaux champs à l'avenir sans risquer de casser le code externe précédemment compilé. Dans les packages crate, lors de la correspondance des options dans la section « match », une définition explicite du masque « _ => {...} » est requise, couvrant les futurs champs possibles, sinon une erreur sera affichée lors de l'ajout de nouveaux champs.
  • Ajouté par la possibilité d'appeler la macro procédurale mac!() dans un contexte de type. Par exemple, vous pouvez maintenant écrire « type Foo = expand_to_type!(bar); » si « expand_to_type » est une macro procédurale.
  • Dans les blocs "extern { ... }" ajoutée la possibilité d'utiliser des macros procédurales et d'attributs, y compris les macros « bang!() », par exemple :

    macro_rules ! make_item { ($nom:ident) => { fn $nom(); } }

    externe {
    make_item!(alpha);
    make_item!(bêta);
    }

    externe "C" {
    #[my_identity_macro] fn foo();
    }

  • Dans les macros mis en œuvre possibilité de générer des éléments « macro_rules ! » Génération de "macro_rules!" possible aussi bien dans les macros de type fonction (« mac!() ») que dans les macros sous forme d'attributs (« #[mac] »).
  • Dans l'élément de mappage $m:meta ajoutée prise en charge des valeurs d'énumération de jetons arbitraires ("[TOKEN_STREAM]", "{TOKEN_STREAM}" et "(TOKEN_STREAM)"), par exemple :

    macro_rules ! accept_meta { ($m: méta) => {} }
    accept_meta!( mon::chemin );
    accept_meta!( mon::path = "lit" );
    accept_meta!( mon::chemin ( abc ) );
    accept_meta!( mon::chemin [ abc ] );
    accept_meta!( mon::chemin { abc } );

  • En mode Rust 2015, la sortie d'erreur est activée pour les problèmes identifiés lors de la vérification de l'emprunt de variables (vérificateur d'emprunt) à l'aide de la technique NLL (Non-Lexical Lifetimes). Auparavant, les avertissements étaient remplacés par des erreurs lors de l'exécution en mode Rust 2018.
    Après que le changement ait été étendu au mode Rust 2015, les développeurs ont enfin pu échapper du vieux vérificateur d'emprunt.

    Rappelons que le système de vérification basé sur un nouveau mécanisme de prise en compte de la durée de vie des variables empruntées a permis d'identifier certains problèmes qui passaient inaperçus par l'ancien code de vérification. Étant donné que les erreurs générées par de telles vérifications pouvaient affecter la compatibilité avec le code qui fonctionnait auparavant, des avertissements ont été initialement émis à la place des erreurs.

  • L'attribut « const », qui détermine la possibilité de l'utiliser dans n'importe quel contexte à la place de constantes, est utilisé pour la fonction is_power_of_two (pour les entiers non signés).
  • Une nouvelle partie de l'API a été déplacée vers la catégorie stable, y compris la macro todo!() et les méthodes slice::repeat, mem::take, BTreeMap::get_key_value, HashMap::get_key_value, ont été stabilisées.
    Option::as_deref, Option::as_deref_mut, Option::flatten, UdpSocket::peer_addr, {f32,f64}::to_be_bytes, {f32,f64}::to_le_bytes,{f32,f64}::to_ne_bytes, {f32, f64} ::from_be_bytes, {f32,f64} ::from_le_bytes et {f32,f64} ::from_ne_bytes.

  • Dans le gestionnaire de colis cargo
    mis en œuvre mise en cache des avertissements du compilateur sur le disque. Ajout de l'option "cargo metadata" à la commande "cargo metadata"--filter-plateforme" pour afficher uniquement les packages liés à la plate-forme cible spécifiée dans la colonne de résolution des dépendances. Ajout de l'option de configuration http.ssl-version pour définir des versions TLS valides.
    Ajout de la possibilité de publier la section "dépendances de développement" sans préciser la clé "version".

  • Le compilateur rustc fournit une prise en charge de troisième niveau pour les plates-formes cibles thumbv7neon-unknown-linux-musleabihf, aarch64-unknown-none-softfloat, mips64-unknown-linux-muslabi64 et mips64el-unknown-linux-muslabi64. Le troisième niveau implique un support de base, mais sans tests automatisés ni publication de versions officielles.

Source: opennet.ru

Ajouter un commentaire