Выпуск Rust 1.53. Google прафінансуе даданне падтрымкі Rust у ядро ​​Linux

Апублікаваны рэліз мовы сістэмнага праграмавання Rust 1.53, заснаванага праектам Mozilla, але цяпер які развіваецца пад заступніцтвам незалежнай некамерцыйнай арганізацыі Rust Foundation. Мова сфакусаваная на бяспечнай працы з памяццю, забяспечвае аўтаматычнае кіраванне памяццю і дае сродкі для дасягнення высокага паралелізму выканання заданняў, пры гэтым абыходзячыся без выкарыстання зборшчыка смецця і runtime (runtime зводзіцца да базавай ініцыялізацыі і суправаджэнню стандартнай бібліятэкі).

Аўтаматычнае кіраванне памяццю ў Rust пазбаўляе распрацоўніка ад памылак пры маніпуляванні паказальнікамі і абараняе ад праблем, якія ўзнікаюць з-за нізкаўзроўневай працы з памяццю, такіх як зварот да вобласці памяці пасля яе вызвалення, разнайменаванне нулявых паказальнікаў, вынахад за межы буфера і да т.п. Для распаўсюджвання бібліятэк, забеспячэнні зборкі і кіраванні залежнасцямі праектам развіваецца пакетны мэнэджар Cargo. Для размяшчэння бібліятэк падтрымліваецца рэпазітар crates.io.

Асноўныя навіны:

  • Для масіваў рэалізаваны тыпаж IntoIterator, які дазваляе арганізаваць перабор элементаў масіва па значэннях: for i in [1, 2, 3] {..}

    Таксама з'явілася магчымасць перадачы масіваў у метады, якія прымаюць ітэратары, напрыклад: let set = BTreeSet::from_iter([1, 2, 3]); for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) { .. }

    Раней IntoIterator быў рэалізаваны толькі для спасылак на масівы, г.зн. для перабору па значэннях патрабавалася выкарыстанне спасылак («&[1, 2, 3]») або «[1, 2, 3].iter()». Рэалізацыі IntoIterator для масіваў заміналі праблемы з сумяшчальнасцю, выкліканыя раней дададзеным у кампілятар пераўтварэннем метаду array.into_iter() у (&array).into_iter(). Паказаныя праблемы атрымалася вырашыць абыходным шляхам - кампілятар працягне пераўтварэнне array.into_iter() у (&array).into_iter(), як калі б адсутнічала рэалізацыя тыпажу IntoIterator, але толькі пры выкліку метаду з выкарыстаннем сінтаксісу ".into_iter()" і не дакранаючыся выклік у форме "in [1, 2, 3]", "iter.zip([1, 2, 3])", "IntoIterator::into_iter([1, 2, 3])".

  • Дана магчымасць указання выразаў «|» (лагічная аперацыя OR) у любой частцы шаблону, напрыклад, замест «Some(1) | Some(2)» цяпер можна пісаць «Some(1 | 2)»: match result { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) = > { .. } _ => { .. } }
  • Дазволена выкарыстанне не-ASCII сімвалаў у ідэнтыфікатарах, у тым ліку любых нацыянальных сімвалаў, вызначаных у спецыфікацыі Unicode UAX 31, але акрамя сімвалаў emoji. Пры выкарыстанні розных, але падобных па напісанні знакаў, кампілятар выведзе папярэджанне. const BLÅHAJ: &str = "🦈"; struct 人 { 名字: String, } let α = 1; let sos = 2; warning: identifier pair considered confusable between 's' and 's'
  • У разрад стабільных пераведзена новая порцыя API, у тым ліку стабілізаваны:
    • array::from_ref
    • array::from_mut
    • AtomicBool::fetch_update
    • AtomicPtr::fetch_update
    • BTreeSet::retain
    • BTreeMap::retain
    • BufReader::seek_relative
    • cmp::min_by
    • cmp::min_by_key
    • cmp::max_by
    • cmp::max_by_key
    • DebugStruct::finish_non_exhaustive
    • Duration::ZERO
    • Duration::MAX
    • Duration::is_zero
    • Duration::saturating_add
    • Duration::saturating_sub
    • Duration::saturating_mul
    • f32::is_subnormal
    • f64::is_subnormal
    • IntoIterator для масіваў
    • {integer}::BITS
    • io::Error::Unsupported
    • NonZero*::leading_zeros
    • NonZero*::trailing_zeros
    • Option::insert
    • Ordering::is_eq
    • Ordering::is_ne
    • Ordering::is_lt
    • Ordering::is_gt
    • Ordering::is_le
    • Ordering::is_ge
    • OsStr::make_ascii_lowercase
    • OsStr::make_ascii_uppercase
    • OsStr::to_ascii_lowercase
    • 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
    • AsRef<[T]> для slice::IterMut
    • impl SliceIndex для (Bound , Bound )
    • Vec::extend_from_within
  • Рэалізаваны трэці ўзровень падтрымкі для платформы wasm64-unknown-unknown. Трэці ўзровень мае на ўвазе базавую падтрымку, але без аўтаматызаванага тэсціравання, публікацыі афіцыйных зборак і праверкі магчымасці зборкі кода.
  • Пакетны мэнэджар Cargo па змаўчанні перакладзены на выкарыстанне імя "main" для асноўнай галіны Git-рэпазітара (HEAD). Для залежнасцяў, змешчаных у рэпазітарах, выкарыстоўвалых імя main замест master, больш не патрабуецца паказваць у наладах branch = «main».
  • У кампілятары патрабаванні да мінімальнай версіі LLVM падняты да LLVM 10.

Дадаткова можна адзначыць прадастаўленне фінансавання працы па развіцці інтэграцыі ў ядро ​​Linux сродкаў для распрацоўкі кампанентаў на мове Rust. Праца будзе весціся ў рамках праекту Prossimo пад эгідай арганізацыі ISRG (Internet Security Research Group), якая з'яўляецца заснавальнікам праекту Let's Encrypt і спрыяе пасоўванню HTTPS і развіццю тэхналогій для падвышэння абароненасці інтэрнэту. Сродкі будуць прадстаўлены кампаніяй Google, якая аплаціць працу Мігеля Охеда (Miguel Ojeda), аўтара праекту Rust-for-Linux. Раней ISRG і Google ужо прафінансавалі стварэнне альтэрнатыўнага HTTP-бэкенда для ўтыліты curl і распрацоўку новага TLS-модуля для http-сервера Apache.

Па дадзеных кампаній Microsoft і Google каля 70% уразлівасцяў выкліканыя небяспечнай працай з памяццю. Мяркуецца, што выкарыстанне мовы Rust для распрацоўкі кампанентаў ядра, такіх як драйверы прылад, дазволіць зменшыць рызыку з'яўлення ўразлівасцяў, выкліканых небяспечнай працай з памяццю, і выключыць з'яўленне такіх памылак, як зваротам да вобласці памяці пасля яе вызвалення і вынахад за межы буфера.

Бяспечная праца з памяццю забяспечваецца ў Rust падчас кампіляцыі праз праверку спасылак, адсочванне валодання аб'ектамі і ўлік часу жыцця аб'ектаў (вобласці бачнасці), а таксама праз адзнаку карэктнасці доступу да памяці падчас выканання кода. Rust таксама дае сродкі для абароны ад цэлалікіх перапаўненняў, патрабуе абавязковай ініцыялізацыі значэнняў зменных перад выкарыстаннем, лепш апрацоўвае памылкі ў стандартнай бібліятэцы, ужывае канцэпцыю нязменнасці (immutable) спасылак і зменных па змаўчанні, прапануе моцную статычную тыпізацыю для мінімізацыі лагічных памылак.

Крыніца: opennet.ru

Дадаць каментар