Ilmus programmeerimiskeele Rust 1.34 uus versioon, mille arendusega tegeleb Mozilla. Keel keskendub mäluga ohutule töötamisele, tagab automaatse mäluhalduse ja pakub vahendeid kõrge üheaegse töötluse saavutamiseks, samas vältides prügi kogumise ja runtime'i kasutamist.
Rust'i automaatne mäluhaldus vabastab arendaja mälupointeritega manipuleerimise vajadusest ja kaitseb madala taseme mälutöötlusest tulenevate probleemide nagu vabastatud mälu alale järele pääsemise, nullpointerite dereferentseerimise, mälupiiride ületamise jne eest. Raamatukogude levitamiseks, projekti ehitamiseks ja sõltuvuste haldamiseks arendatakse pakihaldurit Cargo, mis võimaldab vajalikud raamatukogud programmile ühe klikiga hankida. Raamatukogude majutamiseks toetatakse reposiitrium crates.io.
Põhilised uuendused:
- Cargo pakettihaldurisse on lisatud vahendid, mis võimaldavad töötada alternatiivsete pakettide registritega, mis saavad eksisteerida koos avaliku registriga crates.io. Näiteks saavad suletud rakenduste arendajad nüüd kasutada oma isiklikku privaatset registrit, mida saab kasutada sõltuvuste loetlemisel Cargo.toml failis ning rakendada oma toodetele versioonimudelit, mis on sarnane crates.io-le, ning viidata sõltuvustes nii crates.io-le kui ka enda registrile.
Välist registrit on võimalik lisada ~/.cargo/config
jaotises «[registries]» on olemas uus valik «my-registry», ning välist registrit on võimalik mainida sõltuvustes Cargo.toml failis jaotises «[dependencies]» uue valikuga «other-crate». Lisaregistrile ühendamiseks on piisav, kui paigutada autentimistoken faili ~/.cargo/credentials ja käivitada käsk
«cargo login —registry=my-registry», ja paketi avaldamiseks —
«cargo publish —registry=my-registry»; - Lisatud on täielik tugi «?» operaatori kasutamiseks doctestides, mis võimaldavad kasutada dokumendi näidiskoodi testidena. Varasemalt operaator
«?» võidi kasutada vigade töötlemiseks testimise käigus ainult siis, kui olemas oli funktsioon «fn main()» või funktsioonides «#[test]»; - Protseduuriliste makrode abil määratud kohandatud atribuutidel (custom attribute) on tagatud võimalus kasutada meelevaldseid tokenite kogumeid («#[attr($tokens)]», «#[attr[$tokens]]» ja #[attr{$tokens}]»). Varem võis elemente määrata ainult puu-/rekursiivsel viisil stringiliteraalide abil, näiteks «#[foo(bar, baz(quux, foo = «bar»))]», kuid nüüd on võimalik kasutada ka enum'e (‘#[range(0..10)]’) ja konstruktsioone nagu «#[bound(T: MyTrait)]»;
- Stabiliseeritud on TryFrom ja TryInto tüübid, mis võimaldavad teostada tüüpide konverteerimist vigade käsitlemisega. Näiteks meetodid nagu from_be_bytes, mille sisendiks on täisarvutüübid, kasutavad massiive, kuid andmed saabuvad sageli Slice-tüübis, ning massiivide ja slice'ide vahelise konverteerimise tegemine käsitsi on problemaatiline. Uute tüüpide abil saab nimetatud operatsiooni teostada reaalajas, kasutades .try_into() kutsungit, näiteks „let num = u32::from_be_bytes(slice.try_into()?)“. Konverteerimise korral, mis lõpeb alati edukalt (näiteks tüübist u8 tüübiks u32) on lisatud Infallible eksitüübi, mis võimaldab läbipaistvat kasutamist.
TryFrom on rakendatud kõigi olemasolevate «From» teostuste jaoks; - Funktsioon CommandExt::before_exec on kuulutatud aegunuks, mis võimaldas teostada käitlejat enne exec'i käivitamist, mis toimus lapsprotsessi kontekstis, mis oli lahknev pärast fork() kutsungit. Sellistes tingimustes võidi mõned vanemprotsessi ressursid, nagu failide descriptorid ja peegeldatud mälu piirkonnad, dubleerida, mis võis põhjustada määramatut käitumist ja vale töö raamatukogudes.
Soovitatav on kasutada unsafe-funktsiooni CommandExt::pre_exec asemel. - Stabiliseeritud on allkirjaga ja allkirjata atomaarseid täisarvutüüpe suurustega 8 kuni 64 bitti (nt AtomicU8), samuti allkirjaga tüüpe NonZeroI[8|16|32|54|128].
- Uus partii API-d on muudetud stabiilseks, sealhulgas stabiliseeritud meetodid Any::type_id, Error::type_id, slice::sort_by_cached_key, str::escape_*, str::split_ascii_whitespace, Instant::checked_[add|sub] ja SystemTime::checked_[add|sub]. Stabiliseeritud on funktsioonid iter::from_fn ja iter::successors;
- Kõikide täisarvutüüpide jaoks on rakendatud meetodid checked_pow, saturating_pow, wrapping_pow ja overflowing_pow;
- Lisatud on võimalus aktiveerida optimeerimised linkimise etapis, määrates koostamisvaliku «-C linker-plugin-lto» (rustc kompileerib Rusti koodi LLVM-i bitikoodiks, mis võimaldab rakendada LTO-optimeerimisi).
Allikas: opennet.ru
