Rust 1.59 -ohjelmointikielen julkaisu, joka tukee kokoonpanolisäyksiä

Yleiskäyttöinen ohjelmointikieli Rust 1.59, 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:

  • On mahdollista käyttää assembly-kielen lisäyksiä, jotka ovat kysyttyjä sovelluksissa, joissa on ohjattava suoritusta alhaisella tasolla tai kyettävä käyttämään erikoistuneita konekäskyjä. Kokoonpanolisäkkeet lisätään käyttämällä makroja "asm!" ja "global_asm!" käyttämällä merkkijonomuotoilusyntaksia rekistereiden nimeämiseen, joka on samanlainen kuin Rustissa merkkijonojen korvaamisessa. Kääntäjä tukee asennusohjeita x86-, x86-64-, ARM-, AArch64- ja RISC-V-arkkitehtuureille. Lisäysesimerkki: use std::arch::asm; // Kerro x 6:lla käyttämällä siirtoja ja lisää let mut x: u64 = 4; vaarallinen { asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "add {x}, {tmp}", x = inout(reg ) x, tmp = out(reg) _, ); } assert_eq!(x, 4 * 6);
  • Lisätty tuki destrukturoiduille (rinnakkaisille) tehtäville, joissa lausekkeen vasemmalla puolella on määritetty useita ominaisuuksia, viipaleita tai rakenteita. Esimerkiksi: anna (a, b, c, d, e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Rakenne { e, .. } = rakenne { e: 5, f: 3 }; assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
  • Mahdollisuus määrittää oletusarvot const geneerisille tuotteille on tarjottu: struct ArrayStorage { arr: [T; N], } impl ArrayStorage { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
  • Cargo-paketinhallinta antaa varoituksia virheellisten rakenteiden käytöstä riippuvuuksissa, jotka käsitellään kääntäjän virheiden vuoksi (esimerkiksi virheen vuoksi pakattujen rakenteiden kenttiä sallittiin lainata turvalohkoissa). Tällaisia ​​rakenteita ei enää tueta tulevassa Rust-versiossa.
  • Cargossa ja rustc:ssä on sisäänrakennettu kyky luoda suoritettavia tiedostoja, joista on poistettu virheenkorjaustiedot (strip = "debuginfo") ja symbolit (strip = "symbols"), ilman erillistä apuohjelmaa. Puhdistusasetus toteutetaan Cargo.toml:n "strip"-parametrilla: [profile.release] strip = "debuginfo", "symbols"
  • Inkrementaalinen käännös on oletuksena pois käytöstä. Syynä sanotaan olevan tilapäinen kiertotapa kääntäjän virheelle, joka johtaa kaatumisiin ja sarjattamisvirheisiin. Virheenkorjaus on jo valmisteltu, ja se sisällytetään seuraavaan julkaisuun. Palauttaaksesi inkrementaalisen käännöksen voit käyttää ympäristömuuttujaa RUSTC_FORCE_INCREMENTAL=1.
  • Uusi osa API:sta on siirretty vakaan luokkaan, mukaan lukien ominaisuuksien menetelmät ja toteutukset on vakautettu:
    • std::thread::available_parallelism
    • Tulos::kopioitu
    • Tulos::kloonattu
    • arch::asm!
    • arch::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • TryFrom for u8
    • char::TryFromCharError (Klooni, Debug, Display, PartialEq, Kopioi, Eq, Error)
    • iter::zip
    • NonZeroU8::on_power_of_wo
    • NonZeroU16::on_power_of_wo
    • NonZeroU32::on_power_of_wo
    • NonZeroU64::on_power_of_wo
    • NonZeroU128::on_power_of_wo
    • DoubleEndedIterator pienikokoiselle rakenteelle
    • DoubleEndedIterator ToUppercase-rakenteelle
    • TryFrom<&mut [T]> [T; N]
    • UnwindSafe Once-rakenteelle
    • RefUnwindSafe kerran
    • aarch8:n kääntäjään sisäänrakennetut armv64 neon -tukitoiminnot
  • "const"-attribuuttia, joka määrittää mahdollisuuden käyttää missä tahansa kontekstissa vakioiden sijaan, käytetään funktioissa:
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::olettaa_init
    • mem::MaybeUninit::olettaa_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

Lähde: opennet.ru

Lisää kommentti