Programmeerimiskeele Rust 1.75 ja unikernel Hermit 0.6.7 väljalase

Avaldatud on Mozilla projektiga rajatud, kuid nüüdseks sõltumatu mittetulundusühingu Rust Foundation egiidi all välja töötatud üldotstarbelise programmeerimiskeele Rust 1.75 väljalase. Keel keskendub mälu ohutusele ja pakub vahendeid töö kõrge paralleelsuse saavutamiseks, vältides samal ajal prügikoguja ja käitusaja kasutamist (käitusaeg lüheneb standardse teegi põhikäivitamise ja hoolduseni).

Rusti mälukäsitlusmeetodid säästavad arendajat osutitega manipuleerimisel esinevate vigade eest ja kaitsevad madala tasemega mälukäsitluse tõttu tekkivate probleemide eest, nagu mälualale juurdepääs pärast selle vabastamist, nullviidate viitamise tühistamine, puhvri ülekoormus jne. Teekide levitamiseks, järkude pakkumiseks ja sõltuvuste haldamiseks arendab projekt Cargo paketihaldurit. Hoidlat crates.io toetatakse teekide majutamiseks.

Mälu turvalisus on Rustis kompileerimise ajal tagatud viidete kontrollimise, objekti omandiõiguse jälgimise, objektide eluea (ulatuse) jälgimise ja mälule juurdepääsu õigsuse hindamise kaudu koodi täitmise ajal. Rooste pakub ka kaitset täisarvude ületäitumise eest, nõuab muutujate väärtuste kohustuslikku lähtestamist enne kasutamist, käsitleb standardteegi vigu paremini, rakendab vaikimisi muutumatute viidete ja muutujate kontseptsiooni, pakub tugevat staatilist tippimist loogiliste vigade minimeerimiseks.

Peamised uuendused:

  • Lisatud on võimalus kasutada privaatsete tunnuste puhul tähistust "async fn" ja "->impl Trait". Näiteks kasutades “->impl Trait” saate kirjutada tunnusmeetodi, mis tagastab iteraatori: tunnus Container { fn items(&self) -> impl Iterator; } impl Container for MyContainer { fn items(&self) -> impl Iterator { self.items.iter().cloned() } }

    Samuti saate tunnuseid luua kasutades "async fn": tunnus HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // laiendatakse järgmiselt: // fn fetch(&self, url: Url) -> impl Future; }

  • Lisatud API baitide nihete arvutamiseks osutite suhtes. Kui töötate tühjade osutitega ("*const T" ja "*mut T"), võib osutile nihke lisamiseks olla vaja toiminguid. Varem oli selleks võimalik kasutada konstruktsiooni nagu “::add(1)”, lisades “size_of::()” suurusele vastava baitide arvu. Uus API lihtsustab seda toimingut ja võimaldab manipuleerida baitide nihkeid ilma tüüpe esmalt "*const u8" või "*mut u8" üle kandmata.
    • 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
  • Jätkus töö rustc-kompilaatori jõudluse suurendamiseks. Lisatud on BOLT optimeerija, mis töötab linkimisjärgses etapis ja kasutab teavet eelnevalt ettevalmistatud täitmisprofiilist. BOLT kasutamine võimaldab kiirendada kompilaatori täitmist umbes 2% võrra, muutes librustc_driver.so teegi koodi paigutust protsessori vahemälu tõhusamaks kasutamiseks.

    Sisaldab rustc-kompilaatori loomist valikuga "-Ccodegen-units=1", et parandada LLVM-i optimeerimise kvaliteeti. Läbiviidud testid näitavad jõudluse suurenemist konstruktsiooni “-Ccodegen-units=1” puhul ligikaudu 1.5%. Lisatud optimeerimised on vaikimisi lubatud ainult x86_64-unknown-linux-gnu platvormi jaoks.

    Eelnevalt mainitud optimeeringuid testis Google, et vähendada Rustis kirjutatud Androidi platvormi komponentide ehitusaega. "-C codegen-units=1" kasutamine Androidi loomisel võimaldas meil tööriistakomplekti suurust 5.5% võrra vähendada ja selle jõudlust 1.8% võrra suurendada, samal ajal kui tööriistakomplekti enda ehitusaeg peaaegu kahekordistus.

    Lingiaja prügikogumise ("--gc-sections") lubamine tõi jõudluse kasvu kuni 1.9%, võimaldades lingiaja optimeerimist (LTO) kuni 7.7% ja profiilipõhise optimeerimise (PGO) kuni 19.8%. Finaalis rakendati optimeerimisi utiliidi BOLT abil, mis võimaldas suurendada ehituskiirust 24.7% -ni, kuid tööriistakomplekti suurus suurenes 10.9%.

    Programmeerimiskeele Rust 1.75 ja unikernel Hermit 0.6.7 väljalase

  • API uus osa on viidud stabiilsete kategooriasse, sealhulgas on stabiliseeritud meetodid ja tunnuste rakendused:
    • Atomic*::from_ptr
    • FileTimes
    • FileTimesExt
    • Fail::set_modified
    • Fail::set_times
    • IpAddr::to_canonical
    • Ipv6Addr::to_canonical
    • Valik:: as_slice
    • Valik::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
  • Funktsioonides kasutatakse atribuuti “const”, mis määrab võimaluse kasutada seda konstantide asemel mis tahes kontekstis:
    • Ipv6Addr::to_ipv4_mapped
    • MaybeUninit::oletame_init_read
    • MaybeUninit::null
    • mem::diskriminant
    • mem::nullitud
  • Kolmas tugitase on rakendatud platvormidele csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd ja mipsel-unknown-netbsd. Kolmas tase hõlmab põhituge, kuid ilma automaatse testimiseta, ametlike järelversioonide avaldamise või koodi loomiseta.

Lisaks võime märkida projekti Hermit uut versiooni, mis arendab spetsiaalset Rusti keeles kirjutatud tuuma (unikernel), mis pakub tööriistu iseseisvate rakenduste loomiseks, mis võivad töötada hüperviisoril või tühja riistvara peal ilma täiendavate kihtideta. ja ilma operatsioonisüsteemita. Ehitamisel seotakse rakendus staatiliselt raamatukoguga, mis rakendab iseseisvalt kõiki vajalikke funktsioone, ilma et see oleks seotud OS-i tuuma ja süsteemiteekidega. Projekti koodi levitatakse Apache 2.0 ja MIT litsentside all. Koostamist toetatakse Rust, Go, Fortran, C ja C++ keeles kirjutatud rakenduste iseseisvaks täitmiseks. Projekt arendab ka oma alglaadurit, mis võimaldab teil käivitada Hermit, kasutades QEMU ja KVM.

Allikas: opennet.ru

Lisa kommentaar