Montaj qo'shimchalarini qo'llab-quvvatlaydigan Rust 1.59 dasturlash tilining chiqarilishi

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

  • Bajarishni past darajada nazorat qilish yoki maxsus mashina ko'rsatmalaridan foydalanish imkoniyatiga ega bo'lgan ilovalarda talabga ega bo'lgan montaj tilining qo'shimchalaridan foydalanish mumkin. O'rnatish qo'shimchalari "asm!" makroslari yordamida qo'shiladi. va "global_asm!" Rustda satrlarni almashtirish uchun ishlatiladiganga o'xshash registrlarni nomlash uchun string formatlash sintaksisidan foydalanish. Kompilyator x86, x86-64, ARM, AArch64 va RISC-V arxitekturalari uchun montaj ko'rsatmalarini qo'llab-quvvatlaydi. Qo'shish misoli: std::arch::asm dan foydalaning; // Shishishlar yordamida x ni 6 ga ko'paytiring va let mut x ni qo'shing: u64 = 4; xavfli { asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "add {x}, {tmp}", x = inout(reg ) x, tmp = out(reg) _, ); } assert_eq!(x, 4 * 6);
  • Ifodaning chap tomonida bir nechta belgilar, bo'laklar yoki tuzilmalar ko'rsatilgan vayron qilingan (parallel) topshiriqlar uchun qo'shimcha yordam. Masalan: kelsin (a, b, c, d, e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Struct { e, .. } = Struct { e: 5, f: 3 }; assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
  • Const generics uchun standart qiymatlarni belgilash imkoniyati taqdim etilgan: struct ArrayStorage { arr: [T; N], } ishora ArrayStorage { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage {arr: [a, b], } } }
  • Yuk paketi menejeri kompilyatordagi xatolar tufayli qayta ishlangan bog'liqliklarda noto'g'ri tuzilmalardan foydalanish to'g'risida ogohlantirishlar beradi (masalan, xatolik tufayli qadoqlangan tuzilmalar maydonlarini xavfsiz bloklarda qarzga olishga ruxsat berildi). Rustning kelajakdagi versiyasida bunday konstruktsiyalar endi qo'llab-quvvatlanmaydi.
  • Cargo va rustc-da disk raskadrovka ma'lumotlaridan (strip = "debuginfo") va belgilardan (strip = "ramzlar") ajratilgan bajariladigan fayllarni alohida yordamchi dasturga qo'ng'iroq qilmasdan yaratish uchun o'rnatilgan qobiliyat mavjud. Tozalash sozlamalari Cargo.toml-dagi "strip" parametri orqali amalga oshiriladi: [profile.release] strip = "debuginfo", "ramzlar"
  • Incremental kompilyatsiya sukut bo'yicha o'chirilgan. Buning sababi kompilyatordagi nosozliklar va seriyani bekor qilish xatolariga olib keladigan xatolik uchun vaqtinchalik yechim ekanligi aytilmoqda. Xatolarni tuzatish allaqachon tayyorlangan va keyingi nashrga kiritiladi. Qo'shimcha kompilyatsiyani qaytarish uchun RUSTC_FORCE_INCREMENTAL=1 muhit o'zgaruvchisidan foydalanishingiz mumkin.
  • APIning yangi qismi barqaror toifaga ko'chirildi, shu jumladan xususiyatlarning usullari va amalga oshirilishi barqarorlashtirildi:
    • std::thread::available_parallelism
    • Natija::ko'chirildi
    • Natija::klonlangan
    • arch::asm!
    • arch::global_asm!
    • ops ::ControlFlow ::is_break
    • ops::ControlFlow::is_continue
    • u8 uchun TryFrom
    • char::TryFromCharError (klonlash, disk raskadrovka, displey, qisman tenglama, nusxalash, tenglama, xato)
    • iter::zip
    • NonZeroU8::ikkining_quvvati
    • NonZeroU16::ikkining_quvvati
    • NonZeroU32::ikkining_quvvati
    • NonZeroU64::ikkining_quvvati
    • NonZeroU128::ikkining_quvvati
    • ToLowercase tuzilishi uchun DoubleEndedIterator
    • ToUppercase tuzilishi uchun DoubleEndedIterator
    • TryFrom<&mut [T]> uchun [T; N]
    • Once tuzilmasi uchun UnwindSafe
    • Bir martalik RefUnwindSafe
    • armv8 neon qo'llab-quvvatlash funktsiyalari aarch64 uchun kompilyatorga o'rnatilgan
  • Konstantalar o'rniga uni istalgan kontekstda ishlatish imkoniyatini belgilovchi "const" atributi funksiyalarda qo'llaniladi:
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_checked

Manba: opennet.ru

a Izoh qo'shish