Випуск 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 вважається неприємним між 's' і '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 також надає засоби для захисту від цілих переповнень, вимагає обов'язкової ініціалізації значень змінних перед використанням, краще обробляє помилки в стандартній бібліотеці, застосовує концепцію незмінності посилань і змінних за умовчанням, пропонує сильну статичну типізацію для мінімізації логічних помилок.

Джерело: opennet.ru

Додати коментар або відгук