Rust 1.53 a fost lansat. Google va finanța adăugarea suportului Rust la kernel-ul Linux

A fost publicată lansarea limbajului de programare Rust 1.53, fondat de proiectul Mozilla, dar dezvoltat acum sub auspiciile organizației independente non-profit Rust Foundation. Limbajul se concentrează pe siguranța memoriei, asigură gestionarea automată a memoriei și oferă mijloacele pentru a realiza paralelismul ridicat al sarcinilor fără a utiliza un colector de gunoi sau un timp de rulare (timpul de rulare este redus la inițializarea de bază și întreținerea bibliotecii standard).

Gestionarea automată a memoriei de la Rust elimină erorile la manipularea pointerilor și protejează împotriva problemelor care decurg din manipularea memoriei de nivel scăzut, cum ar fi accesarea unei regiuni de memorie după ce aceasta a fost eliberată, dereferențele pointerului nul, depășirile de buffer etc. Pentru a distribui biblioteci, a asigura asamblarea și a gestiona dependențele, proiectul dezvoltă managerul de pachete Cargo. Depozitul crates.io este acceptat pentru găzduirea bibliotecilor.

Principalele inovații:

  • Для массивов реализован типаж 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’
  • O nouă parte a API-urilor a fost transferată în categoria stabilă, inclusiv următoarele stabilizate:
    • 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
    • Durata::saturating_add
    • Durata::saturating_sub
    • Durata::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<usize>, Bound<usize>)
    • Vec::extend_from_within
  • Реализован третий уровень поддержки для платформы wasm64-unknown-unknown. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.
  • Пакетный менеджер Cargo по умолчанию переведён на использование имени «main» для основной ветки Git-репозитория (HEAD). Для зависимостей, размещённых в репозиториях, использующих имя main вместо master, больше не требуется указывать в настройках branch = «main».
  • În compilator, cerințele pentru versiunea minimă a LLVM sunt ridicate la 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 для разработки компонентов ядра, таких как драйверы устройств, позволит снизить риск появления уязвимостей, вызванных небезопасной работой с памятью, и исключить появление таких ошибок, как обращением к области памяти после её освобождения и выход за границы буфера.

Siguranța memoriei este asigurată în Rust în timpul compilării prin verificarea referințelor, urmărirea proprietății obiectului și a duratei de viață a obiectului (sfera de aplicare), precum și prin evaluarea corectitudinii accesului la memorie în timpul execuției codului. Rust oferă, de asemenea, protecție împotriva depășirilor de numere întregi, necesită inițializarea obligatorie a valorilor variabilelor înainte de utilizare, gestionează mai bine erorile în biblioteca standard, aplică implicit conceptul de referințe imuabile și variabile, oferă tastare statică puternică pentru a minimiza erorile logice.

Sursa: opennet.ru

Adauga un comentariu