Rust 1.64 dasturlash tilining relizi

Mozilla loyihasi tomonidan asos solingan, ammo hozirda Rust Foundation mustaqil notijorat tashkiloti homiyligida ishlab chiqilgan Rust 1.64 umumiy maqsadli dasturlash tilining nashri chop etildi. Til xotira xavfsizligiga e'tibor qaratadi va axlat yig'uvchi va ish vaqtidan foydalanishdan qochgan holda yuqori ish parallelligiga erishish vositalarini taqdim etadi (ish vaqti standart kutubxonani asosiy ishga tushirish va texnik xizmat ko'rsatishga qisqartiriladi).

Rust-ning xotira bilan ishlash usullari ishlab chiquvchini ko'rsatkichlarni boshqarishda xatolardan qutqaradi va past darajadagi xotira bilan ishlash natijasida yuzaga keladigan muammolardan himoya qiladi, masalan, bo'shatilgandan so'ng xotira maydoniga kirish, null ko'rsatkichlarni o'chirish, buferni ortiqcha yuklash va hokazo. Kutubxonalarni tarqatish, qurishni ta'minlash va bog'liqliklarni boshqarish uchun loyiha Cargo paketi menejerini ishlab chiqadi. Crates.io ombori kutubxonalarni joylashtirish uchun qo'llab-quvvatlanadi.

Xotira xavfsizligi Rust-da kompilyatsiya vaqtida mos yozuvlarni tekshirish, ob'ektga egalik qilish, ob'ektning ishlash muddatini (ko'lamini) kuzatib borish va kodni bajarish paytida xotiraga kirishning to'g'riligini baholash orqali ta'minlanadi. Rust shuningdek, butun sonlarning to'lib ketishidan himoya qiladi, ishlatishdan oldin o'zgaruvchan qiymatlarni majburiy ishga tushirishni talab qiladi, standart kutubxonada xatolarni yaxshiroq boshqaradi, sukut bo'yicha o'zgarmas havolalar va o'zgaruvchilar tushunchasini qo'llaydi, mantiqiy xatolarni minimallashtirish uchun kuchli statik yozishni taklif qiladi.

Asosiy innovatsiyalar:

  • Kompilyatordagi Linux muhiti, Cargo paketlar menejeri va libstd standart kutubxonasi uchun talablar oshirildi - Glibc uchun minimal talablar 2.11-versiyadan 2.17-ga, Linux yadrosi esa 2.6.32-versiyadan 3.2-ga koʻtarildi. Cheklovlar libstd bilan tuzilgan Rust ilovasining bajariladigan fayllariga ham tegishli. RHEL 7, SLES 12-SP5, Debian 8 va Ubuntu 14.04 tarqatish to'plamlari yangi talablarga javob beradi. RHEL 6, SLES 11-SP4, Debian 7 va Ubuntu 12.04-ni qo‘llab-quvvatlash to‘xtatiladi. Eski Linux yadrosi bo'lgan muhitlarda Rust-build bajariladigan fayllardan foydalanadigan foydalanuvchilarga moslikni saqlash uchun o'z tizimlarini yangilash, kompilyatorning eski versiyalarida qolish yoki qatlamlar bilan o'zlarining libstd vilkalarini saqlash tavsiya etiladi.

    Eski Linux tizimlarini qo'llab-quvvatlashni to'xtatish sabablari orasida eski muhitlar bilan muvofiqlikni davom ettirish uchun cheklangan resurslar mavjud. Eski Glibc-ni qo'llab-quvvatlash, LLVM va o'zaro kompilyatsiya yordam dasturlarida versiya talablarining ortib borayotgani sharoitida uzluksiz integratsiya tizimida tekshirishda eski vositalardan foydalanishni talab qiladi. Yadro versiyasiga bo'lgan talablarning oshishi eski yadrolar bilan mosligini ta'minlash uchun qatlamlarni saqlashga hojat qoldirmasdan libstd-da yangi tizim qo'ng'iroqlaridan foydalanish imkoniyati bilan bog'liq.

  • IntoFuture xususiyati barqarorlashtirildi, u IntoIteratorga o'xshaydi, lekin ikkinchisidan "for ... in ..." tsikllari o'rniga ".await" dan foydalanish bilan farqlanadi. IntoFuture bilan birlashganda, ".await" kalit so'zi nafaqat Future xususiyatini, balki Futurega aylantirilishi mumkin bo'lgan har qanday boshqa turlarni ham kutishi mumkin.
  • Rust-analizator yordam dasturi Rust relizlari bilan ta'minlangan yordam dasturlari to'plamiga kiritilgan. Yordamchi dastur rustup yordamida o'rnatish uchun ham mavjud (rustup komponenti zang-analizatorni qo'shadi).
  • Yuk paketi menejeri Rust versiyalari va ombor URL manzillari kabi paketlar orasidagi umumiy maydon qiymatlarining takrorlanishini bartaraf etish uchun ish maydoni merosini o'z ichiga oladi. Bundan tashqari, bir vaqtning o'zida bir nechta maqsadli platformalar uchun qurilish qo'llab-quvvatlashi qo'shildi (endi "--target" variantida bir nechta parametrlarni belgilashingiz mumkin).
  • APIning yangi qismi barqaror toifaga ko'chirildi, shu jumladan xususiyatlarning usullari va amalga oshirilishi barqarorlashtirildi:
    • kelajak::IntoFuture
    • num::NonZero*::checked_mul
    • num::NonZero*::checked_pow
    • num::NonZero*::saturating_mul
    • num::NonZero*::saturating_pow
    • num::NonZeroI*::abs
    • num::NonZeroI*::checked_abs
    • num::NonZeroI*::overflowing_abs
    • num::NonZeroI*::saturating_abs
    • num::NonZeroI*::unsigned_abs
    • num::NonZeroI*::wrapping_abs
    • num::NonZeroU*::checked_add
    • num::NonZeroU*::checked_key_qudrati ikki
    • num::NonZeroU*::saturating_add
    • os::unix::process::CommandExt::process_group
    • os::windows::fs::FileTypeExt::is_symlink_dir
    • os::windows::fs::FileTypeExt::is_symlink_file
  • Ilgari std::ffi modulida barqarorlashtirilgan C-mos keluvchi turlar yadro va alloc kutubxonasiga qo'shildi:
    • yadro::ffi::CStr
    • core::ffi::FromBytesWithNulError
    • alloc::ffi::CString
    • alloc::ffi::FromVecWithNulError
    • alloc::ffi::IntoStringError
    • alloc::ffi::NulError
  • Oldin std::os::raw modulida barqarorlashtirilgan C turlari yadro ::ffi va std::ffi modullariga qo‘shildi (masalan, uint va ulong C turlari uchun c_uint va c_ulong turlari taklif qilingan):
    • ffi::c_char
    • ffi::c_double
    • ffi::c_float
    • ffi::c_int
    • ffi::c_long
    • ffi::c_longlong
    • ffi::c_schar
    • ffi::c_short
    • ffi::c_uchar
    • ffi::c_uint
    • ffi::c_ulong
    • ffi::c_ulonglong
    • ffi::c_ushort
  • So'rov mexanizmi bilan foydalanish uchun past darajadagi ishlov beruvchilar barqarorlashtirildi (kelajakda Pull va Pin kabi past darajadagi tuzilmalardan foydalanishni talab qilmaydigan soddalashtirilgan API taqdim etish rejalashtirilgan):

    • kelajak::poll_fn
    • vazifa::tayyor!
  • Slice::from_raw_parts funksiyasida uni doimiylar o‘rniga istalgan kontekstda ishlatish imkoniyatini belgilovchi “const” atributi qo‘llaniladi.
  • Ma'lumotlarni yanada ixcham saqlash uchun Ipv4Addr, Ipv6Addr, SocketAddrV4 va SocketAddrV6 tuzilmalarining xotira tartibi o'zgartirildi. Tuzilmalarni past darajadagi manipulyatsiya qilish uchun std::mem::transmute ishlatadigan bitta quti paketlari bilan moslik muammosi bo'lishi mumkin.
  • Windows platformasi uchun zang kompilyatorini qurishda PGO optimallashtirish (profil bo'yicha optimallashtirish) qo'llaniladi, bu kodni kompilyatsiya qilish samaradorligini 10-20% ga oshirish imkonini berdi.
  • Kompilyator muayyan tuzilmalarda foydalanilmagan maydonlar haqida yangi ogohlantirishni amalga oshirdi.

Bundan tashqari, siz gccrs loyihasi (GCC Rust) tomonidan tayyorlangan va GCCga qo'shish uchun tasdiqlangan Rust tili kompilyatorining muqobil joriy etilishini ishlab chiqish bo'yicha holat hisobotini qayd etishingiz mumkin. Frontendni integratsiyalashgandan so'ng, standart GCC vositalari LLVM ishlanmalari yordamida qurilgan rustc kompilyatorini o'rnatmasdan Rust tilida dasturlarni kompilyatsiya qilish uchun ishlatilishi mumkin. Rivojlanish yo'lda va har qanday kutilmagan muammolarni bartaraf etar ekan, Rust frontend keyingi yilning may oyida rejalashtirilgan GCC 13 versiyasiga birlashtiriladi. Rust-ning GCC 13 ilovasi beta holatida bo'ladi, hali sukut bo'yicha yoqilmagan.

Manba: opennet.ru

a Izoh qo'shish