Rust 1.51 dasturlash tilining relizi

Mozilla loyihasi tomonidan asos solingan, lekin hozirda Rust Foundation mustaqil notijorat tashkiloti homiyligida ishlab chiqilgan Rust 1.51 tizim dasturlash tilining relizi nashr etildi. Til xotira xavfsizligiga e'tibor qaratadi, xotirani avtomatik boshqarishni ta'minlaydi va axlat yig'uvchi yoki ish vaqtini ishlatmasdan yuqori vazifalar parallelligiga erishish uchun vositalarni taqdim etadi (ish vaqti standart kutubxonani asosiy ishga tushirish va texnik xizmat ko'rsatishga qisqartiriladi).

Rust-ning avtomatik xotira boshqaruvi ko'rsatkichlarni boshqarishda xatolarni yo'q qiladi va past darajadagi xotira manipulyatsiyasi natijasida kelib chiqadigan muammolardan himoya qiladi, masalan, bo'shatilgandan so'ng xotira hududiga kirish, null ko'rsatkichni yo'qotish, buferni haddan tashqari oshirib yuborish va hokazo. Kutubxonalarni tarqatish, yig'ishni ta'minlash va bog'liqliklarni boshqarish uchun loyiha Cargo paketi menejerini ishlab chiqmoqda. Crates.io ombori kutubxonalarni joylashtirish uchun qo'llab-quvvatlanadi.

Asosiy innovatsiyalar:

  • Doimiy generiklardan foydalanish bilan bog'liq funksionallik keng tarqalgan foydalanish uchun yashil chiroqni berib, minimal hayotiy mahsulot (MVP) maqomini oldi. Const generics turlarni doimiy qiymatlarga umumlashtirish imkonini beradi, ya'ni. turlar yoki umrlar emas, balki doimiy qiymatlar oralig'i bilan cheklangan umumiy argumentlardan foydalaning. Bu xususiyat har qanday oʻlchamdagi massivlar uchun belgilarni yaratishda chegaradan tashqari holatlar boʻlmasligini taʼminlash uchun har bir haqiqiy qiymat diapazoni uchun alohida tur yaratmasdan turib, butun sonli parametrlangan turlar va abstraksiyadan foydalanish imkonini beradi.

    Joriy nashrdan boshlab, “[T;” tipidagi massivlar uchun; N]" (T turi va N o'lchami) har qanday butun, mantiqiy va belgilar turlariga ega bo'lgan qiymatlardan foydalangan holda tur va o'lchamni abstrakt qilish imkoniyatini beradi (struktura va enum turlari hali qo'llab-quvvatlanmaydi). Doimiy generiklar kutubxonani ishlab chiqishni sezilarli darajada soddalashtiradi; masalan, ma'lum bir tur va o'lchamga bog'liq bo'lmagan massivdan foydalanish uchun quyidagilarni belgilashingiz mumkin: struct Array { // ^^^^^^^^^^^^^^^^^^^^^ doimiy umumiy roʻyxatning taʼrifi: [T; LENGTH] // ^^^^^^ undan foydalanish }

    Haqiqatan ham ushbu ta'rif bilan foydalanilganda "Array » kompilyator Array ning monomorf versiyasini yaratadi: struct Array { roʻyxat: [u8; 32] }

  • Doimiy generiklarga asoslangan std::array::IntoIter API barqarorlashtirildi, uning yordamida istalgan massiv uchun qiymat bo‘yicha iteratorlar yaratishingiz mumkin: fn main() { let array = [1, 2, 3, 4, 5] ; // Ilgari, qiymatni takrorlash uchun array.iter().copied() dagi element uchun .iter() usulini chaqirishingiz kerak edi { println!("{}", item); } // Endi siz std::array::IntoIter::new(array) da elementni belgilashingiz mumkin { println!("{}", element); } }
  • Yuk paketi menejeri endi Cargo.toml-dagi yangi rezolyutsiya maydonini qo'llab-quvvatlaydi, bu xususiyat rezolyutsiyaning ikkinchi versiyasini yoqish uchun ishlatilishi mumkin. Ta'riflovchining yangi versiyasi "[xususiyatlar]" bo'limida sanab o'tilgan qaramlik xususiyatlarini birlashtirishdan qochadi, bunda u noto'g'ri bo'lsa, masalan, qurish skriptlari va makroslarda ba'zi standart funksiyalarni talab qiladigan bog'liqlikni qo'shganda, lekin nostandart xususiyatdan foydalanganda natijada bajariladigan faylda.

    Shu paytgacha bog'liqlik grafigida bir necha marta eslatib o'tilgan paketning imkoniyatlari birlashtirilgan. Misol uchun, agar loyiha A va B imkoniyatlarini belgilaydigan foo bog'liqligini o'z ichiga olsa va bu paket boshqa bar va baz paketlarida ishlatilsa, bar A xususiyatiga ega foo ga va baz B xususiyatiga ega foo ga bog'liq bo'lsa, u holda natijada yuk bu xususiyatlarni birlashtiradi va foo-ni A va B xususiyatlari bilan kompilyatsiya qiladi.Ushbu usul ba'zi qaramlik tufayli natijada tuzilgan maqsadli tizimga mos kelmasligi tufayli xususiyat yoqilgan bo'lishi mumkin. Masalan, “#![no_std]” bilan tuzilgan bajariladigan faylda “#![no_std]” bilan foo versiyasidan foydalanmoqchi bo‘lsangiz va shu bilan birga qurishda “std” bilan foo dan foydalaning. rs. Cargo.toml da resolver="2" ni ko'rsatganda, paket menejeri endi ishlab chiqaruvchi, xost va maqsad bog'liqliklarini ajratib, ushbu ziddiyatni to'g'ri hal qilishga harakat qiladi.

  • Cargo "[profil]" bo'limida o'rnatilgan split-debuginfo opsiyasini va rustc-da mos keladigan "-Csplit-debuginfo=unpacked" bayrog'ini amalga oshiradi, bu esa disk raskadrovka ma'lumotlarini saqlashning yangi usulini joriy qilishni taklif qiladi, bu esa nosozliklarni tuzatish zaruriyatini yo'q qiladi. dsymutil yordam dasturiga qo'ng'iroq qiling va macOS-da disk raskadrovka ma'lumotlari yordamida qurish jarayonini sezilarli darajada tezlashtiradi.
  • Stabillashtirilgan makos "ptr::addr_of!" va "ptr::addr_of_mut!", bu sizga tekislanmagan maydonlar uchun xom ko'rsatkichlar yaratish imkonini beradi. std::ptr dan foydalaning; #[repr(qadoqlangan)] struct Packed { f1: u8, f2: u16, } let packed = Packed { f1: 1, f2: 2 }; // &packed.f2 noaniq xatti-harakatga olib keladigan tekislanmagan ko'rsatgich yaratadi, raw_f2 = ptr::addr_of!(packed.f2); assert_eq!(xavfsiz {raw_f2.read_unaligned() }, 2);
  • APIning yangi qismi barqaror toifaga o'tkazildi, jumladan, quyidagi usullar barqarorlashtirildi:
    • Arc::decrement_strong_count
    • Arc::increment_strong_count
    • Bir marta::call_once_force
    • Peekable::next_if_eq
    • Peekable::next_if
    • Search::stream_position
    • massiv::IntoIter
    • vahima::panic_any
    • ptr::addr_of!
    • ptr::addr_of_mut!
    • slice::fill_with
    • slice::split_inclusive_mut
    • slice::split_inclusive
    • slice::strip_prefiks
    • slice :: strip_suffix
    • str::split_inclusive
    • sinxronlash::OnceState
    • vazifa:: Uyg'oning
  • Qo'llab-quvvatlashning uchinchi darajasi i386-noma'lum-linux-gnu, i486-noma'lum-linux-gnu, aarch64_be-noma'lum-linux-gnu, aarch64-unknown-linux-gnu_ilp32 va aarch64_be-noma'lum-linux-gnu_ilp uchun amalga oshirildi. . Uchinchi daraja asosiy qo'llab-quvvatlashni o'z ichiga oladi, lekin avtomatlashtirilgan testlarsiz, rasmiy tuzilmalarni nashr etmasdan yoki kodni qurish mumkinligini tekshirmasdan.

Manba: opennet.ru

a Izoh qo'shish