Rust 1.53 chiqarildi. Google Linux yadrosiga Rust yordamini qo'shishni moliyalashtiradi

Mozilla loyihasi tomonidan asos solingan, lekin hozirda Rust Foundation mustaqil notijorat tashkiloti homiyligida ishlab chiqilgan Rust 1.53 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:

  • Massivlar uchun IntoIterator xususiyati amalga oshirildi, bu sizga massiv elementlarini qiymatlar bo'yicha iteratsiyani tashkil qilish imkonini beradi: for i in [1, 2, 3] { .. }

    Massivlarni iteratorlarni qabul qiluvchi usullarga o'tkazish ham mumkin, masalan: let set = BTreeSet::from_iter([1, 2, 3]); (a, b) uchun some_iterator.chain([1]).zip([1, 2, 3]) { .. }

    Ilgari, IntoIterator faqat massiv havolalari uchun amalga oshirildi, ya'ni. havolalardan foydalanishni talab qiladigan qiymatlarni takrorlash (“&[1, 2, 3]”) yoki “[1, 2, 3].iter()”. Massivlar uchun IntoIterator dasturini amalga oshirishga avvalroq kompilyatorni array.into_iter() dan (&array).into_iter() o‘tkazish natijasida kelib chiqqan muvofiqlik muammolari to‘sqinlik qildi. Bu muammolar vaqtinchalik yechim bilan hal qilindi - kompilyator array.into_iter() ni (&array).into_iter() ga aylantirishni davom ettiradi, xuddi IntoIterator xususiyati amalga oshirilmagandek, lekin faqat ".into_iter() yordamida usulni chaqirganda. )" sintaksisi va qo'ng'iroqlarga tegmasdan "in [1, 2, 3]", "iter.zip([1, 2, 3])", "IntoIterator::into_iter([1, 2, 3] )".

  • “|” iboralarini belgilash mumkin (mantiqiy YOKI operatsiya) shablonning istalgan qismida, masalan, “Some(1) | Ba'zi(2)" so'zini endi "Ba'zi(1 | 2)" yozishingiz mumkin: mos natija { Ok(Ba'zi(1 | 2)) => { .. } Xato (Mening xatom { turi: FileNotFound | PermissionDenied, .. }) = > { .. } _ => { .. } }
  • Identifikatorlarda ASCII bo'lmagan belgilardan foydalanishga ruxsat beriladi, shu jumladan Unicode UAX 31 spetsifikatsiyasida belgilangan har qanday milliy belgilar, lekin emoji belgilari bundan mustasno. Agar siz turli xil, ammo o'xshash belgilardan foydalansangiz, kompilyator ogohlantirish beradi. const BLÅHAJ: &str = "🦈"; struct yẺ { yān: String,} a = 1 bo'lsin; letsos = 2; Ogohlantirish: identifikator juftligi "s" va "s" o'rtasida chalkash deb hisoblanadi
  • API-larning yangi qismi barqaror toifaga o'tkazildi, jumladan, quyidagi barqarorlashtirilgan:
    • massiv::from_ref
    • massiv::from_mut
    • AtomicBool::fetch_update
    • AtomicPtr::fetch_update
    • BTreeSet :: saqlang
    • BTreeMap :: saqlang
    • BufReader::seek_relative
    • cmp::min_by
    • cmp :: min_by_key
    • cmp::max_by
    • cmp::max_by_key
    • DebugStruct::finish_non_exhaustive
    • Davomiyligi::ZERO
    • Davomiyligi::MAX
    • Davomiyligi::nol
    • Davomiyligi::to'yingan_qo'shish
    • Duration::saturating_sub
    • Duration::saturating_mul
    • f32::subnormal
    • f64::subnormal
    • Massivlar uchun IntoIterator
    • {integer}::BITS
    • io :: Xato :: Qo'llab-quvvatlanmaydi
    • Nondan tashqari*:: yetakchi_nollar
    • Nondan tashqari*::so'nggi_nollar
    • Variant :: kiritish
    • Buyurtma::is_eq
    • Buyurtma berish::is_ne
    • Buyurtma::is_lt
    • Buyurtma::is_gt
    • Buyurtma::is_le
    • Buyurtma::is_ge
    • OsStr::make_ascii_kichik harf
    • OsStr::make_ascii_uppercase
    • OsStr::to_ascii_kichik harf
    • OsStr::to_ascii_uppercase
    • OsStr::is_ascii
    • OsStr::eq_ignore_ascii_case
    • Peekable::peek_mut
    • Rc::increment_strong_count
    • Rc::decrement_strong_count
    • slice::IterMut::as_slice
    • slice::IterMut uchun AsRef<[T]>
    • impl SliceIndex for (Bound , Bog'langan )
    • Vec::extend_from_within
  • wasm64-noma'lum-noma'lum platformani qo'llab-quvvatlashning uchinchi darajasi amalga oshirildi. Uchinchi daraja asosiy qo'llab-quvvatlashni o'z ichiga oladi, lekin avtomatlashtirilgan testlarsiz, rasmiy tuzilmalarni nashr etmasdan yoki kodni qurish mumkinligini tekshirmasdan.
  • Yuk paketi menejeri sukut bo'yicha Git omborining asosiy filiali (HEAD) uchun "asosiy" nomidan foydalanishga o'tkazildi. Magistr o'rniga main nomini ishlatadigan omborlarda joylashgan bog'liqliklar endi filial = "asosiy" sozlanishini talab qilmaydi.
  • Kompilyatorda LLVM ning minimal versiyasiga qo'yiladigan talablar LLVM 10 ga ko'tariladi.

Bundan tashqari, Rust tilidagi komponentlarni ishlab chiqish vositalarining Linux yadrosiga integratsiyani rivojlantirish uchun mablag' ajratilishini ta'kidlashimiz mumkin. Ish "Let's Encrypt" loyihasining asoschisi bo'lgan va HTTPS-ni va ma'lumotlar xavfsizligini oshirish uchun texnologiyalarni ishlab chiqishni targ'ib qiluvchi ISRG tashkiloti (Internet xavfsizligi tadqiqot guruhi) homiyligida Prossimo loyihasi doirasida amalga oshiriladi. Internet. Mablag‘ Google tomonidan taqdim etiladi, u Rust-for-Linux loyihasi muallifi Migel Ojedaning ish haqini to‘laydi. Ilgari, ISRG va Google allaqachon curl yordam dasturi uchun muqobil HTTP backendini yaratish va Apache http serveri uchun yangi TLS modulini ishlab chiqishni moliyalashtirgan.

Microsoft va Google ma'lumotlariga ko'ra, zaifliklarning qariyb 70 foizi xotirani xavfsiz ishlatishdan kelib chiqadi. Qurilma drayverlari kabi yadro komponentlarini ishlab chiqish uchun Rust tilidan foydalanish xavfli xotira bilan ishlash natijasida yuzaga keladigan zaifliklar xavfini kamaytiradi va xotira hududi bo'shatilgandan so'ng unga kirish va bufer chegaralaridan oshib ketish kabi xatolarni bartaraf qiladi.

Rust kompilyatsiya vaqtida xotira xavfsizligini mos yozuvlarni tekshirish, ob'ektga egalik qilish va ob'ektning ishlash muddatini kuzatish (ko'lamlar) va ish vaqtida xotiraga kirishning to'g'riligini baholash orqali amalga oshiradi. Rust shuningdek, butun sonlarning to'lib ketishidan himoya qiladi, foydalanishdan oldin o'zgaruvchan qiymatlarni ishga tushirishni talab qiladi, standart kutubxonada xatolarni yaxshiroq boshqarishga ega, sukut bo'yicha o'zgarmas havolalar va o'zgaruvchilar tushunchasidan foydalanadi va mantiqiy xatolarni minimallashtirish uchun kuchli statik yozishni taklif qiladi.

Manba: opennet.ru

a Izoh qo'shish