Version du langage de programmation Rust 1.64

La sortie du langage de programmation polyvalent Rust 1.64, fondé par le projet Mozilla, mais maintenant développé sous les auspices de l'organisation indépendante à but non lucratif Rust Foundation, a été publiée. Le langage se concentre sur la sécurité de la mémoire et fournit les moyens d'atteindre un parallélisme élevé des tâches tout en évitant l'utilisation d'un ramasse-miettes et d'un temps d'exécution (le temps d'exécution est réduit à l'initialisation et à la maintenance de base de la bibliothèque standard).

Les méthodes de gestion de la mémoire de Rust évitent au développeur les erreurs lors de la manipulation des pointeurs et protègent contre les problèmes qui surviennent en raison de la gestion de la mémoire de bas niveau, comme l'accès à une zone mémoire après qu'elle a été libérée, le déréférencement des pointeurs nuls, les dépassements de mémoire tampon, etc. Pour distribuer les bibliothèques, fournir des builds et gérer les dépendances, le projet développe le gestionnaire de packages Cargo. Le référentiel crates.io est pris en charge pour l'hébergement de bibliothèques.

La sécurité de la mémoire est fournie dans Rust au moment de la compilation grâce à la vérification des références, au suivi de la propriété des objets, au suivi des durées de vie des objets (portées) et à l'évaluation de l'exactitude de l'accès à la mémoire pendant l'exécution du code. Rust fournit également une protection contre les débordements d'entiers, nécessite une initialisation obligatoire des valeurs de variables avant utilisation, gère mieux les erreurs dans la bibliothèque standard, applique le concept de références et de variables immuables par défaut, propose un typage statique fort pour minimiser les erreurs logiques.

Principales nouveautés :

  • Les exigences pour l'environnement Linux dans le compilateur, le gestionnaire de packages Cargo et la bibliothèque standard libstd ont été augmentées - les exigences minimales pour Glibc ont été augmentées de la version 2.11 à 2.17 et pour le noyau Linux de la version 2.6.32 à 3.2. Les restrictions s'appliquent également aux exécutables d'application Rust construits avec libstd. Les kits de distribution RHEL 7, SLES 12-SP5, Debian 8 et Ubuntu 14.04 répondent aux nouvelles exigences. La prise en charge de RHEL 6, SLES 11-SP4, Debian 7 et Ubuntu 12.04 sera interrompue. Les utilisateurs qui utilisent des exécutables construits par Rust dans des environnements avec un noyau Linux plus ancien sont encouragés à mettre à niveau leurs systèmes, à conserver les anciennes versions du compilateur ou à maintenir leur propre fork libstd avec des couches pour maintenir la compatibilité.

    Parmi les raisons de la fin du support des anciens systèmes Linux figurent les ressources limitées permettant de continuer à maintenir la compatibilité avec les environnements plus anciens. La prise en charge de l'ancienne Glibc nécessite l'utilisation d'outils existants lors de l'enregistrement dans un système d'intégration continue, face aux exigences croissantes en matière de versions dans LLVM et les utilitaires de compilation croisée. L'augmentation des exigences de version du noyau est due à la possibilité d'utiliser de nouveaux appels système dans libstd sans avoir besoin de maintenir des couches pour garantir la compatibilité avec les anciens noyaux.

  • Le trait IntoFuture a été stabilisé, qui ressemble à IntoIterator, mais diffère de ce dernier en utilisant des boucles « .await » au lieu de « for… in… ». Lorsqu'il est combiné avec IntoFuture, le mot-clé ".await" peut s'attendre non seulement à un trait Future, mais également à tout autre type pouvant être converti en Future.
  • L'utilitaire rust-analyzer est inclus dans la collection d'utilitaires fournis avec les versions de Rust. L'utilitaire est également disponible pour une installation à l'aide de rustup (le composant rustup ajoute un analyseur de rouille).
  • Le gestionnaire de packages Cargo inclut l'héritage de l'espace de travail pour éliminer la duplication des valeurs de champ communes entre les packages, telles que les versions Rust et les URL du référentiel. Ajout également de la prise en charge de la création de plusieurs plates-formes cibles à la fois (vous pouvez désormais spécifier plus d'un paramètre dans l'option « --target »).
  • Une nouvelle partie de l'API a été déplacée vers la catégorie stable, dont les méthodes et les implémentations des traits ont été stabilisées :
    • futur ::Dans le futur
    • num::NonZero*::checked_mul
    • num::NonZero*::checked_pow
    • num :: NonZero* :: saturating_mul
    • num :: NonZero* :: saturating_pow
    • num::NonZeroI*::abs
    • num::NonZeroI*::checked_abs
    • num :: NonZeroI* :: overflowing_abs
    • num :: NonZeroI* :: saturating_abs
    • num::NonZeroI*::unsigned_abs
    • num::NonZeroI*::wrapping_abs
    • num::NonZeroU*::checked_add
    • num::NonZeroU*::checked_next_power_of_two
    • num :: NonZeroU* :: saturating_add
    • os::unix::process::CommandExt::process_group
    • os :: windows :: fs :: FileTypeExt :: is_symlink_dir
    • os :: windows :: fs :: FileTypeExt :: is_symlink_file
  • Les types compatibles C, précédemment stabilisés dans le module std::ffi, ont été ajoutés au noyau et à la bibliothèque alloc :
    • core :: ffi :: CStr
    • core :: ffi :: FromBytesWithNulError
    • alloc::ffi::CString
    • alloc :: ffi :: FromVecWithNulError
    • alloc :: ffi :: IntoStringError
    • alloc :: ffi :: NulError
  • Des types C précédemment stabilisés dans le module std::os::raw ont été ajoutés aux modules core::ffi et std::ffi (par exemple, les types c_uint et c_ulong ont été proposés pour les types C uint et ulong) :
    • ffi::c_char
    • ffi::c_double
    • ffi::c_float
    • ffi::c_int
    • ffi::c_long
    • ffi::c_longlong
    • ffi::c_schar
    • ffi::c_short
    • ffi::c_uchar
    • ffi::c_uint
    • ffi::c_ulong
    • ffi::c_ulonglong
    • ffi::c_ushort
  • Les gestionnaires de bas niveau ont été stabilisés pour être utilisés avec le mécanisme Poll (à l'avenir, il est prévu de fournir une API simplifiée qui ne nécessite pas l'utilisation de structures de bas niveau telles que Pull et Pin) :

    • futur :: poll_fn
    • tâche : prêt !
  • L'attribut « const », qui détermine la possibilité de l'utiliser dans n'importe quel contexte à la place de constantes, est utilisé dans la fonction slice::from_raw_parts.
  • Afin de stocker les données de manière plus compacte, la disposition de la mémoire des structures Ipv4Addr, Ipv6Addr, SocketAddrV4 et SocketAddrV6 a été modifiée. Il peut y avoir un problème de compatibilité avec les packages à caisse unique qui utilisent std::mem::transmute pour la manipulation de structures de bas niveau.
  • La construction du compilateur Rust pour la plate-forme Windows utilise les optimisations PGO (optimisation guidée par profil), ce qui a permis d'augmenter les performances de compilation du code de 10 à 20 %.
  • Le compilateur a implémenté un nouvel avertissement concernant les champs inutilisés dans certaines structures.

De plus, vous pouvez noter le rapport d'état sur le développement d'une implémentation alternative du compilateur du langage Rust, préparé par le projet gccrs (GCC Rust) et approuvé pour inclusion dans GCC. Après avoir intégré le frontend, les outils standard de GCC peuvent être utilisés pour compiler des programmes en langage Rust sans avoir besoin d'installer le compilateur rustc, construit à l'aide des développements LLVM. Tant que le développement est sur la bonne voie, et sauf problèmes imprévus, l'interface Rust sera intégrée à la version GCC 13 prévue pour mai de l'année prochaine. L'implémentation GCC 13 de Rust sera en version bêta, pas encore activée par défaut.

Source: opennet.ru

Ajouter un commentaire