Sortie du langage de programmation Rust 1.75 et unikernel Hermit 0.6.7

La sortie du langage de programmation polyvalent Rust 1.75, 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 :

  • Ajout de la possibilité d'utiliser « async fn » et la notation « ->impl Trait » dans les traits privés. Par exemple, en utilisant « ->impl Trait », vous pouvez écrire une méthode de trait qui renvoie un itérateur : trait Container { fn items(&self) -> impl Iterator; } Conteneur impl pour MyContainer { fn items(&self) -> impl Iterator { self.items.iter().cloned() } }

    Vous pouvez également créer des traits en utilisant "async fn" : trait HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // sera étendu à : // fn fetch(&self, url: Url) -> impl Future; }

  • Ajout d'une API pour calculer les décalages d'octets par rapport aux pointeurs. Lorsque vous travaillez avec des pointeurs nus (« *const T » et « *mut T »), des opérations peuvent être nécessaires pour ajouter un décalage au pointeur. Auparavant, pour cela, il était possible d'utiliser une construction comme « ::add(1) », en ajoutant le nombre d'octets correspondant à la taille de « size_of::() ». La nouvelle API simplifie cette opération et permet de manipuler les décalages d'octets sans convertir au préalable les types en "*const u8" ou "*mut u8".
    • pointeur ::byte_add
    • pointeur ::byte_offset
    • pointeur ::byte_offset_from
    • pointeur ::byte_sub
    • pointeur :: wrapping_byte_add
    • pointeur :: wrapping_byte_offset
    • pointeur :: wrapping_byte_sub
  • Poursuite du travail pour augmenter les performances du compilateur rustc. Ajout de l'optimiseur BOLT, qui s'exécute dans la phase post-lien et utilise les informations d'un profil d'exécution pré-préparé. L'utilisation de BOLT vous permet d'accélérer l'exécution du compilateur d'environ 2 % en modifiant la disposition du code de la bibliothèque librustc_driver.so pour une utilisation plus efficace du cache du processeur.

    Inclus la construction du compilateur rustc avec l'option "-Ccodegen-units=1" pour améliorer la qualité de l'optimisation dans LLVM. Les tests effectués montrent une augmentation des performances dans le cas de la version « -Ccodegen-units=1 » d'environ 1.5 %. Les optimisations ajoutées sont activées par défaut uniquement pour la plateforme x86_64-unknown-linux-gnu.

    Les optimisations mentionnées précédemment ont été testées par Google pour réduire le temps de construction des composants de la plateforme Android écrits en Rust. L'utilisation de « -C codegen-units=1 » lors de la création d'Android nous a permis de réduire la taille de la boîte à outils de 5.5 % et d'augmenter ses performances de 1.8 %, tandis que le temps de construction de la boîte à outils elle-même a presque doublé.

    L'activation du garbage collection au moment du lien (« --gc-sections ») a apporté un gain de performances jusqu'à 1.9 %, permettant une optimisation du temps de lien (LTO) jusqu'à 7.7 % et des optimisations basées sur le profil (PGO) jusqu'à 19.8 %. Au final, des optimisations ont été appliquées à l'aide de l'utilitaire BOLT, ce qui a permis d'augmenter la vitesse de construction à 24.7 %, mais la taille de la boîte à outils a augmenté de 10.9 %.

    Sortie du langage de programmation Rust 1.75 et unikernel Hermit 0.6.7

  • 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 :
    • Atomique*::from_ptr
    • Horaires des fichiers
    • FichierTimesExt
    • Fichier :: set_modified
    • Fichier ::set_times
    • Adresse IP : to_canonical
    • Ipv6Addr :: to_canonical
    • Option ::as_slice
    • Option ::as_mut_slice
    • pointeur ::byte_add
    • pointeur ::byte_offset
    • pointeur ::byte_offset_from
    • pointeur ::byte_sub
    • pointeur :: wrapping_byte_add
    • pointeur :: wrapping_byte_offset
    • pointeur :: wrapping_byte_sub
  • L'attribut « const », qui détermine la possibilité de l'utiliser dans n'importe quel contexte à la place de constantes, est utilisé dans les fonctions :
    • Ipv6Addr :: to_ipv4_mapped
    • Peut-êtreUninit :: assume_init_read
    • MaybeUninit :: mis à zéro
    • mem::discriminant
    • mem::mis à zéro
  • Le troisième niveau de support a été implémenté pour les plateformes csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd et mipsel-unknown-netbsd. Le troisième niveau implique un support de base, mais sans tests automatisés, sans publication de versions officielles ni vérification si le code peut être construit.

De plus, on peut noter une nouvelle version du projet Hermit, qui développe un noyau spécialisé (unikernel), écrit en langage Rust, fournissant des outils pour construire des applications autonomes pouvant s'exécuter sur un hyperviseur ou du matériel nu sans couches supplémentaires. et sans système d'exploitation. Une fois construite, l'application est liée statiquement à une bibliothèque, qui implémente indépendamment toutes les fonctionnalités nécessaires, sans être liée au noyau du système d'exploitation et aux bibliothèques système. Le code du projet est distribué sous licences Apache 2.0 et MIT. Assembly est pris en charge pour l'exécution autonome d'applications écrites en Rust, Go, Fortran, C et C++. Le projet développe également son propre chargeur de démarrage qui vous permet de lancer Hermit en utilisant QEMU et KVM.

Source: opennet.ru

Ajouter un commentaire