Izšla je izdaja sistemskega programskega jezika Rust 1.51, ki ga je utemeljil projekt Mozilla, zdaj pa se razvija pod okriljem neodvisne neprofitne organizacije Rust Foundation. Jezik se osredotoča na varnost pomnilnika, zagotavlja samodejno upravljanje pomnilnika in zagotavlja sredstva za doseganje visoke vzporednosti opravil brez uporabe zbiralnika smeti ali izvajalnega okolja (izvajalni čas je zmanjšan na osnovno inicializacijo in vzdrževanje standardne knjižnice).
Rustovo samodejno upravljanje pomnilnika reši razvijalca pred napakami pri manipulaciji s kazalci in ščiti pred težavami, ki nastanejo zaradi manipulacije s pomnilnikom na nizki ravni, kot je dostop do območja pomnilnika, potem ko je bilo osvobojeno, dereferenciranje ničelnih kazalcev, prekoračitev medpomnilnika itd. Za distribucijo knjižnic, zagotavljanje gradenj in upravljanje odvisnosti projekt razvija upravitelja paketov Cargo. Repozitorij crates.io je podprt za gostovanje knjižnic.
Glavne novosti:
- Funkcionalnost, povezana z uporabo konstantnih generičnih oblik, je bila označena kot minimalno izvedljiv izdelek (MVP), kar daje zeleno luč za široko uporabo. Konstantne generične oblike omogočajo posplošitev tipov za konstantne vrednosti, tj. uporabo generičnih argumentov, omejenih na obseg konstantnih vrednosti namesto na tipe ali življenjske dobe. Ta zmožnost omogoča uporabo celoštevilsko parametriziranih tipov in abstrakcije pri ustvarjanju lastnosti za polja poljubne velikosti, ne da bi bilo treba ustvariti ločen tip za vsak obseg veljavnih vrednosti, da se zagotovi, da veljavno območje ni preseženo.
Od trenutne izdaje naprej imajo polja tipa "[T; N]" (tip T in velikost N) zdaj možnost abstrahiranja tipa in velikosti z uporabo vrednosti poljubnih celoštevilskih, logičnih ali znakovnih tipov (tipa struct in enum še nista podprta). Generične konstante bistveno poenostavijo razvoj knjižnic; na primer, za uporabo polja, ki ni vezano na določen tip in velikost, lahko določite: struct Array { // ^^^^^^^^^^^^^^^^^^^^^ definicija seznama konstant generičnih: [T; LENGTH] // ^^^^^^ njena uporaba }
Ko se dejansko uporablja s to definicijo, "Array "prevajalnik bo ustvaril monomorfno različico Array: struct Array { seznam: [u8; 32] }
- API std::array::IntoIter, ki temelji na generičnih konstantah, je bil stabiliziran. Z njim lahko ustvarite iteratorje po vrednosti za katero koli tabelo: fn main() { let array = [1, 2, 3, 4, 5]; // Prej ste morali za iteracijo po vrednosti poklicati metodo .iter() for item in array.iter().copied() { println!(«{}», item); } // Zdaj lahko določite for item in std::array::IntoIter::new(array) { println!(«{}», item); } }
- Upravitelj paketov cargo zdaj podpira novo polje za razreševanje v datoteki Cargo.toml, ki ga je mogoče uporabiti za omogočanje druge različice razreševalnika funkcij. Ta novi razreševalec se izogne združevanju funkcij odvisnosti, navedenih v razdelku »[funkcije]«, kadar je to neprimerno, na primer pri vključevanju odvisnosti, ki zahteva standardno funkcijo v skriptih in makrojih za gradnjo, vendar uporablja nestandardno funkcijo v končni izvedljivi datoteki.
Prej so bile zmogljivosti paketa, ki so bile v grafu odvisnosti omenjene večkrat, združene. Če je na primer projekt vključeval odvisnost foo, ki je definirala zmogljivosti A in B, in je bil ta paket uporabljen v drugih paketih bar in baz, in je bil bar odvisen od foo z zmogljivostjo A, baz pa odvisen od foo z zmogljivostjo B, bi cargo združil te zmogljivosti in prevedel foo z omogočenima zmogljivostima A in B. Ta metoda bi lahko povzročila, da bi bila zmogljivost, ki jo omogoča odvisnost, nezdružljiva s ciljnim sistemom, za katerega je bila izvedena končna gradnja. Na primer, ko je bilo treba v izvedljivi datoteki, zgrajeni z "#![no_std]", uporabiti različico foo z "#![no_std]", foo z "std" pa je bilo treba uporabiti med gradnjo v build.rs. Z določitvijo resolver="2" v Cargo.toml bo upravitelj paketov zdaj poskušal pravilno obravnavati ta konflikt, pri čemer bo ločil odvisnosti dev, host in target.
- Cargo implementira možnost split-debuginfo, določeno v razdelku "[profile]", in ustrezno zastavico "-Csplit-debuginfo=unpacked" v rustc, kar ponuja implementacijo nove metode za shranjevanje informacij o odpravljanju napak, ki odpravlja potrebo po klicu pripomočka dsymutil in znatno pospeši postopek gradnje z informacijami o odpravljanju napak v macOS.
- Makra "ptr::addr_of!" in "ptr::addr_of_mut!" sta bila stabilizirana, kar omogoča ustvarjanje surovih kazalcev na neporavnana polja. use std::ptr; #[repr(packed)] struct Packed { f1: u8, f2: u16, } let packed = Packed { f1: 1, f2: 2 }; // &packed.f2 bo ustvaril neporavnan kazalec, kar bo vodilo do nedefiniranega vedenja let raw_f2 = ptr::addr_of!(packed.f2); assert_eq!(unsafe { raw_f2.read_unaligned() }, 2);
- Nova serija API-jev je bila premaknjena v stabilno kategorijo, vključno z naslednjimi metodami:
- Arc::decrement_strong_count
- Arc::increment_strong_count
- Enkrat::klic_enkrat_sila
- Peekable::next_if_eq
- Peekable::next_if
- Seek::stream_position
- niz::IntoIter
- panika::panika_poljubna
- ptr::naslov_od!
- ptr::naslov_mutacije!
- rezina::zapolni_z
- slice::split_inclusive_mut
- slice::split_inclusive
- slice::strip_prefix
- rezina::pripona_stripa
- str::split_inclusive
- sinhronizacija::OnceState
- naloga::Zbudi se
- Za platforme i386-unknown-linux-gnu, i486-unknown-linux-gnu, aarch64_be-unknown-linux-gnu, aarch64-unknown-linux-gnu_ilp32 in aarch64_be-unknown-linux-gnu_ilp32 je bila uvedena podpora 3. stopnje. 3. stopnja zagotavlja osnovno podporo, vendar brez avtomatiziranega testiranja, uradnih gradenj ali preverjanja gradenj.
Vir: opennet.ru
