Version du langage de programmation Rust 1.38

Publié version du langage de programmation système Rouille 1.38, fondé par le projet Mozilla. Le langage se concentre sur la sécurité de la mémoire, fournit une gestion automatique de la mémoire et fournit un moyen d'atteindre un parallélisme élevé des tâches sans utiliser de garbage collector ou 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 d'un mode de compilation pipeline (pipelined), dans lequel la construction d'un package de caisse dépendant commence dès que les métadonnées de dépendance deviennent disponibles, sans attendre la fin de sa compilation. Lors de la compilation d'un package, les dépendances n'ont pas besoin d'être entièrement assemblées, il suffit de définir les métadonnées, qui incluent des listes de types, de dépendances et d'éléments exportés. Les métadonnées sont mises à disposition dès le début du processus de compilation, de sorte que les packages liés peuvent désormais être compilés beaucoup plus tôt. Lors de la construction de packages uniques, le mode proposé n'affecte pas les performances, mais si la construction couvre des packages avec des dépendances branchées, le temps de construction global peut être réduit de 10 à 20 % ;
  • Assure la détection d’une utilisation incorrecte des fonctions std :: mem :: non initialisé и std :: mem :: mis à zéro. Par exemple, std::mem::uninitialized est pratique pour créer rapidement des tableaux, mais il induit le compilateur en erreur car il semble être initialisé, alors qu'en réalité la valeur reste non initialisée. La fonction mem::uninitialized est déjà marquée comme obsolète et il est recommandé d'utiliser un type intermédiaire à la place Peut-êtreUnité. Quant à mem::zeroed, cette fonction peut poser des problèmes avec les types qui ne peuvent pas accepter les valeurs nulles.

    Pour aider à identifier un comportement non défini, la nouvelle version ajoute une vérification des charpies au compilateur qui détecte certains problèmes avec mem::uninitialized ou mem::zeroed. Par exemple, vous obtenez maintenant une erreur lorsque vous essayez d'utiliser mem::uninitialized ou mem::zeroed avec les types &T et Box‹T›, qui représentent des objets pointeurs qui ne peuvent pas accepter de valeurs nulles ;

  • L'attribut « #[deprecated] » a été étendu pour permettre aux packages crate d'être marqués comme obsolètes et programmés pour une suppression future. Depuis Rust 1.38, cet attribut peut également être utilisé pour les macros ;
  • Ajout de la possibilité d'utiliser l'attribut « #[global_allocator] » dans les sous-modules ;
  • Fonction ajoutée std :: any :: type_name, qui permet de connaître le nom du type, ce qui peut être utile à des fins de débogage. Par exemple, lors de l'exécution du programme, vous pouvez découvrir pour quel type la fonction a été appelée :

    fn gen_value‹T : Par défaut>() -› T {
    println!("Initialisation d'une instance de {}", std::any::type_name::‹T›());
    Par défaut :: par défaut ()
    }

    fn principal() {
    soit _ : i32 = gen_value(); # "i32" sera imprimé
    let _ : String = gen_value(); # affichera "alloc::string::String"
    }

  • Fonctions étendues de la bibliothèque standard :
    • slice::{concat, connect, join} peut désormais prendre la valeur &[T] en plus de &T ;
    • "*const T" et "*mut T" implémentent désormais Marker::Unpin ;
    • "Arc‹[T]›" et "Rc‹[T]›" implémentent désormais FromIterator‹T› ;
    • iter::{StepBy, Peekable, Take} implémente désormais DoubleEndedIterator.
    • ascii::EscapeDefault implémente Clone et Display.
  • Une nouvelle partie des API a été transférée dans la catégorie stable, y compris les méthodes stabilisées
    • ‹*const T›::cast, ‹*mut T›::cast,
    • Durée ::as_secs_f{32|64},
    • Durée ::div_duration_f{32|64},
    • Durée ::div_f{32|64},
    • Durée ::from_secs_f{32|64},
    • Durée::mul_f{32|64},
    • opérations de division avec reste
      div_euclid et rem_euclid pour toutes les primitives entières ;

  • Ajout de la prise en charge de la spécification de l'option « --features » plusieurs fois pour activer différentes fonctionnalités dans le gestionnaire de paquets de fret ;
  • Le compilateur fournit un troisième niveau prise en charge des plates-formes cibles aarch64-uwp-windows-msvc, i686-uwp-windows-gnu, i686-uwp-windows-msvc, x86_64-uwp-windows-gnu, x86_64-uwp-windows-msvc, armv7-unknown-linux -gnueabi, armv7-unknown-linux-musleabi, hexagone-unknown-linux-musl et riscv32i-unknown-none-elf. 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