Езикът за програмиране с общо предназначение Rust 1.63, основан от проекта Mozilla, но сега разработен под егидата на независимата организация с нестопанска цел Rust Foundation, беше пуснат. Езикът се фокусира върху безопасността на паметта и предоставя средствата за постигане на висок паралелизъм на работата, като същевременно се избягва използването на събирач на отпадъци и време за изпълнение (времето за изпълнение е намалено до основна инициализация и поддръжка на стандартната библиотека).
Методите за обработка на паметта на Rust спасяват разработчика от грешки при манипулиране на указатели и предпазват от проблеми, които възникват поради обработка на паметта на ниско ниво, като достъп до област на паметта, след като тя е била освободена, дерефериране на нулеви указатели, препълване на буфер и т.н. За разпространение на библиотеки, предоставяне на компилации и управление на зависимости, проектът разработва мениджъра на пакети Cargo. Хранилището crates.io се поддържа за хостване на библиотеки.
Безопасността на паметта е осигурена в Rust по време на компилиране чрез проверка на референции, проследяване на собствеността на обекта, проследяване на продължителността на живот на обекта (обхвати) и оценка на коректността на достъпа до паметта по време на изпълнение на кода. Rust също осигурява защита срещу целочислени препълвания, изисква променливите да бъдат инициализирани преди употреба, обработва грешките по-добре в стандартната библиотека, прилага концепцията за неизменни препратки и променливи по подразбиране и предлага силно статично въвеждане за минимизиране на логическите грешки.
Основни иновации:
- Добавен е std::thread::scope API, който ви позволява да създавате нишки с обхват. За разлика от наличните преди нишки, новият std::thread::scope API позволява предаването на заемане на нестатични данни, докато нишките, създадени с помощта на класическия std::thread::spawn API, трябваше да притежават всички предадени аргументи и не можеха да получат заети променливи. std::thread::scope API гарантира, че всички създадени нишки се прекратяват, преди данните да бъдат върнати, осигурявайки адекватна сигурност за механизма за заемане.
- Предложени са нови типове обвивки за файлови дескриптори - BorrowedFd и OwnedFd, които осигуряват заемане и собственост. Типовете са маркирани с "#[repr(transparent)]", което им позволява да бъдат използвани директно във външни C обвързвания по начин, съобразен със собствеността.
- Осигурена възможност за извикване на Condvar::new, Mutex::new и RwLock::new в контекста на константи за създаване на глобални статични стойности на Mutex, RwLock и Condvar без използване на пакети lazy_static.
- За функции като fn foo(стойност: T, f: impl Copy) е разрешен синтаксис като „foo::(32, 3)“, като изрично се посочва типът на генеричното.
- Преходът към използване на техниката NLL (Non-Lexical Lifetimes) за идентифициране на проблеми със заемане на променливи е завършен. NLL взема под внимание на ниво набор от указатели в графиката на потока на изпълнение, което прави възможно повишаването на качеството на проверката за заемане на променливи (проверка на заемане) и позволява изпълнението на някои типове правилен код, използването на което преди това е довело до грешка. Поддръжката за стария механизъм, който използваше доживотно обвързване на лексикално ниво, вече е напълно премахната от rustc и използването на новия NLL е внедрено навсякъде.
- Нова част от API е преместена в категорията на стабилни, включително методите и имплементациите на характеристиките са стабилизирани:
- масив::от_fn
- Box::into_pin
- BinaryHeap::try_reserve
- BinaryHeap::try_reserve_exact
- OsString::try_reserve
- OsString::try_reserve_exact
- PathBuf::try_reserve
- PathBuf::try_reserve_exact
- Път::try_exists
- Ref::filter_map
- RefMut::filter_map
- NonNull::::len
- ToOwned::clone_into
- Ipv6Addr::to_ipv4_mapped
- unix::io::AsFd
- unix::io::BorrowedFd
- unix::io::OwnedFd
- windows::io::AsHandle
- windows::io::BorrowedHandle
Източник: opennet.ru
