Eldono de la programlingvo Rust 1.75 kaj unikernel Hermit 0.6.7

La eldono de la ĝeneraluzebla programlingvo Rust 1.75, fondita de la projekto Mozilla, sed nun disvolvita sub la aŭspicioj de la sendependa neprofitcela organizaĵo Rust Foundation, estis publikigita. La lingvo temigas memorsekurecon kaj disponigas la rimedojn por atingi altan laborparalelecon evitante la uzon de rubkolektilo kaj rultempo (rultempo estas reduktita al baza inicialigo kaj prizorgado de la norma biblioteko).

La memormanipulaj metodoj de Rust savas la ellaboranton de eraroj dum manipulado de montriloj kaj protektas kontraŭ problemoj kiuj ekestas pro malaltnivela memortraktado, kiel ekzemple alirado de memorareo post kiam ĝi estis liberigita, dereferencing nulmontriloj, bufrotranspaso, ktp. Por distribui bibliotekojn, provizi konstruaĵojn kaj administri dependecojn, la projekto disvolvas la Cargo-pakaĵmanaĝeron. La deponejo crates.io estas subtenata por gastigado de bibliotekoj.

Memorsekureco estas disponigita en Rust ĉe kompiltempo tra referenckontrolado, konservante trakon de objektoposedo, konservante trakon de objektovivdaŭroj (kampoj), kaj taksante la ĝustecon de memoraliro dum kodekzekuto. Rusto ankaŭ provizas protekton kontraŭ entjeraj superfluoj, postulas devigan inicialigon de variaj valoroj antaŭ uzo, pli bone pritraktas erarojn en la norma biblioteko, aplikas la koncepton de neŝanĝeblaj referencoj kaj variabloj defaŭlte, ofertas fortan senmovan tajpadon por minimumigi logikajn erarojn.

Ĉefaj novigoj:

  • Aldonis la kapablon uzi "async fn" kaj la notacion "->impl Trait" en privataj trajtoj. Ekzemple, uzante “->impl Trait” vi povas skribi trajtmetodon, kiu resendas iteraton: trait Container { fn items(&self) -> impl Iterator; } impl Ujo por MyContainer { fn items(&self) -> impl Iterator { self.items.iter().cloned() } }

    Vi ankaŭ povas krei trajtojn uzante "async fn": trait HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // estos vastigita al: // fn fetch(&self, url: Url) -> impl Future; }

  • Aldonita API por kalkulado de bajtaj ofsetoj rilate al montriloj. Kiam oni laboras kun nudaj montriloj ("*const T" kaj "*mut T"), operacioj povas esti postulataj por aldoni ofseton al la montrilo. Antaŭe, por tio eblis uzi konstruon kiel “::add(1)”, aldonante la nombron da bajtoj responda al la grandeco de “size_of::()”. La nova API simpligas ĉi tiun operacion kaj ebligas manipuli bajtajn ofsetojn sen unue ĵeti la tipojn al "*const u8" aŭ "*mut u8".
    • montrilo::byte_add
    • montrilo::byte_offset
    • pointer::byte_offset_from
    • montrilo::byte_sub
    • pointer::wrapping_byte_add
    • pointer::wrapping_byte_offset
    • pointer::wrapping_byte_sub
  • Daŭra laboro por pliigi la rendimenton de la rustc-kompililo. Aldonita la BOLT-optimumiganto, kiu funkcias en la post-liga stadio kaj uzas informojn de antaŭpreparita ekzekutprofilo. Uzado de BOLT ebligas al vi plirapidigi la ekzekuton de la kompililo je ĉirkaŭ 2% ŝanĝante la aranĝon de la biblioteko librostc_driver.so por pli efika uzo de la procesora kaŝmemoro.

    Inkluzive konstrui la rustc-kompililon kun la opcio "-Ccodegen-units=1" por plibonigi la kvaliton de optimumigo en LLVM. La testoj faritaj montras pliiĝon en rendimento en la kazo de la konstruo "-Ccodegen-units=1" je proksimume 1.5%. La aldonitaj optimumigoj estas ebligitaj defaŭlte nur por la platformo x86_64-unknown-linux-gnu.

    La antaŭe menciitaj optimumigoj estis provitaj de Google por redukti la konstrutempon de Android-platformkomponentoj skribitaj en Rust. Uzi "-C codegen-units=1" dum konstruado de Android permesis al ni redukti la grandecon de la ilaro je 5.5% kaj pliigi ĝian rendimenton je 1.8%, dum la konstrutempo de la ilaro mem preskaŭ duobliĝis.

    Ebligi ligtempan rubkolekton ("--gc-sekcioj") alportis la rendimentan gajnon ĝis 1.9%, ebligante ligtempan optimumigon (LTO) ĝis 7.7%, kaj profil-bazitajn optimumigojn (PGO) ĝis 19.8%. En la finalo, optimumigoj estis aplikitaj per la utileco BOLT, kiu ebligis pliigi la konstrurapidecon al 24.7%, sed la grandeco de la ilaro pliiĝis je 10.9%.

    Eldono de la programlingvo Rust 1.75 kaj unikernel Hermit 0.6.7

  • Nova parto de la API estis movita al la kategorio de stalo, inkluzive de la metodoj kaj efektivigoj de trajtoj estis stabiligitaj:
    • Atoma*::from_ptr
    • FileTimes
    • FileTimesExt
    • Dosiero::set_modified
    • Dosiero::set_times
    • IpAddr::to_kanoniko
    • Ipv6Addr::to_canonical
    • Opcio::as_tranĉaĵo
    • Opcio::as_mut_slice
    • montrilo::byte_add
    • montrilo::byte_offset
    • pointer::byte_offset_from
    • montrilo::byte_sub
    • pointer::wrapping_byte_add
    • pointer::wrapping_byte_offset
    • pointer::wrapping_byte_sub
  • La atributo "const", kiu determinas la eblecon uzi ĝin en iu ajn kunteksto anstataŭ konstantoj, estas uzata en la funkcioj:
    • Ipv6Addr::to_ipv4_mapped
    • EbleUninit::assume_init_read
    • EbleUninit::nuligita
    • mem::diskriminacio
    • mem::nuligita
  • La tria nivelo de subteno estis efektivigita por la platformoj csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd kaj mipsel-unknown-netbsd. La tria nivelo implikas bazan subtenon, sed sen aŭtomatigita testado, publikigado de oficialaj konstruaĵoj aŭ kontrolado ĉu la kodo povas esti konstruita.

Aldone, ni povas noti novan version de la Hermit-projekto, kiu disvolvas specialecan kernon (unikernel), skribitan en la Rust-lingvo, provizanta ilojn por konstrui memstarajn aplikaĵojn, kiuj povas funkcii super hiperviziero aŭ nuda aparataro sen pliaj tavoloj. kaj sen operaciumo. Kiam konstruita, la aplikaĵo estas statike ligita al biblioteko, kiu sendepende efektivigas la tutan necesan funkciecon, sen esti ligita al la OS-kerno kaj sistemaj bibliotekoj. La projektkodo estas distribuita sub Apache 2.0 kaj MIT-licencoj. Asembleo estas subtenata por memstara ekzekuto de aplikaĵoj skribitaj en Rust, Go, Fortran, C kaj C++. La projekto ankaŭ disvolvas sian propran ekŝargilon, kiu ebligas al vi lanĉi Hermit uzante QEMU kaj KVM.

fonto: opennet.ru

Aldoni komenton