Gjuha e programimit për qëllime të përgjithshme Rust 1.81, e themeluar nga projekti Mozilla, por tani e zhvilluar nën kujdesin e organizatës së pavarur jofitimprurëse Rust Foundation, është publikuar. Gjuha fokusohet në sigurinë e kujtesës dhe siguron mjetet për të arritur paralelizëm të lartë të punës duke shmangur përdorimin e një grumbulluesi të mbeturinave dhe kohën e funksionimit (koha e funksionimit reduktohet në inicializimin bazë dhe mirëmbajtjen e bibliotekës standarde).
Metodat e trajtimit të memories Rust e ruajnë zhvilluesin nga gabimet gjatë manipulimit të treguesve dhe mbrojnë nga problemet që lindin për shkak të trajtimit të nivelit të ulët të kujtesës, të tilla si qasja në një zonë memorie pasi të jetë liruar, mosreferencimi i treguesve null, tejkalimet e buferit, etj. Për të shpërndarë bibliotekat, për të ofruar ndërtime dhe për të menaxhuar varësitë, projekti zhvillon menaxherin e paketave Cargo. Depoja e crates.io mbështetet për pritjen e bibliotekave.
Siguria e memories sigurohet në Rust në kohën e përpilimit përmes kontrollit të referencës, mbajtjes së gjurmës së pronësisë së objektit, mbajtjes së gjurmëve të jetëgjatësisë së objektit (scopes) dhe vlerësimit të saktësisë së aksesit në kujtesë gjatë ekzekutimit të kodit. Rust siguron gjithashtu mbrojtje kundër tejmbushjeve të numrave të plotë, kërkon inicializimin e detyrueshëm të vlerave të variablave përpara përdorimit, trajton më mirë gabimet në bibliotekën standarde, zbaton konceptin e referencave dhe variablave të pandryshueshme si parazgjedhje, ofron shtypje të fortë statike për të minimizuar gabimet logjike.
Risitë kryesore:
- Thelbi::error::Tipari i gabimit, i cili përcakton përshkrimet e gabimeve të shfaqura, është stabilizuar. Ndryshimi ju lejon të përdorni një veçori të vetme të gabimit në biblioteka të ndryshme, pavarësisht nga mjedisi, duke përfshirë bibliotekat që nuk janë të lidhura me bibliotekën standarde, duke përdorur atributin "#![no_std]".
- Funksionet e renditjes së qëndrueshme dhe të paqëndrueshme në bibliotekën standarde janë konvertuar për të përdorur algoritme të reja që demonstrojnë performancë më të lartë dhe kohë më të ulët përpilimi. Në zbatimin e algoritmeve të reja të renditjes, është e mundur të zbulohen llojet e rendit të përcaktuara gabimisht dhe të nxirret një gabim (paniku) në raste të tilla në vend të të dhënave të grupuara rastësisht.
- Linter zbaton një nivel të ri kontrolli "prit" ("#[expect(lint)]"), i cili ju lejon të verifikoni që kontrolli ka përfunduar dhe të shfaqni një paralajmërim nëse kontrolli nuk është përfunduar (për shkak të një gabimi në zbatim ose çaktivizimi i çekut). Për shembull, kur migroni një bazë kodesh për të përdorur kontrollin undocumented_unsafe_blocks të Clippy, mund të specifikoni "#[expect(clippy::undocumented_unsafe_blocks)]" për të siguruar që të gjitha blloqet e pasigurta të dokumentohen gjatë tranzicionit. Clippy zbaton gjithashtu kontrolle clippy::allow_attributes dhe clippy::allow_attributes_without_reason, duke e bërë të lehtë zëvendësimin e atributeve "#[allow]" me "#[expect(lint)]".
- Mundësia për të dokumentuar arsyen e zëvendësimit të niveleve të kontrollit (lint) ofrohet, duke u ofruar zhvilluesve të rinj informacion në lidhje me arsyet e shtimit të një kontrolli të veçantë, dalje si një mesazh përpiluesi. Për shembull: #![mohoni(clippy::float_arithmetic, arsye = "pa mbështetje float harduerike")]
- Një pjesë e re e API-së është zhvendosur në kategorinë e qëndrueshme, duke përfshirë metodat dhe implementimet e tipareve janë stabilizuar:
- thelbi::gabim
- këshillë::assert_unchecked
- fs::ekziston
- AtomicBool::fetch_not
- Kohëzgjatja::abs_diff
- IoSlice:: avancuar
- IoSlice::advance_slices
- IoSliceMut:: avancuar
- IoSliceMut::advance_slices
- PanicHookInfo
- PanicInfo::mesazh
- Mesazh Panik
Atributi "const", i cili përcakton mundësinë e përdorimit të tij në çdo kontekst në vend të konstanteve, përdoret në funksionet:
- char::from_u32_unchecked (funksion)
- char::from_u32_unchecked (metodë)
- CStr::count_bytes
- CStr::from_ptr
Lloji std::panic::PanicInfo është riemërtuar në std::panic::PanicHookInfo (funksionaliteti i emrit të vjetër ruhet, por nga versioni tjetër përdorimi i tij do të rezultojë në një paralajmërim). Në këtë rast, core::panic::PanicInfo do të mbetet ashtu siç është, por do të zhvillohet si një lloj i veçantë. Ndarja e llojeve do t'ju lejojë të zbatoni metoda të ndryshme në to që janë specifike për ekzekutimin në kontekstin e snd dhe no_std.
- Ka përfunduar kalimi në C-unwind ABI ("i jashtëm "C-unwind") i cili ndryshon nga ABI pa prapashtesën "-unwind" ("i jashtëm "C") duke ruajtur një sjellje të sigurt nëse procesi i heqjes ), i aktivizuar kur një program rrëzohet ose hidhet një përjashtim i stilit C++, kalon një kufi ABI (për shembull, kur një përjashtim i hedhur në kod në një gjuhë programimi zbërthehet duke prekur pirgun e lidhur me kodin në një gjuhë tjetër programimi). Që nga publikimi i Rust 1.81, "C" i jashtëm ABI është mundësuar të rrëzohet në një zbërthim të pazbuluar.
- Niveli i tretë i mbështetjes është zbatuar për platformat i686-unknown-redox, xtensa-esp32-none-elf, xtensa-esp32s2-none-elf, xtensa-esp32s3-none-elf, xtensa-esp32-espidf, xtensa-esp32 -espidf, xtensa- esp2s32-espidf. Niveli i tretë përfshin mbështetjen bazë, por pa testim të automatizuar, publikim të ndërtimeve zyrtare ose kontrollim nëse kodi mund të ndërtohet.
- Niveli i dytë i mbështetjes për platformat e synuara loongarch64-unknown-linux-musl dhe arm64ec-pc-windows-msvc është zbatuar. Niveli i dytë i mbështetjes përfshin një garanci montimi.
- Për Linux-sistemet në platformën LoongArch ofrohen me një set të plotë mjetesh dhe profilizuesi.
- Një dobësi (CVE-2024-43402) në std::process::Command që ndikon vetëm në platformë është rregulluar. Windows dhe eliminon një zgjidhje alternative për shfrytëzimin e dobësisë së BatBadBut të rregulluar më parë, e cila përfshinte trajtimin e karaktereve speciale gjatë përdorimit të thirrjeve Command::arg dhe Command::args, të cilat janë të dizajnuara për të kaluar drejtpërdrejt argumente në një proces pa i përpunuar ato nga interpretuesi i komandës. Në realitet, kur ekzekutoheshin skriptet bat dhe cmd, nisej procesi cmd.exe, i cili ka logjikën e vet për ndarjen e argumenteve. Anashkalimi bazohet në faktin se Windows heq hapësirat dhe pikat kryesore në shtigje, d.m.th. një skedar me prapashtesën ".bat." përpunohet si ".bat".
Gjithashtu ia vlen të përmendet largimi i Wedson Almeida Filho si mirëmbajtës i projektit për Rust për... Linux, i përfshirë në zbatimin e kernelit Linux mjete zhvillimi për gjuhën Rust. Pas largimit të Wadson, projekti ende ka dy mirëmbajtës: Miguel Ojeda, autori dhe zhvilluesi kryesor i Rust-for-Linux, dhe Alex Gaynor, ish-drejtori i Python Software Foundation, i cili e ka zhvendosur fokusin e tij në promovimin e Rust. Mirëmbajtësi që po largohet, i cili iu bashkua projektit katër vjet më parë, është një punonjës i Microsoft dhe autori i një drajveri eksperimental që zbaton sistemin e skedarëve EXT2, të shkruar në Rust. Puna e fundit e Almeida është përqendruar në krijimin e mjeteve për zhvillimin e sistemeve të skedarëve në Rust. Këtë vit, Almeida kontribuoi në depozitën Rust-for-.Linux 17 kryerje (për krahasim, Miguel Ojeda shtoi 53 kryerje).
Arsyeja e përmendur për largimin është mungesa e energjisë dhe entuziazmit, e cila dikur ishte e pranishme për t'iu përgjigjur disa gjërave të pakuptimta joteknike. Sipas Almeidës, zhvilluesit janë të detyruar të shpenzojnë shumë energji duke debatuar mbi çështje të parëndësishme që dëmtojnë qëllimin e përgjithshëm më të rëndësishëm. Almeida vazhdon të besojë se e ardhmja e bërthamave qëndron në përdorimin e gjuhëve të sigurta për memorien, dhe nëse komuniteti i zhvilluesve Linux nuk do ta kuptojë këtë, atëherë Linux do të zëvendësohet nga ndonjë kernel tjetër, siç ndodhi me Unix në kohën e tij.
Mbështetësit e projektit Rust-for-Linux u përball me nevojën për të kapërcyer rezistencën nga zhvilluesit e kernel-it me përvojë të gjatë, të cilët nuk e shihnin të nevojshme të mësonin një gjuhë të re. Në letrën e tij të dorëheqjes, Almeida citon si shembull një diskutim që u zhvillua gjatë prezantimit të Almeidës me Kent Overstreet nëLinux Ruajtja, Sistemi i Skedarëve, Menaxhimi i Memories dhe Samiti BPF" dhe iu kushtua përdorimit të Rust për zhvillimin e sistemit të skedarëve. Përpjekjet e implementimit të Rust u kritikuan nga Ted Ts'o, autori i sistemeve të skedarëve ext2/ext3/ext4, i cili krahasoi Rust-për-Linux me një përpjekje për t'i detyruar të gjithë të pranojnë fenë Rust.
Në përgjigje të synimit të Almeida për të krijuar një mbështjellës rreth ndërfaqeve të sistemit të skedarëve të shkruar në C për përdorim në kodin Rust, Ted Tso vuri në dukje se një mbështjellës i tillë në mënyrë të pashmangshme do të çonte në probleme, pasi çdo ndryshim në ndërfaqet C dhe rifaktorimi do të kërkonte lidhjet e ndryshimeve për Rust dhe ai nuk dëshiron të marrë përgjegjësi të panevojshme për rregullimin e problemeve në kodin Rust dhe monitorimin e gjendjes së lidhjes së Rust. Kodi C po evoluon vazhdimisht dhe nëse ndryshimi i tij prish funksionalitetin e kornizës Rust, do të çojë në ndërprerje të punës së të gjitha sistemeve të skedarëve të lidhur me këtë kornizë.
Ted gjithashtu beson se në të ardhmen e parashikueshme, lidhja për Rust do të mbetet dytësore dhe se problemet në lidhje do të jenë vetëm një dhimbje koke për zhvilluesit e Rust-for-.Linux, dhe jo për komunitetin e zhvillimit të sistemit të skedarëve kernel. U theksua se jo të gjithë zhvilluesit kanë ndërmend të mësojnë Rust, dhe për këtë arsye, pasi të bëjnë ndryshime që ndikojnë në kodin tjetër, ata do të jenë në gjendje të përditësojnë vetëm kodin C të varur, por nuk do të jenë në gjendje të rregullojnë lidhjet e Rust, pasi nuk e njohin Rust. James Bottomley, mirëmbajtësi i nënsistemit SCSI, gjithashtu u bashkua në diskutim, duke deklaruar se sa më shumë semantikë të kodohet në lidhje, aq më të brishta bëhen ato për sa i përket sinkronizimit.
Ndërkohë, Google, i cili vitin e kaluar rishkruan firmware-in pvmfm të përdorur në makina virtuale, e lançuar në platformë Android, ndau përvojën e saj duke përfshirë gradualisht kodin Rust në firmware ekzistues të shkruar fillimisht në C ose C++. Ajo demonstroi se si siguria e firmware-it mund të përmirësohet ndjeshëm duke krijuar komponentë zëvendësues funksionalisht identikë të shkruar në Rust. Gjatë implementimit të Rust, ajo propozoi të përqendrohej në përdorimin e Rust për kod të ri dhe kod që kryen funksione kritike për sigurinë (për shembull, kod për përpunimin e të dhënave të jashtme të marra nga burime të pabesueshme). Për të integruar Rust dhe kodin C, ajo propozoi përdorimin e shim-eve që përkthejnë thirrjet midis API-ve të Rust dhe C (API-ja C eksportohet për përdorim në kodin Rust dhe anasjelltas), duke lejuar një rishkrim gradual të elementëve të API-t në Rust.
Burimi: opennet.ru
