Mozilla layihəsi tərəfindən əsası qoyulmuş, lakin indi Rust Foundation müstəqil qeyri-kommersiya təşkilatının himayəsi altında hazırlanmış Rust 1.82 ümumi məqsədli proqramlaşdırma dilinin buraxılışı dərc edilmişdir. Bu dil yaddaşın təhlükəsizliyinə diqqət yetirir və zibil toplayıcıdan və işləmə müddətindən istifadə etmədən yüksək iş paralelliyinə nail olmaq üçün vasitələr təqdim edir (iş vaxtı standart kitabxananın əsas işə salınması və saxlanmasına qədər azaldılır).
Rust-un yaddaşla işləmə üsulları tərtibatçını göstəricilərlə manipulyasiya edərkən xətalardan xilas edir və yaddaşın aşağı səviyyəli işləməsi nəticəsində yaranan problemlərdən qoruyur, məsələn, yaddaş sahəsi boşaldıqdan sonra ona daxil olmaq, sıfır göstəricilərə istinad etmək, bufer aşmaq və s. Kitabxanaları yaymaq, qurmaları təmin etmək və asılılıqları idarə etmək üçün layihə Yük paketi meneceri hazırlayır. Crates.io deposu kitabxanaların yerləşdirilməsi üçün dəstəklənir.
Yaddaşın təhlükəsizliyi Rust-da kompilyasiya zamanı istinad yoxlaması, obyekt sahibliyinin izlənməsi, obyektin istifadə müddətinin (əhatə dairələrinin) izlənməsi və kodun icrası zamanı yaddaşa girişin düzgünlüyünün qiymətləndirilməsi vasitəsilə təmin edilir. Rust həmçinin tam ədədlərin daşmasına qarşı qorunma təmin edir, istifadə etməzdən əvvəl dəyişən dəyərlərin məcburi işə salınmasını tələb edir, standart kitabxanada səhvləri daha yaxşı idarə edir, dəyişməz istinadlar və dəyişənlər konsepsiyasını standart olaraq tətbiq edir, məntiqi səhvləri minimuma endirmək üçün güclü statik yazma təklif edir.
Əsas yeniliklər:
- Anbarda paket haqqında məlumatı göstərmək üçün yük paketi menecerinə “info” əmri əlavə edilmişdir.
- Gizli növlər haqqında məlumatı təyin edən "impl Trait"də "istifadə<..>" sintaksisi üçün əlavə dəstək. Məsələn, "impl Trait + use<'x, T>" gizli tipdə yalnız "x" və "T" parametrlərinin istifadəsinə icazə verildiyini bildirir.
- Əvvəllər istifadə edilmiş makroları əvəz edən xam göstəricilər yaratmaq üçün ayrıca sintaksis təklif edilmişdir: “addr_of!(ifadə)” makrosu “&raw const expr” operatoru ilə, “addr_of_mut!(ifadə)” makrosu isə əvəz edilmişdir. “&raw mut” operator expr” tərəfindən. struct Paketlənmiş {not_aligned_field: i32, } fn main() { let p = Qablaşdırılmamış {not_aligned_field: 1_82}; // Xam göstərici yaratmaq üçün köhnə üsul ptr = std::ptr::addr_of!(p.not_aligned_field); // Xam göstərici yaratmağın yeni yolu let ptr = &raw const p.not_aligned_field; let val = təhlükəli { ptr.read_unaligned() }; }
- "Təhlükəsiz" atributuna malik xarici blokların içərisində "statik" istifadə müddəti olan təhlükəsiz funksiyaları və sabitləri təyin etmək mümkündür (əvvəllər "təhlükəsiz xarici" elementlərin hamısı yalnız "təhlükəsiz" atributuna malik ola bilərdi): unsafe extern { pub safe statik TAU: f64; pub safe fn sqrt(x: f64) -> f64; pub unsafe fn strlen(p: *const u8) -> usize; }
- Qeyri-müəyyən davranışa gətirib çıxara bilən no_mangle, link_section və export_name atributları indi təhlükəli sayılır və açıq-aşkar "təhlükəsiz" bayraq tələb edir, məsələn: #[unsafe(no_mangle)] pub fn my_global_function() { }
- Nümunə uyğunluğu "enum Void {}" və ya görünən boş sahəyə malik strukturlar kimi boş növlərin atlanmasına imkan verir. std::convert::Infallibable istifadə edin; pub fn panik olmadan_açın (x: Nəticə ) -> T { qoy Ok(x) = x; // "Xəta" atlana bilər x }
- Üzən nöqtə nömrələri üçün növlər (f32 və f64) qeyri-rəqəmsal NaN dəyərlərini (0.0/0.0) emal edərkən standartlaşdırılmış davranışa malikdir və həmçinin const fn-də üzən nöqtə əməliyyatlarından istifadə etməyə imkan verir.
- Montaj əlavələri, ilk növbədə registrdə saxlamadan tam ədədi dəyərlərdən birbaşa istifadə etmək üçün "const" atributlu operandlardan istifadə etmək imkanı verir. const MSG: &str = "Salam, dünya!\n"; unsafe { core::arch::asm!( “mov rdx, {LEN} // 'mov rdx, 14′” təlimatı yaradılacaq, LEN = const MSG.len(), … ); }
- “Statik” atributlu ifadələrin ünvanlanmasına təhlükəsiz kontekstdə təhlükəli blok müəyyən edilmədən icazə verilir (“&raw mut” və “&raw const” operatorları operandın dəyərinə təsir etmir və yalnız ona göstərici yaradır): statik mut STATIC_MUT: Növ = Növ::yeni( ); extern "C" { statik EXTERN_STATIC: Növ; } fn main() { let static_mut_ptr = &raw mut STATIC_MUT; let extern_static_ptr = &raw const EXTERN_STATIC; }
- API-nin yeni hissəsi stabillər kateqoriyasına köçürüldü, o cümlədən xüsusiyyətlərin üsulları və tətbiqləri stabilləşdirildi:
- std::thread::Builder::spawn_unchecked
- std::str::CharIndices::ofset
- std::option::Option::is_none_or
- [T]:: çeşidlənir
- [T]::sortlaşdırılır
- [T]::açarına görə çeşidlənir
- İterator :: çeşidlənir
- İterator::sortlaşdırılır
- İterator::açarına görə çeşidlənir
- std::future::Ready::into_inner
- std::iter::repeat_n
- impl Take üçün DoubleEndedIterator
Mənbə: opennet.ru
