Издание 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<usize>, Bound<usize>)
    • 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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster