Utgivelse av programmeringsspråket Rust 1.75 og unikernel Hermit 0.6.7

Utgivelsen av Rust 1.75 generell programmeringsspråk, grunnlagt av Mozilla-prosjektet, men nå utviklet i regi av den uavhengige ideelle organisasjonen Rust Foundation, har blitt publisert. Språket fokuserer på minnesikkerhet og gir midler til å oppnå høy jobbparallellisme samtidig som man unngår bruk av en søppeloppsamler og kjøretid (kjøretiden reduseres til grunnleggende initialisering og vedlikehold av standardbiblioteket).

Rusts minnehåndteringsmetoder sparer utvikleren fra feil ved manipulering av pekere og beskytter mot problemer som oppstår på grunn av minnehåndtering på lavt nivå, for eksempel tilgang til et minneområde etter at det har blitt frigjort, avreferering av null-pekere, bufferoverskridelser, etc. For å distribuere biblioteker, tilby bygg og administrere avhengigheter, utvikler prosjektet Cargo-pakkeansvarlig. Crates.io-depotet støttes for hosting av biblioteker.

Minnesikkerhet er gitt i Rust på kompileringstidspunktet gjennom referansesjekking, holde styr på objekteierskap, holde styr på objektlevetider (scopes), og vurdere riktigheten av minnetilgang under kjøring av kode. Rust gir også beskyttelse mot heltallsoverløp, krever obligatorisk initialisering av variabelverdier før bruk, håndterer feil bedre i standardbiblioteket, bruker konseptet med uforanderlige referanser og variabler som standard, tilbyr sterk statisk skriving for å minimere logiske feil.

Hovedinnovasjoner:

  • Lagt til muligheten til å bruke "async fn" og "->impl Trait"-notasjonen i private egenskaper. For eksempel, ved å bruke "->impl Trait" kan du skrive en egenskapsmetode som returnerer en iterator: trait Container { fn items(&self) -> impl Iterator; } impl Container for MyContainer { fn items(&self) -> impl Iterator { self.items.iter().cloned() } }

    Du kan også lage egenskaper ved å bruke "async fn": trait HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // vil bli utvidet til: // fn fetch(&self, url: Url) -> impl Future; }

  • Lagt til API for å beregne byteforskyvninger i forhold til pekere. Når du arbeider med bare pekere ("*const T" og "*mut T"), kan det være nødvendig med operasjoner for å legge til en offset til pekeren. Tidligere var det mulig å bruke en konstruksjon som "::add(1)" for å legge til antall byte som tilsvarer størrelsen på "size_of::()". Det nye API-et forenkler denne operasjonen og gjør det mulig å manipulere byte-forskyvninger uten først å caste typene til "*const u8" eller "*mut u8".
    • pointer::byte_add
    • pointer::byte_offset
    • pointer::byte_offset_from
    • pointer::byte_sub
    • pointer::wrapping_byte_add
    • pointer::wrapping_byte_offset
    • pointer::wrapping_byte_sub
  • Fortsatt arbeid for å øke ytelsen til rustc-kompilatoren. Lagt til BOLT-optimalisatoren, som kjører i post-link-stadiet og bruker informasjon fra en forhåndsforberedt utførelsesprofil. Ved å bruke BOLT kan du øke hastigheten på kompilatorkjøringen med ca. 2 % ved å endre oppsettet til librustc_driver.so-bibliotekkoden for mer effektiv bruk av prosessorbufferen.

    Inkludert å bygge rustc-kompilatoren med alternativet "-Ccodegen-units=1" for å forbedre kvaliteten på optimalisering i LLVM. Testene som ble utført viser en økning i ytelse i tilfellet med "-Ccodegen-units=1" bygget med omtrent 1.5 %. De ekstra optimaliseringene er aktivert som standard bare for x86_64-unknown-linux-gnu-plattformen.

    De tidligere nevnte optimaliseringene ble testet av Google for å redusere byggetiden til Android-plattformkomponenter skrevet i Rust. Ved å bruke "-C codegen-units=1" når vi bygde Android, kunne vi redusere størrelsen på verktøysettet med 5.5 % og øke ytelsen med 1.8 %, mens byggetiden til selve verktøysettet nesten doblet seg.

    Aktivering av søppelinnsamling ved koblingstid ("--gc-seksjoner") brakte ytelsesøkningen opp til 1.9 %, aktivering av koblingstidsoptimalisering (LTO) opptil 7.7 %, og profilbaserte optimaliseringer (PGO) opptil 19.8 %. I finalen ble optimaliseringer brukt ved å bruke BOLT-verktøyet, som gjorde det mulig å øke byggehastigheten til 24.7 %, men størrelsen på verktøysettet økte med 10.9 %.

    Utgivelse av programmeringsspråket Rust 1.75 og unikernel Hermit 0.6.7

  • En ny del av API har blitt flyttet til kategorien stabil, inkludert metodene og implementeringene av egenskaper er stabilisert:
    • Atomisk*::fra_ptr
    • FileTimes
    • FileTimesExt
    • File::set_modified
    • File::set_times
    • IpAddr::to_canonical
    • Ipv6Addr::to_canonical
    • Option::as_slice
    • Option::as_mut_slice
    • pointer::byte_add
    • pointer::byte_offset
    • pointer::byte_offset_from
    • pointer::byte_sub
    • pointer::wrapping_byte_add
    • pointer::wrapping_byte_offset
    • pointer::wrapping_byte_sub
  • "const"-attributtet, som bestemmer muligheten for å bruke det i enhver kontekst i stedet for konstanter, brukes i funksjonene:
    • Ipv6Addr::to_ipv4_mapped
    • MaybeUninit::assume_init_read
    • Kanskje Uninit::nullet
    • mem::diskriminerende
    • mem::nullet
  • Det tredje støttenivået er implementert for plattformene csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd og mipsel-unknown-netbsd. Det tredje nivået innebærer grunnleggende støtte, men uten automatisert testing, publisering av offisielle bygg, eller sjekk om koden kan bygges.

I tillegg kan vi merke oss en ny versjon av Hermit-prosjektet, som utvikler en spesialisert kjerne (unikernel), skrevet på Rust-språket, og gir verktøy for å bygge selvstendige applikasjoner som kan kjøres på toppen av en hypervisor eller bare maskinvare uten ekstra lag og uten operativsystem. Når den er bygget, er applikasjonen statisk knyttet til et bibliotek, som uavhengig implementerer all nødvendig funksjonalitet, uten å være knyttet til OS-kjernen og systembibliotekene. Prosjektkoden er distribuert under Apache 2.0 og MIT-lisenser. Assembly støttes for frittstående utførelse av applikasjoner skrevet i Rust, Go, Fortran, C og C++. Prosjektet utvikler også sin egen bootloader som lar deg starte Hermit ved hjelp av QEMU og KVM.

Kilde: opennet.ru

Legg til en kommentar