Rust 1.59 бағдарламалау тілін құрастыру кірістірулерін қолдаумен шығару

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

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

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

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

  • Предоставлена возможность использования ассемблерных вставок, востребованных в приложениях, которым необходимо управлять выполнением на низком уровне или иметь возможность использования специализированных машинных инструкций. Ассемблерные вставки добавляются при помощи макросов «asm!» и «global_asm!» с использованием для именования регистров синтаксиса форматирования строк, аналогичного тому, что используется в строковых подстановках в Rust. Компилятором поддерживаются ассемблерные инструкции для архитектур x86, x86-64, ARM, AArch64 и RISC-V. Пример вставки: use std::arch::asm; // Multiply x by 6 using shifts and adds let mut x: u64 = 4; unsafe { 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);
  • Добавлена поддержка деструктурированных (параллельных) присвоений, в которых в левой части выражения указывается несколько типажей, слайсов или структур. Например: let (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»): struct ArrayStorage<T, const N: usize = 2> { arr: [T; N], } impl<T> ArrayStorage<T> { fn new(a: T, b: T) -> ArrayStorage<T> { ArrayStorage { arr: [a, b], } } }
  • В пакетном менеджере Cargo обеспечен вывод предупреждений об использовании в зависимостях недопустимых конструкций, обрабатываемых из-за ошибок в компиляторе (например, из-за ошибки допускалось заимствование полей упакованных структур в safe-блоках). Поддержка подобных конструкций будет прекращена в будущей версии Rust.
  • В cargo и rustc встроена возможность генерации исполняемых файлов, очищенных от отладочных данных (strip = «debuginfo») и символов (strip = «symbols»), без необходимости вызова отдельной утилиты. Настройка очистки реализуется через параметр «strip» в Cargo.toml: [profile.release] strip = «debuginfo», «symbols»
  • По умолчанию отключена инкрементальная компиляция. В качестве причины называется временный обход ошибки в компиляторе, приводящей к сбоям и выводу ошибок десериализации. Исправление ошибки уже подготовлено и войдёт в состав следующего выпуска. Для возвращения инкрементальной компиляции можно использовать переменную окружения RUSTC_FORCE_INCREMENTAL=1.
  • API жаңа бөлігі тұрақты санатқа ауыстырылды, оның ішінде белгілердің әдістері мен іске асырылуы тұрақтандырылды:
    • std::thread::available_parallelism
    • Result::copied
    • Result::cloned
    • arch::asm!
    • arch::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • TryFrom for u8
    • char::TryFromCharError (Clone, Debug, Display, PartialEq, Copy, Eq, Error)
    • iter::zip
    • NonZeroU8::is_power_of_two
    • NonZeroU16::is_power_of_two
    • NonZeroU32::is_power_of_two
    • NonZeroU64::is_power_of_two
    • NonZeroU128::is_power_of_two
    • DoubleEndedIterator для структуры ToLowercase
    • DoubleEndedIterator для структуры ToUppercase
    • TryFrom<&mut [T]> for [T; N]
    • UnwindSafe для структуры Once
    • RefUnwindSafe для Once
    • встроенные в компилятор функции поддержки armv8 neon для aarch64
  • Оны тұрақты мәндердің орнына кез келген контексте пайдалану мүмкіндігін анықтайтын "const" атрибуты функцияларда қолданылады:
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

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

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