Izid programskega jezika Rust 1.75 in unikernel Hermit 0.6.7

Objavljena je bila izdaja splošnega programskega jezika Rust 1.75, ki ga je ustanovil projekt Mozilla, zdaj pa se razvija pod okriljem neodvisne neprofitne organizacije Rust Foundation. Jezik se osredotoča na varnost pomnilnika in zagotavlja sredstva za doseganje visoke paralelnosti opravil, hkrati pa se izogiba uporabi zbiralnika smeti in izvajalnega okolja (izvajalni čas je zmanjšan na osnovno inicializacijo in vzdrževanje standardne knjižnice).

Rustove metode ravnanja s pomnilnikom rešijo razvijalca pred napakami pri ravnanju s kazalci in ščitijo pred težavami, ki nastanejo zaradi ravnanja s pomnilnikom na nizki ravni, kot je dostop do območja pomnilnika, potem ko je bilo osvobojeno, dereferenciranje ničelnih kazalcev, prekoračitev medpomnilnika itd. Za distribucijo knjižnic, zagotavljanje gradenj in upravljanje odvisnosti projekt razvija upravitelja paketov Cargo. Repozitorij crates.io je podprt za gostovanje knjižnic.

Varnost pomnilnika je v Rustu zagotovljena v času prevajanja s preverjanjem sklicevanj, spremljanjem lastništva objekta, spremljanjem življenjskih dob objektov (obseg) in ocenjevanjem pravilnosti dostopa do pomnilnika med izvajanjem kode. Rust zagotavlja tudi zaščito pred celoštevilskimi prelivi, zahteva obvezno inicializacijo vrednosti spremenljivk pred uporabo, bolje obravnava napake v standardni knjižnici, privzeto uporablja koncept nespremenljivih referenc in spremenljivk, ponuja močno statično tipkanje za zmanjšanje logičnih napak.

Glavne novosti:

  • Dodana možnost uporabe zapisa »async fn« in »->impl Trait« v zasebnih lastnostih. Na primer, z uporabo “->impl Trait” lahko napišete metodo lastnosti, ki vrne iterator: trait Container { fn items(&self) -> impl Iterator; } impl Vsebnik za MyContainer { fn items(&self) -> impl Iterator { self.items.iter().cloned() } }

    Lastnosti lahko ustvarite tudi z uporabo "async fn": trait HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // bo razširjen na: // fn fetch(&self, url: Url) -> impl Future; }

  • Dodan API za izračun bajtnih odmikov glede na kazalce. Pri delu z golimi kazalci (»*const T« in »*mut T«) bodo morda potrebne operacije za dodajanje odmika kazalcu. Prej je bilo za to mogoče uporabiti konstrukcijo, kot je “::add(1)”, ki je dodala število bajtov, ki ustrezajo velikosti “size_of::()”. Novi API poenostavlja to operacijo in omogoča manipulacijo bajtnih odmikov brez predhodnega pretvorbe tipov v "*const u8" ali "*mut u8".
    • kazalec::byte_add
    • kazalec::byte_offset
    • kazalec::byte_offset_from
    • kazalec::byte_sub
    • kazalec::wrapping_byte_add
    • pointer::wrapping_byte_offset
    • kazalec::wrapping_byte_sub
  • Nadaljevanje dela za povečanje zmogljivosti prevajalnika rustc. Dodan optimizator BOLT, ki se izvaja v fazi po povezavi in ​​uporablja informacije iz vnaprej pripravljenega izvedbenega profila. Uporaba BOLT vam omogoča, da pospešite izvajanje prevajalnika za približno 2 %, tako da spremenite postavitev kode knjižnice librustc_driver.so za učinkovitejšo uporabo predpomnilnika procesorja.

    Vključena izdelava prevajalnika rustc z možnostjo "-Ccodegen-units=1" za izboljšanje kakovosti optimizacije v LLVM. Opravljeni testi kažejo povečanje zmogljivosti v primeru gradnje “-Ccodegen-units=1” za približno 1.5 %. Dodane optimizacije so privzeto omogočene samo za platformo x86_64-unknown-linux-gnu.

    Prej omenjene optimizacije je Google preizkusil za skrajšanje časa gradnje komponent platforme Android, napisanih v Rustu. Uporaba »-C codegen-units=1« pri gradnji Androida nam je omogočila zmanjšanje velikosti kompleta orodij za 5.5 % in povečanje njegove zmogljivosti za 1.8 %, medtem ko se je čas gradnje samega kompleta orodij skoraj podvojil.

    Omogočanje zbiranja smeti ob povezavi (»--gc-sections«) je povečalo zmogljivost do 1.9 %, omogočanje optimizacije časa povezave (LTO) do 7.7 % in optimizacije na podlagi profila (PGO) do 19.8 %. Na koncu so bile uporabljene optimizacije s pripomočkom BOLT, ki je omogočil povečanje hitrosti gradnje na 24.7%, vendar se je velikost nabora orodij povečala za 10.9%.

    Izid programskega jezika Rust 1.75 in unikernel Hermit 0.6.7

  • Nov del API-ja je bil premaknjen v kategorijo stabilnega, vključno s stabiliziranimi metodami in implementacijami lastnosti:
    • Atomic*::from_ptr
    • FileTimes
    • FileTimesExt
    • File::set_modified
    • File::set_times
    • IpAddr::to_canonical
    • Ipv6Addr::to_canonical
    • Option::as_slice
    • Option::as_mut_slice
    • kazalec::byte_add
    • kazalec::byte_offset
    • kazalec::byte_offset_from
    • kazalec::byte_sub
    • kazalec::wrapping_byte_add
    • pointer::wrapping_byte_offset
    • kazalec::wrapping_byte_sub
  • Atribut "const", ki določa možnost uporabe v katerem koli kontekstu namesto konstant, se uporablja v funkcijah:
    • Ipv6Addr::to_ipv4_mapped
    • MogočeUninit::assume_init_read
    • MogočeUninit::nastavljeno na ničlo
    • mem::diskriminator
    • mem::nastavljeno na ničlo
  • Tretja raven podpore je bila implementirana za platforme csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd in mipsel-unknown-netbsd. Tretja raven vključuje osnovno podporo, vendar brez avtomatiziranega testiranja, objavljanja uradnih gradenj ali preverjanja, ali je kodo mogoče zgraditi.

Poleg tega lahko opazimo novo različico projekta Hermit, ki razvija specializirano jedro (unikern), napisano v jeziku Rust, ki zagotavlja orodja za gradnjo samostojnih aplikacij, ki se lahko izvajajo na vrhu hipervizorja ali gole strojne opreme brez dodatnih plasti. in brez operacijskega sistema. Ko je zgrajena, je aplikacija statično povezana s knjižnico, ki samostojno izvaja vse potrebne funkcionalnosti, ne da bi bila vezana na jedro OS in sistemske knjižnice. Projektna koda se distribuira pod licencama Apache 2.0 in MIT. Sestavljanje je podprto za samostojno izvajanje aplikacij, napisanih v Rust, Go, Fortran, C in C++. Projekt prav tako razvija lasten zagonski nalagalnik, ki omogoča zagon Hermita s pomočjo QEMU in KVM.

Vir: opennet.ru

Dodaj komentar