Rust 1.82 шығарылды. Rust негізіндегі жаңа шолғыш. Volvo-да Rust пайдалану

Mozilla жобасы негізін қалаған, бірақ қазір Rust Foundation тәуелсіз коммерциялық емес ұйымының қолдауымен әзірленген Rust 1.82 жалпы мақсаттағы бағдарламалау тілінің шығарылымы жарияланды. Тіл жад қауіпсіздігіне назар аударады және қоқыс жинаушы мен жұмыс уақытын пайдалануды болдырмай, жоғары жұмыс параллелизміне қол жеткізу құралдарын қамтамасыз етеді (орындау уақыты стандартты кітапхананың негізгі инициализациясы мен қызмет көрсетуіне дейін қысқарады).

Rust жадты өңдеу әдістері әзірлеушіні көрсеткіштерді өңдеу кезіндегі қателерден сақтайды және жадтың төменгі деңгейін өңдеуге байланысты туындайтын мәселелерден қорғайды, мысалы, оны босатқаннан кейін жад аймағына қол жеткізу, нөлдік көрсеткіштерге сілтеме жасау, буфердің асып кетуі және т.б. Кітапханаларды тарату, құрастыруды қамтамасыз ету және тәуелділіктерді басқару үшін жоба Cargo пакетінің менеджерін әзірлейді. Crates.io репозиторийіне хостинг кітапханалары үшін қолдау көрсетіледі.

Жадтың қауіпсіздігі Rust бағдарламасында компиляция уақытында анықтамалық тексеру, объект иеленуін қадағалау, объектінің қызмет ету мерзімін (аумақтарын) қадағалау және кодты орындау кезінде жадқа қол жеткізудің дұрыстығын бағалау арқылы қамтамасыз етіледі. Rust сонымен қатар бүтін сандардың толып кетуінен қорғауды қамтамасыз етеді, пайдалану алдында айнымалы мәндерді міндетті түрде инициализациялауды талап етеді, стандартты кітапханада қателерді жақсы өңдейді, әдепкі бойынша өзгермейтін сілтемелер мен айнымалылар тұжырымдамасын қолданады, логикалық қателерді азайту үшін күшті статикалық теруді ұсынады.

Негізгі инновациялар:

  • Репозиторийдегі пакет туралы ақпаратты көрсету үшін жүк пакетінің менеджеріне «ақпарат» пәрмені қосылды.
  • Жасырын түрлер туралы ақпаратты көрсететін "impl Trait" ішіндегі "use<..>" синтаксисіне қолдау қосылды. Мысалы, "impl Trait + use<'x, T>" жасырын түрде тек "x" және "T" параметрлерін пайдалануға рұқсат етілгенін көрсетеді.
  • Бұрын пайдаланылған макростарды ауыстыратын шикі көрсеткіштерді жасауға арналған бөлек синтаксис ұсынылды: “addr_of!(expr)” макросы “&raw const expr” операторымен және “addr_of_mut!(expr)” макросы ауыстырылды. "&raw mut" операторы expr" арқылы. struct Бумаланған {not_aligned_field: i32, } fn main() { let p = Бумаланған {not_aligned_field: 1_82}; // Шикі көрсеткішті жасаудың ескі жолы ptr = std::ptr::addr_of!(p.not_aligned_field); // Шикі көрсеткішті жасаудың жаңа жолы let ptr = &raw const p.not_aligned_field; let val = қауіпті { ptr.read_unaligned() }; }
  • «Қауіпті» атрибуты бар сыртқы блоктардың ішінде «статикалық» қызмет ету мерзімі бар қауіпсіз функциялар мен тұрақтыларды анықтауға болады (бұрын «қауіпті extern» элементіндегі барлық элементтер тек «қауіпті» атрибутқа ие болуы мүмкін): unsafe extern { pub safe статикалық TAU : f64; pub safe fn sqrt(x: f64) -> f64; pub unsafe fn strlen(p: *const u8) -> usize; }
  • Анықталмаған әрекетке әкеп соғуы мүмкін no_mangle, link_section және export_name атрибуттары енді қауіпті деп саналады және анық "қауіпті" жалаушаны талап етеді, мысалы: #[unsafe(no_mangle)] pub fn my_global_function() { }
  • Үлгіні сәйкестендіру "enum Void {}" немесе көрінетін бос өрісі бар құрылымдар сияқты бос түрлерді өткізіп жіберуге мүмкіндік береді. std::convert::Infallibable пайдаланыңыз; pub fn орамды_үрейсіз_ашу (x: Нәтиже ) -> T { болсын Ok(x) = x; // «Қате» өткізіп жіберуге болады x }
  • Жылжымалы нүкте сандарының түрлері (f32 және f64) сандық емес NaN мәндерін (0.0/0.0) өңдеу кезінде стандартталған әрекетке ие, сонымен қатар const fn ішінде өзгермелі нүкте әрекеттерін пайдалануға мүмкіндік береді.
  • Құрастыру кірістірулері бүтін сандық мәндерді алдымен регистрде сақтамай-ақ тікелей пайдалану үшін «const» атрибуты бар операндтарды пайдалану мүмкіндігін береді. const MSG: &str = "Сәлем, әлем!\n"; unsafe { core::arch::asm!( “mov rdx, {LEN} // 'mov rdx, 14′” нұсқауы жасалады, LEN = const MSG.len(), … ); }
  • Қауіпсіз блокты анықтамай қауіпсіз контексте «статикалық» атрибуты бар өрнектерді адрестеуге рұқсат етіледі («&raw mut» және «&raw const» операторлары операнд мәніне әсер етпейді және тек оған көрсеткіш жасайды): статикалық mut STATIC_MUT: Түр = Түр::жаңа( ); extern "C" { статикалық EXTERN_STATIC: Түр; } fn main() { let static_mut_ptr = &raw mut STATIC_MUT; let extern_static_ptr = &raw const EXTERN_STATIC; }
  • API жаңа бөлігі тұрақты санатқа ауыстырылды, оның ішінде белгілердің әдістері мен іске асырылуы тұрақтандырылды:
    • std::thread::Builder::spawn_unchecked
    • std::str::CharIndices::offset
    • std::option::Option::is_none_or
    • [T]::сұрыпталған
    • [T]::сортталған
    • [T]::кілт бойынша_сұрыпталған
    • Итератор::сұрыпталған
    • Итератор::сортталған
    • Итератор::кілт бойынша_сұрыпталған
    • std::future::Ready::into_inner
    • std::iter::repeat_n
    • impl DoubleEndedIterator үшін Take

      Ақпарат көзі: opennet.ru

пікір қалдыру