Publikimi i gjuhës programuese Rust 1.34

Gjuha e programimit të sistemit Rust 1.34, e zhvilluar nga projekti Mozilla, është lëshuar. Gjuha fokusohet në sigurinë e kujtesës, siguron menaxhimin automatik të kujtesës dhe ofron një mjet për të arritur paralelizëm të lartë të detyrave pa përdorur një grumbullues mbeturinash ose kohëzgjatjeje.

Menaxhimi automatik i kujtesës i Rust e çliron zhvilluesin nga manipulimi i treguesit dhe mbron nga problemet që lindin nga manipulimi i nivelit të ulët të kujtesës, të tilla si akseset e memories pa pagesë, çreferencat e treguesit null, tejkalimet e buferit dhe të ngjashme. Për të shpërndarë bibliotekat, për të siguruar montimin dhe për të menaxhuar varësitë, projekti po zhvillon menaxherin e paketave Cargo, i cili ju lejon të merrni bibliotekat e nevojshme për programin me një klik. Depoja e crates.io mbështetet për pritjen e bibliotekave.

Risitë kryesore:

  • Menaxheri i paketave Cargo ka shtuar mjete për të punuar me regjistrat alternativë të paketave që mund të bashkëjetojnë me regjistrin publik crates.io. Për shembull, zhvilluesit e aplikacioneve të pronarit mund të përdorin tani regjistrin e tyre privat, i cili mund të përdoret kur listojnë varësitë në Cargo.toml dhe të aplikojnë një model versionimi të ngjashëm me crates.io për produktet e tyre, si dhe t'i referojnë varësitë në të dy arkat. io dhe në regjistrin tuaj.

    Për të shtuar një regjistër të jashtëm në ~/.cargo/config
    një opsion i ri "my-registry" ofrohet në seksionin "[regjistrat]" dhe një opsion "tjetër-arkë" është shtuar për të përmendur regjistrin e jashtëm në varësitë në Cargo.toml në seksionin "[varësi]". Për t'u lidhur me një regjistër shtesë, thjesht vendosni tokenin e vërtetimit në skedarin ~/.cargo/credentials dhe ekzekutoni komandën
    "cargo login --registry=my-registry" dhe për të publikuar një paketë -
    "cargo public -registry=my-registry";

  • U shtua mbështetje e plotë për përdorimin e operatorit “?”. në doctests, të cilat ju lejojnë të përdorni kodin shembull nga dokumentacioni si teste. Operator më parë
    "?" mund të përdoret për të trajtuar gabimet gjatë ekzekutimit të testit vetëm në prani të funksionit "fn main()" ose në funksionet "#[test]";

  • Në atributet e personalizuara të përcaktuara duke përdorur makro procedurale, është e mundur të përdoren grupe arbitrare të shenjave (“#[attr($tokens)]”, “#[attr[$tokens]] dhe #[attr{$tokens}]”) . Më parë, elementët mund të specifikoheshin vetëm në një formë peme/rekurzive duke përdorur vargje literale, për shembull "#[foo(bar, baz(quux, foo = "bar"))]", por tani është e mundur të përdoren numërimet (' #[range(0. .10)]') dhe konstruksione si “#[bound(T: MyTrait)]”;
  • Tiparet TryFrom dhe TryInto janë stabilizuar, duke lejuar konvertimet e tipit me trajtimin e gabimeve. Për shembull, metodat si from_be_bytes me lloje të numrave të plotë përdorin vargje si hyrje, por të dhënat shpesh vijnë në një lloj Slice dhe konvertimi midis vargjeve dhe fetave është problematik për t'u bërë manualisht. Me ndihmën e tipareve të reja, operacioni i specifikuar mund të kryhet menjëherë përmes një thirrjeje në .try_into(), për shembull, "le num = u32::from_be_bytes(slice.try_into()?)". Për konvertimet që gjithmonë kanë sukses (për shembull, nga lloji u8 në u32), është shtuar një lloj gabimi i pagabueshëm për të lejuar përdorimin transparent të
    TryFrom për të gjitha implementimet ekzistuese të "Nga";

  • U zhvlerësua funksioni CommandExt::before_exec, i cili lejoi ekzekutimin e një mbajtësi përpara exec që u ekzekutua në kontekstin e një procesi fëmijësh të deformuar pas thirrjes fork(). Në kushte të tilla, disa burime të procesit prind, si përshkruesit e skedarëve dhe zonat e memories së hartuar, mund të dublikohen, gjë që mund të çojë në sjellje të papërcaktuara dhe funksionim të gabuar të bibliotekave.
    Në vend të Before_exec, rekomandohet përdorimi i funksionit të pasigurt CommandExt::pre_exec.

  • Llojet e numrave të plotë atomikë të stabilizuar dhe të panënshkruar që variojnë në madhësi nga 8 deri në 64 bit (për shembull, AtomicU8), si dhe llojet e nënshkruara NonZeroI[8|16|32|54|128].
  • Një pjesë e re e API-së është zhvendosur në kategorinë e qëndrueshme, duke përfshirë Any::type_id, Error::type_id, slice::sort_by_cached_key, str::escape_*, str::split_ascii_whitespace, Instant::checked_[add|sub ] dhe metodat SystemTime janë stabilizuar ::checked_[add|sub]. Funksionet iter::from_fn dhe iter::successors janë stabilizuar;
  • Për të gjitha llojet e numrave të plotë, janë zbatuar metodat checked_pow, saturating_pow, wrapping_pow dhe overflowing_pow;
  • U shtua aftësia për të aktivizuar optimizimet në fazën e lidhjes duke specifikuar opsionin e ndërtimit "-C linker-plugin-lto" (rustc përpilon kodin Rust në kodin bit LLVM, i cili lejon aplikimin e optimizimeve LTO).

Burimi: opennet.ru

Shto një koment