S'ha publicat el llançament del llenguatge de programació de propòsit general Rust 1.82, fundat pel projecte Mozilla, però ara desenvolupat sota els auspicis de l'organització independent sense ànim de lucre Rust Foundation. El llenguatge se centra en la seguretat de la memòria i proporciona els mitjans per aconseguir un alt paral·lelisme de treballs evitant l'ús d'un col·lector d'escombraries i el temps d'execució (el temps d'execució es redueix a la inicialització bàsica i al manteniment de la biblioteca estàndard).
Els mètodes de gestió de memòria de Rust estalvien al desenvolupador d'errors en manipular els punters i protegeixen dels problemes que sorgeixen a causa del maneig de la memòria de baix nivell, com ara accedir a una àrea de memòria després d'haver-se alliberat, desreferenciar punters nuls, desbordaments de memòria intermèdia, etc. Per distribuir biblioteques, proporcionar compilacions i gestionar dependències, el projecte desenvolupa el gestor de paquets Cargo. El repositori crates.io és compatible per allotjar biblioteques.
La seguretat de la memòria es proporciona a Rust en temps de compilació mitjançant la comprovació de referències, el seguiment de la propietat de l'objecte, el seguiment de la vida útil dels objectes (àmbits) i l'avaluació de la correcció de l'accés a la memòria durant l'execució del codi. Rust també proporciona protecció contra desbordaments d'enters, requereix la inicialització obligatòria dels valors de les variables abans de l'ús, gestiona millor els errors a la biblioteca estàndard, aplica el concepte de referències i variables immutables per defecte, ofereix una escriptura estàtica forta per minimitzar els errors lògics.
Principals innovacions:
- L'ordre "info" s'ha afegit al gestor de paquets de càrrega per mostrar informació sobre un paquet al repositori.
- S'ha afegit suport per a la sintaxi "use<..>" a "impl Trait", que especifica informació sobre els tipus ocults. Per exemple, "impl Trait + use<'x, T>" especifica que només els paràmetres "x" i "T" es permeten utilitzar en un tipus ocult.
- S'ha proposat una sintaxi separada per crear punters en brut, que substitueix les macros utilitzades anteriorment: la macro "addr_of!(expr)" s'ha substituït per l'operador "&raw const expr" i la macro "addr_of_mut!(expr)" s'ha substituït. per l'operador "&raw mut" expr". struct Empaquetat { camp_no_alineat: i32, } fn main() { let p = Empaquetat { camp_no_alineat: 1_82 }; // Antiga manera de crear un punter en brut let ptr = std::ptr::addr_of!(p.not_aligned_field); // Nova manera de crear un punter en brut let ptr = &raw const p.not_aligned_field; let val = insegur { ptr.read_unaligned () }; }
- Ara és possible definir funcions i constants segures amb una vida "estàtica" dins de blocs externs amb l'atribut "insegur" (anteriorment, tots els elements d'un "extern no segur" només podien tenir l'atribut "insegur"): unsafe extern { pub TAU estàtica segura: f64; pub safe fn sqrt (x: f64) -> f64; pub unsafe fn strlen(p: *const u8) -> ús; }
- Els atributs no_mangle, link_section i export_name, que poden provocar un comportament no definit, ara es consideren insegurs i requereixen una marca explícita "insegura", per exemple: #[unsafe(no_mangle)] pub fn my_global_function() { }
- La concordança de patró permet ometre tipus buits, com ara "enum Void {}" o estructures amb un camp buit visible. utilitzar std::convert::Infal·lible; pub fn unwrap_without_panic (x: Resultat ) -> T { siguem Ok(x) = x; // "Err" es pot saltar x }
- Els tipus de nombres de coma flotant (f32 i f64) tenen un comportament estandarditzat quan es processen valors de NaN no numèrics (0.0/0.0), i també permeten l'ús d'operacions de coma flotant en const fn.
- Les insercions de conjunt ofereixen la possibilitat d'utilitzar operands amb l'atribut "const" per utilitzar directament valors numèrics enters sense emmagatzemar-los abans en un registre. const MSG: &str = "Hola, món!\n"; insegur { core::arch::asm!( "mov rdx, {LEN} // es generarà la instrucció 'mov rdx, 14′", LEN = const MSG.len(), … ); }
- L'adreçament d'expressions amb l'atribut “static” està permès en un context segur sense definir un bloc no segur (els operadors “&raw mut” i “&raw const” no afecten el valor de l'operand i només hi creen un punter): static mut STATIC_MUT: Tipus = Tipus::nou(); extern "C" { static EXTERN_STATIC: Tipus; } fn main() { let static_mut_ptr = &raw mut STATIC_MUT; let extern_static_ptr = &raw const EXTERN_STATIC; }
- Una nova part de l'API s'ha mogut a la categoria d'estable, inclosos els mètodes i les implementacions de trets s'han estabilitzat:
- std::thread::Builder::spawn_unchecked
- std::str::CharIndices::offset
- std::option::Option::is_none_or
- [T]::està_ordenat
- [T]::es_ordenat_per
- [T]::està_ordenat_per_clau
- Iterador::es_ordenat
- Iterador::es_ordenat_per
- Iterador::està_ordenat_per_clau
- std::future::Ready::into_inner
- std::iter::repeat_n
- impl DoubleEndedIterator per a Take
Font: opennet.ru
