Ohjelmointikielen Rust 1.75 ja unikernel Hermit 0.6.7 julkaisu

Yleiskäyttöinen ohjelmointikieli Rust 1.75, joka on perustettu Mozilla-projektilla, mutta nyt kehitetty riippumattoman voittoa tavoittelemattoman järjestön Rust Foundationin alaisuudessa, on julkaistu. Kieli keskittyy muistin turvallisuuteen ja tarjoaa välineet korkean työn rinnakkaisuuden saavuttamiseen välttäen samalla roskankeräimen ja ajonajan käyttöä (ajoaika rajoittuu vakiokirjaston perusalustukseen ja ylläpitoon).

Rustin muistinkäsittelymenetelmät säästävät kehittäjää virheiltä osoittimia käsiteltäessä ja suojaavat ongelmilta, jotka johtuvat matalan tason muistin käsittelystä, kuten muistialueen käyttäminen sen vapauttamisen jälkeen, nollaosoittimien viittauksen poistaminen, puskurin ylitykset jne. Kirjastojen jakelua, koontiversioiden tarjoamista ja riippuvuuksien hallintaa varten projekti kehittää Cargo-pakettien hallintaa. Crates.io-tietovarastoa tuetaan kirjastojen isännöintiin.

Muistin turvallisuutta tarjotaan Rustissa käännöshetkellä referenssitarkistuksen, objektin omistajuuden, objektien eliniän (laajuuden) kirjaamisen ja muistin käytön oikeellisuuden arvioimisen avulla koodin suorittamisen aikana. Ruoste tarjoaa myös suojan kokonaislukujen ylivuodoilta, vaatii muuttujien arvojen pakollisen alustamisen ennen käyttöä, käsittelee virheet paremmin standardikirjastossa, soveltaa oletusarvoisesti muuttumattomien viitteiden ja muuttujien käsitettä, tarjoaa vahvan staattisen kirjoittamisen loogisten virheiden minimoimiseksi.

Tärkeimmät innovaatiot:

  • Lisätty mahdollisuus käyttää "async fn" ja "-> iml Trait" -merkintää yksityisissä piirteissä. Esimerkiksi käyttämällä "->impl Trait" voit kirjoittaa piirremenetelmän, joka palauttaa iteraattorin: ominaisuus Container { fn items(&self) -> impl Iterator; } impl Container for MyContainer { fn items(&self) -> impl Iterator { self.items.iter().cloned() } }

    Voit myös luoda piirteitä käyttämällä "async fn":tä: ominaisuus HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // laajennetaan muotoon: // fn fetch(&self, url: Url) -> impl Future; }

  • Lisätty API tavupoikkeamien laskemiseen suhteessa osoittimiin. Kun työskentelet paljailla osoittimilla (“*const T” ja “*mut T”), osoitin saattaa vaatia toimenpiteitä siirtymän lisäämiseksi. Aikaisemmin tähän oli mahdollista käyttää rakennetta, kuten "::add(1)", lisäämällä "size_of::()":n kokoa vastaava tavumäärä. Uusi API yksinkertaistaa tätä toimintoa ja mahdollistaa tavupoikkeamien manipuloinnin ilman, että tyypit ensin lähetetään "*const u8" tai "*mut u8".
    • osoitin::byte_add
    • osoitin::byte_offset
    • pointer::byte_offset_from
    • osoitin::byte_sub
    • osoitin::wrapping_byte_add
    • osoitin::wrapping_byte_offset
    • osoitin::wrapping_byte_sub
  • Jatkettiin työtä rustc-kääntäjän suorituskyvyn parantamiseksi. Lisätty BOLT-optimointityökalu, joka toimii linkin jälkeisessä vaiheessa ja käyttää valmiiksi valmistetun suoritusprofiilin tietoja. BOLTin avulla voit nopeuttaa kääntäjän suorittamista noin 2 % muuttamalla librustc_driver.so kirjastokoodin asettelua prosessorin välimuistin tehokkaamman käytön tehostamiseksi.

    Mukana rustc-kääntäjän rakentaminen "-Ccodegen-units=1"-vaihtoehdolla optimoinnin laadun parantamiseksi LLVM:ssä. Suoritetut testit osoittavat suorituskyvyn parantuneen "-Ccodegen-units=1" -koontiversion tapauksessa noin 1.5 %. Lisätyt optimoinnit ovat oletusarvoisesti käytössä vain x86_64-unknown-linux-gnu alustalle.

    Google testasi aiemmin mainitut optimoinnit lyhentääkseen Rustilla kirjoitettujen Android-alustan komponenttien rakennusaikaa. "-C codegen-units=1":n käyttäminen Androidin rakentamisessa antoi meille mahdollisuuden pienentää työkalupakin kokoa 5.5 % ja parantaa sen suorituskykyä 1.8 %, kun taas itse työkalupakin rakennusaika lähes kaksinkertaistui.

    Linkkiaikaisen roskienkeruun ("--gc-sections") ottaminen käyttöön toi suorituskykyä jopa 1.9 %:iin, linkkiaikaisen optimoinnin (LTO) ottaminen käyttöön jopa 7.7 % ja profiilipohjaiset optimoinnit (PGO) jopa 19.8 %. Lopussa optimoinnit tehtiin BOLT-apuohjelmalla, mikä mahdollisti rakennusnopeuden nostamisen 24.7 %:iin, mutta työkalupakin koko kasvoi 10.9 %.

    Ohjelmointikielen Rust 1.75 ja unikernel Hermit 0.6.7 julkaisu

  • Uusi osa API:sta on siirretty vakaan luokkaan, mukaan lukien ominaisuuksien menetelmät ja toteutukset on vakautettu:
    • Atomic*::from_ptr
    • FileTimes
    • FileTimesExt
    • Tiedosto::set_modified
    • Tiedosto::set_times
    • IpAddr::to_canonical
    • Ipv6Addr::to_canonical
    • Vaihtoehto::as_slice
    • Vaihtoehto::as_mut_slice
    • osoitin::byte_add
    • osoitin::byte_offset
    • pointer::byte_offset_from
    • osoitin::byte_sub
    • osoitin::wrapping_byte_add
    • osoitin::wrapping_byte_offset
    • osoitin::wrapping_byte_sub
  • "const"-attribuuttia, joka määrittää mahdollisuuden käyttää missä tahansa kontekstissa vakioiden sijaan, käytetään funktioissa:
    • Ipv6Addr::to_ipv4_mapped
    • MaybeUninit::olettaa_init_read
    • MaybeUninit::zeroed
    • mem::diskriminantti
    • mem::nollattu
  • Kolmas tukitaso on otettu käyttöön alustoille csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd ja mipsel-unknown-netbsd. Kolmas taso sisältää perustuen, mutta ilman automaattista testausta, virallisten koontiversioiden julkaisemista tai sen tarkistamista, voidaanko koodi rakentaa.

Lisäksi voimme huomioida Hermit-projektin uuden version, joka kehittää erikoistuneen ytimen (unikernel), joka on kirjoitettu Rust-kielellä ja tarjoaa työkaluja itsenäisten sovellusten rakentamiseen, jotka voivat toimia hypervisorin tai paljaan laitteiston päällä ilman lisäkerroksia. ja ilman käyttöjärjestelmää. Kun sovellus on rakennettu, se on staattisesti linkitetty kirjastoon, joka toteuttaa itsenäisesti kaikki tarvittavat toiminnot ilman, että se on sidottu käyttöjärjestelmän ytimeen ja järjestelmäkirjastoihin. Projektikoodia jaetaan Apache 2.0- ja MIT-lisensseillä. Assemblya tuetaan Rust-, Go-, Fortran-, C- ja C++-kielellä kirjoitettujen sovellusten itsenäiseen suorittamiseen. Projekti kehittää myös omaa käynnistyslatainta, jonka avulla voit käynnistää Hermitin QEMU:n ja KVM:n avulla.

Lähde: opennet.ru

Lisää kommentti