Rust 1.51 ohjelmointikielen julkaisu

Mozilla-projektin perustaman, mutta nyt itsenäisen voittoa tavoittelemattoman järjestön Rust Foundationin alaisuudessa kehitetyn järjestelmäohjelmointikielen Rust 1.51 julkaisu on julkaistu. Kieli keskittyy muistin turvallisuuteen, tarjoaa automaattisen muistinhallinnan ja tarjoaa välineet korkean tehtävien rinnakkaisuuden saavuttamiseen ilman roskankerääjää tai ajonaikaa (ajoaika on rajoittunut vakiokirjaston perusalustukseen ja ylläpitoon).

Rustin automaattinen muistinhallinta eliminoi virheet osoittimia käsiteltäessä ja suojaa matalan tason muistin käsittelystä aiheutuvilta ongelmilta, kuten muistialueen käyttämiseltä sen vapauttamisen jälkeen, nollaosoittimen viittauksilta, puskurin ylityksiltä jne. Kirjastojen jakeluun, kokoonpanon varmistamiseen ja riippuvuuksien hallintaan projektissa kehitetään Cargo-pakettien hallintaa. Crates.io-tietovarastoa tuetaan kirjastojen isännöintiin.

Tärkeimmät innovaatiot:

  • Jatkuvien geneeristen lääkkeiden käyttöön liittyvä toiminnallisuus on saanut vähimmäiselinkelpoisen tuotteen (MVP) tilan, mikä antaa vihreää valoa laajalle levinneelle käytölle. Const-geneerit mahdollistavat tyyppien yleistämisen vakioarvoiksi, ts. käytä yleisiä argumentteja, jotka on rajoitettu vakioarvoihin, ei tyyppeihin tai elinikään. Tämän ominaisuuden avulla voit käyttää kokonaislukuparametreja tyyppejä ja abstraktiota luodessasi ominaisuuksia minkä tahansa kokoisille taulukoille ilman, että sinun tarvitsee luoda erillistä tyyppiä kullekin kelvollisten arvojen alueelle varmistaaksesi, ettei rajojen ulkopuolisia esiintymiä ole.

    Alkaen nykyisestä julkaisusta taulukoille, joiden tyyppi on "[T; N]" (tyyppi T ja koko N) mahdollistaa tyypin ja koon abstraktin käyttämällä arvoja millä tahansa kokonaisluku-, boolean- ja merkkityypeillä (struct- ja enum-tyyppejä ei vielä tueta). Jatkuvat geneeriset ominaisuudet yksinkertaistavat suuresti kirjastojen kehittämistä; jos esimerkiksi haluat käyttää taulukkoa, joka ei ole sidottu tiettyyn tyyppiin ja kokoon, voit määrittää: struct Array { // ^^^^^^ ^^^^^^^ ^^^^^^ vakion yleisluettelon määritelmä: [T; LENGTH] // ^^^^^^ sen käyttö }

    Kun sitä todella käytetään tämän "Array" määritelmän kanssa, kääntäjä luo monomorfisen version Arraysta: struct Array { list: [u8; 32] }

  • Vakioihin geneereihin perustuva std::array::IntoIter API on stabiloitu, jolla voit luoda iteraattoreita arvon perusteella mille tahansa taulukolle: fn main() { let array = [1, 2, 3, 4, 5] ; // Aiemmin arvon iteroimiseksi piti kutsua .iter()-metodi kohteelle tiedostossa array.iter().copied() { println!("{}", item); } // Nyt voit määrittää kohteelle std::array::IntoIter::new(array) { println!("{}", item); } }
  • Rahtipakettien hallinta tukee nyt uutta Cargo.toml-selvityskenttää, jonka avulla voidaan ottaa käyttöön ominaisuusselvittimen toinen versio. Määrittelijän uudessa versiossa vältetään "[ominaisuudet]"-osiossa lueteltujen riippuvuusominaisuuksien yhdistäminen silloin, kun se on sopimatonta, esimerkiksi kun sisällytetään riippuvuus, joka pyytää jotain vakioominaisuutta rakennuskomentosarjassa ja makroissa, mutta käytettäessä ei-standardista ominaisuutta. tuloksena olevassa suoritettavassa tiedostossa .

    Tähän asti riippuvuuskaaviossa useaan kertaan mainitun paketin ominaisuudet yhdistettiin. Esimerkiksi, jos projekti sisältää riippuvuuden foo, joka määrittelee ominaisuudet A ja B, ja tätä pakettia käytetään muissa paketeissa bar ja baz, vaikka bar riippuu foo:sta ominaisuudella A ja baz riippuu foo:sta ominaisuudella B, tuloksena on, että cargo yhdistää nämä ominaisuudet ja kääntää foo:n ominaisuuksilla A ja B. Tämä menetelmä voi johtaa ominaisuuteen, joka on käytössä, koska jokin riippuvuus on yhteensopimaton kohdejärjestelmän kanssa, jolle tuloksena oleva rakennelma on tehty. Esimerkiksi, kun haluat käyttää foo-versiota, jossa on "#![no_std]" suoritettavassa tiedostossa, joka on rakennettu "#![no_std]", ja käyttää samaan aikaan versiota foo "std":n kanssa rakentamisen aikana. rs. Kun määrität solver="2":n Cargo.tomlissa, paketinhallinta yrittää nyt käsitellä tätä ristiriitaa oikein ja erottaa kehittäjä-, isäntä- ja kohderiippuvuudet.

  • Cargo toteuttaa split-debuginfo-vaihtoehdon, joka on asetettu "[profile]"-osiossa, ja vastaavan lipun "-Csplit-debuginfo=unpacked" rustc:ssä, mikä tarjoaa käyttöön uuden menetelmän virheenkorjaustietojen tallentamiseen, mikä eliminoi tarpeen kutsua dsymutil-apuohjelmaa ja nopeuttaa huomattavasti prosessin rakentamista macOS:n virheenkorjaustiedoilla.
  • Stabiloitu makos "ptr::addr_of!" ja "ptr::addr_of_mut!", joiden avulla voit luoda raakaosoittimia tasaamattomille kentille. käytä std::ptr; #[repr(pakattu)] struct Pakattu { f1: u8, f2: u16, } anna pakattu = Pakattu { f1: 1, f2: 2 }; // &packed.f2 luo kohdistamattoman osoittimen, joka johtaa määrittelemättömään toimintaan. Let raw_f2 = ptr::addr_of!(packed.f2); assert_eq!(turvaton { raw_f2.read_unaligned() }, 2);
  • Uusi osa API:sta on siirretty vakaaseen luokkaan, mukaan lukien seuraavat menetelmät on stabiloitu:
    • Arc::decrement_strong_count
    • Arc::increment_strong_count
    • Once::call_once_force
    • Näkyy::seuraava_jos_eq
    • Näkyy::seuraava_jos
    • Seek::stream_position
    • array::IntoIter
    • paniikki::panic_any
    • ptr::addr_of!
    • ptr::addr_of_mut!
    • slice::fill_with
    • slice::split_inclusive_mut
    • slice::split_inclusive
    • slice::strip_prefix
    • slice::strip_suffix
    • str::split_inclusive
    • synkronointi::OnceState
    • tehtävä::Herää
  • Kolmas tukitaso on otettu käyttöön alustoille i386-unknown-linux-gnu, i486-unknown-linux-gnu, aarch64_be-unknown-linux-gnu, aarch64-unknown-linux-gnu_ilp32 ja aarch64_be-unknown-linux-gnu_ilp32 . Kolmas taso sisältää perustuen, mutta ilman automaattista testausta, virallisten koontiversioiden julkaisemista tai sen tarkistamista, voidaanko koodi rakentaa.

Lähde: opennet.ru

Lisää kommentti