Mozilla tərəfindən yaradılan, lakin indiki zamanda müstəqil qeyri-kommersiya təşkilatı Rust Foundation altında inkişaf etdirilən Rust 1.96 proqramlaşdırma dilinin buraxılışı dərc edilib. Dil, yaddaşla təhlükəsiz işə fokuslanır və tapşırıqların yüksək paralellikdə yerinə yetirilməsi üçün imkanlar təqdim edir, bununla yanaşı, zibili toplayan və runtime olmayan bir sistemlə (runtime yalnız standart kitabxananın əsas başlatılması və saxlanması ilə məhdudlaşır) işləyir.
Rust-da yaddaşla iş metodları, göstəricilərlə manipulyasiya edərkən səhvləri istisna etməyə yönəlib və yaddaşla aşağı səviyyəli iş nəticəsində ortaya çıxan problemlərdən, məsələn, azad edilmiş yaddaş sahəsinə müraciət, sıfır göstəricilərin de-referensiyası, tampon sərhədindən kənara çıxma və s. qorumağa çalışır. Kitabxanaların yayılması, tərtibatların təminatı və layihənin asılılıqlarının idarə edilməsi üçün paket meneceri Cargo inkişaf etdirilir. Kitabxanaların yerləşdirilməsi üçün crates.io anbarı dəstəklənir.
Rust-da yaddaşın təhlükəsiz işlənməsi, kompilyasiya zamanı istinadların yoxlanılması, obyektlərin sahibliliyinin izlənməsi, obyektlərin zamanını (görünmə sahəsi) diqqətə almaq və kodun icrası zamanı yaddaşa düzgün girişin qiymətləndirilməsi ilə təmin edilir. Rust, eyni zamanda tam ədəd aşmalarından qorunma vasitələri təqdim edir, dəyişənlərin istifadəsi üçün mütləq ilkin olaraq nəzərdə tutulmasını tələb edir, standart kitabxanada səhvləri daha yaxşı işləyir, dəyişməz (immutable) istinadların və dəyişənlərin varsayılan olaraq tətbiq olunduğu konsepsiyanı istifadə edir, mantıqlı səhvləri minimuma endirmək üçün güclü statik tip təsdiqi təklif edir.
Əsas yeniliklər:
- Artıq, köhnəlmiş Range, RangeInclusive, RangeToInclusive və RangeFrom tiplərini əvəz etmək üçün yeni növ icraatı təqdim edən range modulu əlavə olunmuşdur və bu növlər Copy strukturlarında aralığı saxlamaq imkanını verir. Range tipi minimum və maksimum icazə verilən dəyərlərlə (amma bu dəyərləri daxil etmədən) məhdudlaşmış aralıqları müəyyən edir, RangeFrom tipi isə belirtilmiş dəyərdən başlayaraq ədədləri təyin edir, RangeInclusive tipi isə qeyd olunan aralığın hər iki sərhədini daxil edən dəyərləri göstərir. Gələcək buraxılışlarda əlavə olaraq RangeFull və RangeTo tipləri ortaya çıxacaq, köhnə icra core::range::legacy::* formatına köçürüləcək, «N..M» sintaksisi isə yeni növ tiplərə çevriləcək.
Yeni tiplər, Iterator tipi əvəzinə IntoIterator tipini həyata keçirməklə fərqlənir. Yəni, inteqrasiya olunmuş iteratordan deyil, tipi iteratora necə çevirmək lazım olduğunu müəyyən edirlər. Bu yanaşma, əvvəlki dövrlərdə inteqrasiya olunmuş iteratörlərlə uyğunluq səbəbindən əlçatan olmayan yeni tiplərlə nüsxələmə əməliyyatını istifadə etməyə imkan tanıyır (Copy tipi, tipi nüsxələmə yolu ilə çoğaldırmağı göstərir).
Məsələn, yeni tiplər, ayrı-ayrılıqda başlanğıc və son dəyərləri saxlamadan tam nüsxəsi çıxarılan bir struktura kəsik sərhədlərini saxlama imkanı tanıyır:use core::range::Range;
#[derive(Clone, Copy)]
pub struct Span(Range);impl Span {
pub fn of(self, s: &str) -> &str {
&s[self.0]
}
} - assert_matches! və debug_assert_matches! makrosları əlavə olunmuşdur, bunlar dəyərin verilmiş nümunəyə uyğunluğunu yoxlayır və uyğunsuzluqda icraatı dayandırır. Bu yeni makroslar, assert!(matches!(..)) və debug_assert!(matches!(..)) ifadələrindən fərqli olaraq, səhv yaranmasına səbəb olan dəyərləri göstərən debug informaçõesunu təqdim edir. Üçüncü tərəf eyni adla satılan makroslarla çarpışmanın qarşısını almaq üçün, yeni makroslar "core::assert_matches" kitabxanasının açıq idxalını tələb edir.
use core::assert_matches;
fn get_random_number() -> u32 {
4
}fn main() {
assert_matches!(get_random_number(), 1..=6);
} - WebAssembly üçün toplandığında, "--allow-undefined" seçimi, "env" modulundan daxil olanların yerləşdirilməsinə icazə verən bağlayıcıya göndərilməsini dayandırdı. WebAssembly üçün toplandığında, bütün bağlanmış simbollər artıq standart olaraq müəyyən edilməlidir. Keçmiş davranışı bərpa etmək üçün "RUSTFLAGS=-Clink-arg=--allow-undefined" mühit dəyişənindən və ya kodda '#[link(wasm_import_module = "env")]' ifadəsindən istifadə edə bilərsiniz.
- Yeni API stabil vəziyyətə keçirilib, o cümlədən stabil edilmiş metodlar və strukturlar:
- assert_matches!
- debug_assert_matches!
- From for AssertUnwindSafe
- From for LazyCell
- From for LazyLock
- core::range::RangeToInclusive
- core::range::RangeToInclusiveIter
- core::range::RangeFrom
- core::range::RangeFromIter
- core::range::Range
- core::range::RangeIter
- Cargo paket menecerində, simvolik bağlantılarla manipulyasiya etməklə eyni repozitoriyadan yerli paketlərə digər crate paketinin orijinal kodunu yazmaq üçün istifadə oluna bilən CVE-2026-5223 zəifliyi aradan qaldırılmışdır. Zəiflik yalnız xarici paket repozitoriyaları ilə işləyərkən baş verir və crates.io repozitoriyasının istifadəçilərinə təsir etmir, çünki crates.io simvolik bağlantılarla paketlərin yüklənməsini qadağan edir.
Əlavə olaraq, Rust dilinin mikro-nəzarətçilər və məhdud resurslara malik sistemler üçün firmware inkişafında uyğunluq analizi nəticələrinin (PDF) yayılması diqqətə çatdırılmalıdır.
Araşdırma STMicroelectronics şirkəti tərəfindən bir neçə Avropa universitetinin iştirakıyla həyata keçirilmişdir. İki izolyasiya olunmuş inkişaf qrupu STM32U585AI mikro-nəzarətçiləri üçün eyni firmware-in həyata keçirilməsi tapşırığı verilmişdir. Birinci qrup firmware-i C dilində, ikinci qrup isə Rust-da yaradıb.
İşin testləri, mikro-nəzarətçilər üçün firmware-nin inkişafında C dilinin Rust-a nisbətən nəzərəçarpan üstünlüklərini aşkara çıxarmadı, yaddaş istehlakı və performansı müqayisə edərkən. Həmçinin, Rust-da yazılmış Ariel OS açıq layihəsinin sistem runtime istifadə edilməsi, Rust layihəsində yaddaş istehlakını, yeni mülkiyyət kitabxanası olan newlib istifadə edərək firmware inkişafı üçün ənənəvi yığınla həyata keçirilən C dilindəki tətbiqinə nisbətən daha aşağı səviyyədə saxlamağa imkan verdi.
Nəticə olan firmware-in ölçüsü Rust layihəsində 84100 bayt, C layihəsində isə 76744 bayt ( daha az) təşkil etdi, amma Rust firmware-də yaddaş istehlakı əhəmiyyətli dərəcədə aşağı oldu — 24640 bayt, 42608 bayta qarşı. Performans baxımından, 6 həftə ərzində hazırlanan ilkin prototipərin test olunması zamanı Rust üzrə icra C üzrə icradan iki dəfə irəlidə oldu, lakin hər iki icra hesablanan maksimum performansdan əhəmiyyətli dərəcədə geridə qaldı. Optimize etməyə 4 hafta sərf edildikdən sonra, hər iki icra təxminən eyni nəticə əldə etdi, hesablanan maksimuma yaxındır.

Mənbə: opennet.ru
