Lëshimi i gjuhës së programimit Rust 1.75 dhe unikernel Hermit 0.6.7

Gjuha e programimit për qëllime të përgjithshme Rust 1.75, e themeluar nga projekti Mozilla, por tani e zhvilluar nën kujdesin e organizatës së pavarur jofitimprurëse Rust Foundation, është publikuar. Gjuha fokusohet në sigurinë e kujtesës dhe siguron mjetet për të arritur paralelizëm të lartë të punës duke shmangur përdorimin e një grumbulluesi të mbeturinave dhe kohën e funksionimit (koha e funksionimit reduktohet në inicializimin bazë dhe mirëmbajtjen e bibliotekës standarde).

Metodat e trajtimit të memories Rust e ruajnë zhvilluesin nga gabimet gjatë manipulimit të treguesve dhe mbrojnë nga problemet që lindin për shkak të trajtimit të nivelit të ulët të kujtesës, të tilla si qasja në një zonë memorie pasi të jetë liruar, mosreferencimi i treguesve null, tejkalimet e buferit, etj. Për të shpërndarë bibliotekat, për të ofruar ndërtime dhe për të menaxhuar varësitë, projekti zhvillon menaxherin e paketave Cargo. Depoja e crates.io mbështetet për pritjen e bibliotekave.

Siguria e memories sigurohet në Rust në kohën e përpilimit përmes kontrollit të referencës, mbajtjes së gjurmës së pronësisë së objektit, mbajtjes së gjurmëve të jetëgjatësisë së objektit (scopes) dhe vlerësimit të saktësisë së aksesit në kujtesë gjatë ekzekutimit të kodit. Rust siguron gjithashtu mbrojtje kundër tejmbushjeve të numrave të plotë, kërkon inicializimin e detyrueshëm të vlerave të variablave përpara përdorimit, trajton më mirë gabimet në bibliotekën standarde, zbaton konceptin e referencave dhe variablave të pandryshueshme si parazgjedhje, ofron shtypje të fortë statike për të minimizuar gabimet logjike.

Risitë kryesore:

  • U shtua aftësia për të përdorur "async fn" dhe shënimin "->impl Trait" në tipare private. Për shembull, duke përdorur “->impl Trait” mund të shkruani një metodë tipare që kthen një përsëritës: tipari Container { fn items(&self) -> impl Iterator; } impl Container for MyContainer { fn artikuj(&self) -> impl Iterator {self.items.iter().kloned() } }

    Ju gjithashtu mund të krijoni tipare duke përdorur "async fn": tipar HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // do të zgjerohet në: // fn fetch(&self, url: Url) -> impl Future; }

  • U shtua API për llogaritjen e kompensimeve të bajteve në lidhje me treguesit. Kur punoni me tregues të zhveshur ("*const T" dhe "*mut T"), mund të kërkohen operacione për të shtuar një zhvendosje në tregues. Më parë, për këtë ishte e mundur të përdorej një ndërtim si "::add(1)", duke shtuar numrin e bajteve që korrespondojnë me madhësinë e "madhësia_of::()". API-ja e re e thjeshton këtë operacion dhe bën të mundur manipulimin e zhvendosjeve të bajtit pa i hedhur më parë llojet në "*const u8" ose "*mut u8".
    • treguesi::byte_add
    • treguesi::byte_offset
    • treguesi::byte_offset_from
    • treguesi::byte_sub
    • pointer::wrapping_byte_add
    • pointer::wrapping_byte_offset
    • pointer::wrapping_byte_sub
  • Puna e vazhdueshme për të rritur performancën e përpiluesit rustc. U shtua optimizuesi BOLT, i cili funksionon në fazën pas lidhjes dhe përdor informacion nga një profil ekzekutimi i përgatitur paraprakisht. Përdorimi i BOLT ju lejon të shpejtoni ekzekutimin e përpiluesit me rreth 2% duke ndryshuar paraqitjen e kodit të bibliotekës librustc_driver.so për përdorim më efikas të cache-it të procesorit.

    Përfshirë ndërtimin e përpiluesit rustc me opsionin "-Ccodegen-units=1" për të përmirësuar cilësinë e optimizimit në LLVM. Testet e kryera tregojnë një rritje të performancës në rastin e ndërtimit "-Ccodegen-units=1" me afërsisht 1.5%. Optimizimet e shtuara janë aktivizuar si parazgjedhje vetëm për platformën x86_64-unknown-linux-gnu.

    Optimizimet e përmendura më parë u testuan nga Google për të reduktuar kohën e ndërtimit të komponentëve të platformës Android të shkruar në Rust. Përdorimi i "-C codegen-units=1" gjatë ndërtimit të Android na lejoi të zvogëlojmë madhësinë e paketës së veglave me 5.5% dhe të rrisim performancën e tij me 1.8%, ndërsa koha e ndërtimit të vetë paketës së veglave pothuajse u dyfishua.

    Aktivizimi i mbledhjes së mbeturinave në kohën e lidhjes ("--gc-seksionet") solli rritjen e performancës deri në 1.9%, duke mundësuar optimizimin në kohën e lidhjes (LTO) deri në 7.7% dhe optimizimet e bazuara në profil (PGO) deri në 19.8% . Në fund, optimizimet u aplikuan duke përdorur mjetin BOLT, i cili bëri të mundur rritjen e shpejtësisë së ndërtimit në 24.7%, por madhësia e paketës së veglave u rrit me 10.9%.

    Lëshimi i gjuhës së programimit Rust 1.75 dhe unikernel Hermit 0.6.7

  • Një pjesë e re e API-së është zhvendosur në kategorinë e qëndrueshme, duke përfshirë metodat dhe implementimet e tipareve janë stabilizuar:
    • Atomike*::from_ptr
    • FileTimes
    • FileTimesExt
    • Skedari::set_modified
    • Skedari::set_times
    • IpAddr::to_canonical
    • Ipv6Addr::to_canonical
    • Opsioni::as_slice
    • Opsioni::as_mut_slice
    • treguesi::byte_add
    • treguesi::byte_offset
    • treguesi::byte_offset_from
    • treguesi::byte_sub
    • pointer::wrapping_byte_add
    • pointer::wrapping_byte_offset
    • pointer::wrapping_byte_sub
  • Atributi "const", i cili përcakton mundësinë e përdorimit të tij në çdo kontekst në vend të konstanteve, përdoret në funksionet:
    • Ipv6Addr::to_ipv4_mapped
    • NdoshtaUninit::assume_init_read
    • NdoshtaUninit::zeroed
    • mem::diskriminues
    • mem::zero
  • Niveli i tretë i mbështetjes është zbatuar për platformat csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd dhe mipsel-unknown-netbsd. Niveli i tretë përfshin mbështetjen bazë, por pa testim të automatizuar, publikim të ndërtimeve zyrtare ose kontrollim nëse kodi mund të ndërtohet.

Për më tepër, mund të vëmë re një version të ri të projektit Hermit, i cili zhvillon një kernel të specializuar (unikernel), të shkruar në gjuhën Rust, duke ofruar mjete për ndërtimin e aplikacioneve të pavarura që mund të funksionojnë në krye të një hipervizori ose harduer të zhveshur pa shtresa shtesë. dhe pa sistem operativ. Kur ndërtohet, aplikacioni lidhet në mënyrë statike me një bibliotekë, e cila zbaton në mënyrë të pavarur të gjithë funksionalitetin e nevojshëm, pa u lidhur me kernelin OS dhe bibliotekat e sistemit. Kodi i projektit shpërndahet nën licencat Apache 2.0 dhe MIT. Asambleja mbështetet për ekzekutimin e pavarur të aplikacioneve të shkruara në Rust, Go, Fortran, C dhe C++. Projekti po zhvillon gjithashtu bootloader-in e tij që ju lejon të lëshoni Hermit duke përdorur QEMU dhe KVM.

Burimi: opennet.ru

Shto një koment