Llançament del llenguatge de programació Rust 1.75 i unikernel Hermit 0.6.7

S'ha publicat el llançament del llenguatge de programació de propòsit general Rust 1.75, fundat pel projecte Mozilla, però ara desenvolupat sota els auspicis de l'organització independent sense ànim de lucre Rust Foundation. El llenguatge se centra en la seguretat de la memòria i proporciona els mitjans per aconseguir un alt paral·lelisme de treballs evitant l'ús d'un col·lector d'escombraries i el temps d'execució (el temps d'execució es redueix a la inicialització bàsica i al manteniment de la biblioteca estàndard).

Els mètodes de gestió de memòria de Rust estalvien al desenvolupador d'errors en manipular els punters i protegeixen dels problemes que sorgeixen a causa del maneig de la memòria de baix nivell, com ara accedir a una àrea de memòria després d'haver-se alliberat, desreferenciar punters nuls, desbordaments de memòria intermèdia, etc. Per distribuir biblioteques, proporcionar compilacions i gestionar dependències, el projecte desenvolupa el gestor de paquets Cargo. El repositori crates.io és compatible per allotjar biblioteques.

La seguretat de la memòria es proporciona a Rust en temps de compilació mitjançant la comprovació de referències, el seguiment de la propietat de l'objecte, el seguiment de la vida útil dels objectes (àmbits) i l'avaluació de la correcció de l'accés a la memòria durant l'execució del codi. Rust també proporciona protecció contra desbordaments d'enters, requereix la inicialització obligatòria dels valors de les variables abans de l'ús, gestiona millor els errors a la biblioteca estàndard, aplica el concepte de referències i variables immutables per defecte, ofereix una escriptura estàtica forta per minimitzar els errors lògics.

Principals innovacions:

  • S'ha afegit la possibilitat d'utilitzar "async fn" i la notació "->impl Trait" en trets privats. Per exemple, utilitzant “->impl Trait” podeu escriure un mètode de tret que retorni un iterador: trait Container { fn items(&self) -> impl Iterator; } impl Container per MyContainer { fn items(&self) -> impl Iterator { self.items.iter().cloned() } }

    També podeu crear trets utilitzant "async fn": trait HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // s'ampliarà a: // fn fetch(&self, url: Url) -> impl Future; }

  • S'ha afegit l'API per calcular els desplaçaments de bytes en relació amb els punters. Quan es treballa amb punters nus ("*const T" i "*mut T"), és possible que calguin operacions per afegir un desplaçament al punter. Anteriorment, per a això era possible utilitzar una construcció com “::add(1)”, afegint el nombre de bytes corresponent a la mida de “size_of::()”. La nova API simplifica aquesta operació i permet manipular els desplaçaments de bytes sense llançar primer els tipus a "*const u8" o "*mut u8".
    • pointer::byte_add
    • pointer::byte_offset
    • pointer::byte_offset_from
    • punter::byte_sub
    • pointer::wrapping_byte_add
    • pointer::wrapping_byte_offset
    • pointer::wrapping_byte_sub
  • Treball continuat per augmentar el rendiment del compilador rustc. S'ha afegit l'optimitzador BOLT, que s'executa en l'etapa posterior a l'enllaç i utilitza informació d'un perfil d'execució preparat prèviament. L'ús de BOLT us permet accelerar l'execució del compilador aproximadament un 2% canviant la disposició del codi de biblioteca librustc_driver.so per a un ús més eficient de la memòria cau del processador.

    S'ha inclòs la creació del compilador rustc amb l'opció "-Ccodegen-units=1" per millorar la qualitat de l'optimització a LLVM. Les proves realitzades mostren un augment del rendiment en el cas de la construcció “-Ccodegen-units=1” aproximadament un 1.5%. Les optimitzacions afegides només estan habilitades per defecte per a la plataforma x86_64-unknown-linux-gnu.

    Les optimitzacions esmentades anteriorment van ser provades per Google per reduir el temps de creació dels components de la plataforma Android escrits a Rust. L'ús de "-C codegen-units=1" en crear Android ens va permetre reduir la mida del conjunt d'eines en un 5.5% i augmentar el seu rendiment en un 1.8%, mentre que el temps de creació del conjunt d'eines gairebé es va duplicar.

    L'habilitació de la recollida d'escombraries en temps d'enllaç ("--gc-sections") va augmentar el rendiment fins a un 1.9%, permetre l'optimització de temps d'enllaç (LTO) fins a un 7.7% i les optimitzacions basades en perfils (PGO) fins a un 19.8%. Al final, es van aplicar optimitzacions mitjançant la utilitat BOLT, que va permetre augmentar la velocitat de construcció fins al 24.7%, però la mida del conjunt d'eines va augmentar un 10.9%.

    Llançament del llenguatge de programació Rust 1.75 i unikernel Hermit 0.6.7

  • Una nova part de l'API s'ha mogut a la categoria d'estable, inclosos els mètodes i les implementacions de trets s'han estabilitzat:
    • Atòmic*::from_ptr
    • FileTimes
    • FileTimesExt
    • Fitxer::set_modified
    • Fitxer::set_times
    • IpAddr::to_canonical
    • Ipv6Addr::to_canonical
    • Opció::as_slice
    • Opció::as_mut_slice
    • pointer::byte_add
    • pointer::byte_offset
    • pointer::byte_offset_from
    • punter::byte_sub
    • pointer::wrapping_byte_add
    • pointer::wrapping_byte_offset
    • pointer::wrapping_byte_sub
  • L'atribut "const", que determina la possibilitat d'utilitzar-lo en qualsevol context en lloc de constants, s'utilitza a les funcions:
    • Ipv6Addr::to_ipv4_mapped
    • PotserUninit::assume_init_read
    • PotserUninit::zeroed
    • mem::discriminant
    • mem::zeroed
  • El tercer nivell de suport s'ha implementat per a les plataformes csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd i mipsel-unknown-netbsd. El tercer nivell inclou el suport bàsic, però sense proves automatitzades, publicar compilacions oficials o comprovar si es pot crear el codi.

A més, podem destacar una nova versió del projecte Hermit, que desenvolupa un nucli especialitzat (unikernel), escrit en el llenguatge Rust, que proporciona eines per construir aplicacions autònomes que es poden executar a sobre d'un hipervisor o maquinari nu sense capes addicionals. i sense sistema operatiu. Quan es construeix, l'aplicació està enllaçada estàticament a una biblioteca, que implementa de manera independent totes les funcionalitats necessàries, sense estar lligada al nucli del sistema operatiu i a les biblioteques del sistema. El codi del projecte es distribueix sota les llicències Apache 2.0 i MIT. El muntatge és compatible per a l'execució autònoma d'aplicacions escrites en Rust, Go, Fortran, C i C++. El projecte també està desenvolupant el seu propi carregador d'arrencada que us permet llançar Hermit mitjançant QEMU i KVM.

Font: opennet.ru

Afegeix comentari