Rust 1.81 buraxılışı. Rust-ın Linux nüvəsində irəliləməsi ilə bağlı çətinliklər

Mozilla tərəfindən yaradılmış, lakin hazırda müstəqil qeyri-kommersiya təşkilatı Rust Foundation altında inkişaf etdirilən Rust 1.81 versiyalı çox məqsədli proqramlaşdırma dilinin buraxılışı başa çatıb. Dil, yaddaşın təhlükəsiz istifadəsinə fokuslanır və təkrar toplama və runtime olmadan yüksək paralelizmi təmin edir (runtime yalnız standart kitabxananın başlanğıcını və saxlanılmasını əhatə edir).

Rust-da yaddaşın idarə olunma metodları inkişafçını göstəricilərlə manipulyasiya zamanı səhvlərdən azad edir və aşağı səviyyəli yaddaşla işin yaratdığı problemlərdən, məsələn, azad edilmiş yaddaş sahəsinə müraciət etmə, sıfır göstəricilərin de-referensiallaşdırılması, buferdən kənara çıxma və s. qoruyur. Kitabxanaların yayılması, konteyner yığımı və layihənin asılılıqlarını idarə etmək üçün Cargo paket meneceri 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:

  • core::error::Error tipi stabilizasiya olunub. Bu dəyişiklik, insanlara müxtəlif kitabxanalarda, o cümlədən standart kitabxana ilə bağlı olmayan kitabxanalarda, "#![no_std]" atributunu istifadə edərək tək tipli Error-dan istifadə etməyə imkan verir.
  • Standart kitabxanadakı stabil və qeyri-stabil sıralama funksiyaları yeni algoritmlara köçürüldü ki, bu da daha yüksək iş sürəti və daha az kompilyasiya vaxtı nümayiş etdirir. Yeni sıralama algoritmları Ord tipinin düzgün olmayan tərifini müəyyənləşdirir və belə hallarda səhv (panic) bildirir, əvəzinə təsadüfi qruplaşdırılmış məlumatların göstərilməsini təmin edir.
  • Linter-də "expect" ("#[expect(lint)]") adlanan yeni yoxlama səviyyəsi tətbiq olunub ki, bu da yoxlamanın yerinə yetirildiyinə əmin olmağa və yoxlama yerinə yetirilmədikdə xəbərdarlıq etməyə imkan tanıyır (icra xətası və ya yoxlamanın söndürülməsi səbəbindən). Məsələn, kod bazasını Clippy vasitəsilə undocumented_unsafe_blocks yoxlamasına keçirdikdə, bütün təhlükəsiz blokların sənədləşdirilməsini təmin etmək üçün "#[expect(clippy::undocumented_unsafe_blocks)]" göstərilə bilər. Clippy-də həmçinin clippy::allow_attributes və clippy::allow_attributes_without_reason yoxlamaları tətbiq olunub ki, bu da "#[allow]" atributlarının "#[expect(lint)]" ilə əvəz edilməsini asanlaşdırır.
  • Yeni mütəxəssislərə əlavə olunan yoxlama səviyyələrinin (lint) dəyişikliyinin səbəbini sənədləşdirməyə imkan verildi ki, bu da kompilatorda mesaj şəklində yeni proqramçılara hər bir yoxlamanın əlavə edilməsinin səbəblərini izah edən məlumat təqdim edir. Məsələn: #![deny(clippy::float_arithmetic, reason = "no hardware float support")]
  • Yeni API stabil vəziyyətə keçirilib, o cümlədən stabil edilmiş metodlar və strukturlar:
    • core::error
    • hint::assert_unchecked
    • fs::exists
    • AtomicBool::fetch_not
    • Duration::abs_diff
    • IoSlice::advance
    • IoSlice::advance_slices
    • IoSliceMut::advance
    • IoSliceMut::advance_slices
    • PanicHookInfo
    • PanicInfo::message
    • PanicMessage

    "const" bayrağı, hər hansı bir kontekstdə dəyişənlər yerinə istifadənin mümkünlüyünü müəyyən edir, funksiyalarda tətbiq olunub:

    • char::from_u32_unchecked (funksiya)
    • char::from_u32_unchecked (metod)
    • CStr::count_bytes
    • CStr::from_ptr

    std::panic::PanicInfo tipi std::panic::PanicHookInfo olaraq dəyişdirilib (köhnə adı istifadə etməyə davam edəcək, lakin növbəti versiyadan etibarən bunun istifadəsi xəbərdarlıq verəcək). Bu zaman core::panic::PanicInfo olduğu kimi qalacaq, lakin ayrı bir tip kimi inkişaf etdiriləcək. Bu növün bölünməsi onlarda snd və no_std kontekstində icra olunmağa xas müxtəlif metodların tətbiq olunmasına imkan verəcək.

  • ABI C-unwind (‘extern «C-unwind»‘) keçidi tamamlandı. Bu, 'extern «C»' suffixi olmayan ABI-dən fərqli olaraq, proqramın qəza ilə dayandığı və yaxud C++ stilində bir istisna baş verdikdə baş verən ‘unwinding’ prosesinin ABI sərhədini keçdiyi zaman təhlükəsiz davranışı (safe) qoruya bilmək imkanını təqdim edir. Misal üçün, bir proqram dili kodunda meydana gələn istisna, bir dil koduna aid olan stekin yetişdiyi zaman ‘unwinding’ edərkən bu sərhədin qarşısını alır. Rust 1.81 buraxılışından başlayaraq, ‘extern «C»’ ABI-si dayanıqsız ‘unwinding’ baş verdikdə qəza ilə dayandırma üçün indiki imkanlara sahibdir.
  • i686-unknown-redox, xtensa-esp32-none-elf, xtensa-esp32s2-none-elf, xtensa-esp32s3-none-elf, xtensa-esp32-espidf, xtensa-esp32s2-espidf, xtensa-esp32s3-espidf platformaları üçün üçüncü dərəcə dəstək təmin edilib. Üçüncü dərəcə, bazardakı dəstəyi nəzərdə tutur, lakin avtomatlaşdırılmış testlər, rəsmi toplanmaların dərc edilməsi və kodun toplanma imkanının yoxlanması olmadan.
  • loongarch64-unknown-linux-musl və arm64ec-pc-windows-msvc hədəf platformaları üçün ikinci dərəcə dəstək təmin edilib. İkinci dərəcə dəstək toplanma təminatını nəzərdə tutur.
  • LoongArch platformasındakı Linux sistemləri üçün tam alətlər dəsti və profilləşdirici təqdim edilib.
  • std::process::Command-da (CVE-2024-43402) Windows platformasında yalnızki baş verən bir zəifliyi aradan qaldırdıq. Bu, Command::arg və Command::args çağırışları ilə istifadə olunmuş spesial simvolların işlənməsi ilə bağlı olaraq, daha əvvəl düzəldilmiş BatBadBut zəifliyinin istismarını yanıltmağa kömək edir. Gerçəkdə, bat- və cmd-skripti işə salındıqda, özünün argument bölmə məntiqinə sahib cmd.exe prosesi işə düşür. Zəiflik, Windows-un yolların əvvəlindəki boşluqları və nöqtələri silməsi müvəqqəti meydana gələn bir qısa yola dayanır, yəni “.bat. .” genişləndirməsi olan bir fayl “.bat” kimi işlənir.

Eyni zamanda, Wedson Almeida Filho-nun (Wedson Almeida Filho) Rust for Linux layihəsinin dəstəkləyicisi olaraq ayrılması da qeyd edilməlidir. Bu, Rust dilində inkişaf vasitələrinin Linux nüvəsinə təqdimatı ilə bağlıdır. Wedson ayrıldıqdan sonra, layihədə hələ iki dəstəkləyici - Miguel Ojeda (Rust-for-Linux layihəsinin müəllifi və əsas inkişafçısı) və Python Software Foundation təşkilatının keçmiş direktoru Alex Gaynor qalıb. Ayrılan dəstəkləyici Microsoft şirkətinin əməkdaşı olub və Rust dilində yazılmış EXT2 FS-i təqib edən eksperimental sürücünün müəllifidir. Son dövrlərdə Almeida'nın işi Rust dilində fayl sistemlərinin inkişafına yönəldilmişdi. Bu il Almeida Rust-for-Linux depozitoriyasına 17 commiti daxil edib (müqayisə üçün, Miguel Ojeda 53 commiti əlavə edib).

Getirərək, bir dəfə heyət mitigasiya olunan texniki məsələlər üstündə mübahisələrə çox enerji sərf etməli olduqlarını düşünür. Almeida, işçi qüvvəsinin, ildən-ildə çox sayda məsələyə qarşı reaksiya vermək üçün tükənməsini, günümüzdə daha mühüm qlobal məqsədə diqqət yetirilməsinə mane olduğunu düşünür. Almeida, gələcəyin, yaddaşın təhlükəsiz işlənməsini təmin edən dillərin istifadəsi ilə bağlı olduğuna inanır və əgər Linux inkişafçıları bunu başa düşməsələr, Linux başqa bir nüvəyə keçəcək, bu da Unixtan baş verən bir şeydir.

Rust-for-Linux layihəsinin tərəfdarları, yeni bir dili öyrənməyə ehtiyac görməyən tanınmış köhnə nüvə inkişafçıları tərəfindən müqavimətlə üzləşdilər. Almeyda, istefa məktubunda, Almeyda və Kent Overstreetin Linux Storage, Filesystem, Memory-Management, and BPF Summit konfransında fəxri danışığa dəvət edildiyi bir müzakirəyə bir misal göstərir, burada Rustun fayl sistemlərinin inkişafında istifadəsi müzakirə olundu. Rustun tətbiqi Ted Ts’o, ext2/ext3/ext4 fayl sistemlərinin yaradıcısı tərəfindən tənqid edildi, o, Rust-for-Linux təşəbbüsünü bir dinin qəbulunu zorla tələb etməyə bənzətdi.

Almeydanın, C proqramlaşdırma dili interfeysləri üçün Rust dilində istifadə etmək üçün yazılan bir sarğı yaratmağı planlaması ilə bağlı Ted Ts’o qeyd etdi ki, bu kimi bir sarğı mütləq problem yaratmalıdır, çünki C interfeyslərindəki heç bir dəyişiklik Rust üçün sarğının dəyişməsini tələb edəcəkdir və o, Rust kodundakı yaranan problemlərin düzəldilməsində əlavə məsuliyyət götürmək istəmir. C kodu daim inkişaf edir və onun dəyişməsi Rust üçün sarğının işini pozarsa, bu, əlaqəli fayl sistemlərinin işini də pozacaqdır.

Ted, yaxın gələcəkdə Rust üçün sarğının ikinci dərəcəli qalacağını və bağlama problemlərinin yalnız Rust-for-Linux inkişafçılarının baş ağrısına çevriləcəyini düşünür, bu, nüvədə fayl sistemləri inkişafçıları üçün deyil. Qeyd edildi ki, bütün inkişafçılar Rustu öyrənməyi planlaşdırmırlar, buna görə başqa kod üzərində etdikləri dəyişiklikləri təsir edən dəyişikliklər etdikdə, yalnız C-də olan asılı kodu yeniləyə biləcəklər, lakin Rust sarğını düzəldə bilməyəcəklər, çünki Rustu bilmir. Müzakirəyə SCSI alt sistemini dəstəkləyən James Bottomley də qatılıb, o dedi ki, bağlamalara daha çox semantika kodlaşdırıldıqca, onlar senkronizasiyanı təmin etmək baxımından daha zəif olur.

Bu arada, Google şirkəti, keçən il Rust dilində pvmfm sabit diskini yenidən yazdı. virtual maşınlarda, Android platformasında işlədilən, C və ya C++-da yazılmış mövcud proqram təminatına Rust dilində kodun mərhələli daxil olma təcrübəsi ilə bölüşüldü. Rust dilində yazılmış funksionallığı eyniliklə təmin edən əvəzləyici komponentlər yaradaraq proqram təminatının təhlükəsizliyini əhəmiyyətli dərəcədə artırmaq mümkündür. Rust-u tətbiq edərkən, yeni kod və təhlükəsizlik baxımından kritik funksiyaları həyata keçirən kod üçün Rust-dan istifadəyə diqqət yetirmək tövsiyə olunur (məsələn, etibarsız mənbələrdən alınan xarici məlumatların işlənməsi üçün kod). Rust və C arasındakı kod inteqrasiyası üçün API-lərlə Rust və C arasında çağırışları tərcümə edən shim vasitələri istifadə olunur (C API Rust-da istifadə üçün ixrac edilir və əksinə), bu da API komponentlərini Rust-a mərhələli şəkildə yazmağa imkan verir.

Mənbə: opennet.ru

DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər 🔥 DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər | ProHoster