Version du langage de programmation Rust 1.45

Publié version 1.45 du langage de programmation système Calme, 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 élimine les erreurs lors de la manipulation des pointeurs et protège contre les problèmes résultant de la manipulation de la mémoire de bas niveau, tels que l'accès à une région mémoire après sa libération, les déréférences de pointeurs nuls, 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:

  • Éliminé de longue date imperfection lors de l'exécution de conversions entre des nombres entiers et des nombres à virgule flottante. Étant donné que le compilateur Rust utilise LLVM comme backend, les opérations de conversion de type ont été effectuées via des instructions de code intermédiaire LLVM telles que fptoui, qui ont une caractéristique importante : un comportement indéfini si la valeur résultante ne correspond pas au type cible. Par exemple, lors de la conversion de la valeur flottante 300 avec le type f32 en type entier u8, le résultat est imprévisible et peut varier selon les systèmes. Le problème est que cette fonctionnalité apparaît dans un code qui n’est pas marqué comme « dangereux ».

    Depuis Rust 1.45, le comportement du dépassement de taille de type est strictement réglementé, et l'opération de conversion "as" vérifie le débordement et force la conversion de la valeur à la valeur maximale ou minimale du type cible (pour l'exemple ci-dessus, une valeur de 300 serait converti en 255). Pour désactiver ces vérifications, des appels API supplémentaires « {f64, f32}::to_int_unchecked » sont fournis, fonctionnant en mode non sécurisé.

    fn cast(x : f32) -> u8 {
    x comme u8
    }

    fn principal() {
    soit trop_big = 300.0 ;
    soit trop_petit = -100.0 ;
    soit nan = f32::NAN;

    soit x : f32 = 1.0 ;
    soit y : u8 = dangereux { x.to_int_unchecked() } ;

    println!("too_big_casted = {}", cast(too_big)); // sortie 255
    println!("too_small_casted = {}", cast(too_small)); // sortie 0
    println!("not_a_number_casted = {}", cast(nan)); // sortie 0
    }

  • Utiliser stabilisé macros procéduralesexpressions, modèles et instructions de type fonction. Auparavant, ces macros ne pouvaient pas être appelées partout, mais uniquement dans certaines parties du code (en tant qu'appel séparé, non lié à un autre code). Étendre la façon dont les macros peuvent être appelées, à l'instar des fonctions, était l'une des exigences pour que le framework Web fonctionne. fusée dans les versions stables de Rust. Auparavant, pour obtenir une flexibilité supplémentaire dans la définition des gestionnaires dans Rocket, il fallait activer une fonctionnalité expérimentale appelée « proc_macro_hygiene », qui n'est pas disponible dans les versions stables de Rust. Cette fonctionnalité est désormais intégrée aux versions stables du langage.
  • Autorisé à utiliser des plages de type « char » pour parcourir les valeurs de plage (ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}) :

    pour ch dans 'a'..='z' {
    print!("{}", ch);
    }
    println!(); // Affichera "abcdefghijklmnopqrstuvwxyz"

  • Une nouvelle partie des API a été transférée dans la catégorie stable, notamment les API stabilisées
    Arc::as_ptr,
    BTreeMap ::remove_entry,
    Rc::as_ptr,
    rc::Faible::as_ptr,
    rc::Faible::from_raw,
    rc::Weak::into_raw,
    str::strip_prefix,
    str::strip_suffixe,
    sync::Weak::as_ptr,
    sync::Weak::from_raw,
    sync::Weak::into_raw,
    char::UNICODE_VERSION,
    Span::resolved_at,
    Span::localisé_à,
    Span::site_mixte,
    unix :: process :: CommandExt :: arg0.

  • Le compilateur rustc a ajouté la prise en charge du remplacement de diverses fonctionnalités de la plate-forme cible à l'aide de l'indicateur « target-feature », par exemple « -C target-feature=+avx2,+fma ». De nouveaux drapeaux ont également été ajoutés :
    "force-unwind-tables" pour générer des tables d'appels de déroulement, quelle que soit la stratégie de gestion des crashs ; "embed-bitcode" pour contrôler si le bitcode LLVM est inclus dans les rlibs générées. L'indicateur "embed-bitcode" est activé par défaut dans Cargo pour optimiser le temps de construction et la consommation d'espace disque.

  • Un troisième niveau de support a été fourni pour les plateformes mipsel-sony-psp et thumbv7a-uwp-windows-msvc. Le troisième niveau implique un support de base, mais sans tests automatisés ni publication de versions officielles.

De plus, on peut noter histoire sur la création du plus simple приложения dans le langage Rust, commençant à utiliser le chargeur de démarrage du système et prêt à effectuer un chargement autonome à la place du système d'exploitation.
Cet article est le premier d'une série consacrée à la démonstration des techniques recherchées dans la programmation de bas niveau et le développement de systèmes d'exploitation.

Source: opennet.ru

Ajouter un commentaire