Публикуван е релизът на езика за програмиране с общо назначение Rust 1.78, разработван първоначално от Mozilla, но в момента се развива под егидата на независимата непрофитна организация Rust Foundation. Язикът е фокусиран върху безопасното управление на паметта и предоставя средства за постигане на висока паралелност на изпълнението на задачите, без да използва събирател на боклук и runtime (runtime се свежда до основна инициализация и поддръжка на стандартната библиотека).
Методите за работа с паметта в Rust освобождават разработчиците от грешки при манипулиране на указатели и ги защитават от проблеми, произлизащи от ниско ниво работа с паметта, като достъп до освободена памет, разыменоване на нулеви указатели, излизане извън границите на буфера и др. За разпространение на библиотеки, осигуряване на компилация и управление на зависимостите проектът продължава да развива пакетния мениджър Cargo. Поддържа се хранилище за библиотеки на crates.io.
Безопасната работа с паметта в Rust се осигурява по време на компилацията чрез проверка на референтите, проследяване на притежанието на обекти, вземане под внимание на времето на живот на обектите (област на видимост) и оценка на коректността на достъпа до паметта по време на изпълнението на кода. Rust също така предоставя средства за защита срещу препълване на цели числа, изисква задължителна инициализация на стойностите на променливите преди тяхната употреба, по-добре обработва грешките в стандартната библиотека, прилага концепцията за неизменяемост (immutable) на референтите и променливите по подразбиране и предлага силна статична типизация за минимизиране на логическите грешки.
Основни нововъведения:
- Предложено е ново пространство за имена на атрибути „#[diagnostic]“, предоставящо средства за влияние върху съобщенията за грешки, генерирани от компилатора. Първият в новото пространство е реализиран атрибут „#[diagnostic::on_unimplemented]“, който може да се използва за настройка на съобщения за грешки, издадени в ситуации, когато е необходим типаж, който не е реализиран за типа. #[diagnostic::on_unimplemented( message = „My Message for `ImportantTrait<{A}>` не е реализиран за `{Self}`“, label = „My Label“, note = „Note 1“, note = „Note 2“ )] trait ImportantTrait<A> {} fn use_my_trait(_: impl ImportantTrait<i32>) {} fn main() { use_my_trait(String::new()); } error[E0277]: My Message for `ImportantTrait<i32>` не е реализиран за `String` —> src/main.rs:12:18 | 12 | use_my_trait(String::new()); | ———— ^^^^^^^^^^^^^ My Label | | | изисквано от ограничение, въведено от този повик | = help: типажът `ImportantTrait<i32>` не е реализиран за `String` = note: Note 1 = note: Note 2
- Предварителните assert проверки, приложими към unsafe функции, сега могат да бъдат отложени до етапа на генериране на код, което позволява извършването на тези проверки без необходимост от компилация на стандартната библиотека в режим „#[cfg(debug_assertions)]“. За задействането на проверките сега е достатъчно включването на отладъчни assert-ове за тестови или отладъчни компилации на собствения код.
- Поведението на функциите в стандартната библиотека, което влияе на подравняването на указатели и срезове (slice), вече е предсказуемо по време на изпълнение и зависи от входните данни. Функцията pointer::align_offset, която изчислява отместването за подравняване на указателя, сега връща usize::MAX само когато операцията не може да бъде извършена. Функциите slice::align_to и slice::align_to_mut, които преобразуват срезове в представяне с подравнен среден срез и оригинални начални и крайни срези, вече винаги връщат най-голямата средна част.
- В категорията стабилни бяха преведени:
- impl Read for &Stdin
- Разрешено е използването на нестатично (не ‘static) време на живот за някои реализации, свързани с std::error::Error.
- В реализацията impl е разрешено използването на значение ?Sized.
- impl From for io::Error
- Функцията Barrier::new() е стабилизирана за използване с модификатора „const“ в контексти вместо константи.
- За целевите платформи x86_64-pc-windows-msvc, i686-pc-windows-msvc, x86_64-pc-windows-gnu, i686-pc-windows-gnu, x86_64-pc-windows-gnullvm и i686-pc-windows-gnullvm сега се изисква минимум версия Windows 10.
- Реализиран е трети ниво на поддръжка за платформите wasm32-wasip2, arm64ec-pc-windows-msvc, armv8r-none-eabihf и loongarch64-unknown-linux-musl. Третото ниво предполага основна поддръжка, но без автоматизирано тестване, публикуване на официални сборки и проверка на възможността за компилация на кода.
- Реализирано е второ ниво на поддръжка за целевата платформа Add wasm32-wasip1. Второто ниво на поддръжка предполага гаранция за компилация.
- Платформата wasm32-wasi-preview1-threads е преименувана на wasm32-wasip1-threads.
- Компилаторът е преместен на използване на LLVM 18. При използване на LLVM 18 за архитектурите x86-32 и x86-64 е променен ABI, свързан с типовете u128 и i128.
- В пакетния мениджър Cargo е стабилизирана четвърта версия на файловете за блокиране (lockfile v4).
- В Cargo е стабилизиран глобалният кеш с информация за последното използване на данните. Кешът се намира в файл $CARGO_HOME/.global-cache с помощта на SQLite, автоматично се актуализира и отразява последните промени, свързани с индекса, crate файла, каталога с кода, git clone и git checkout.
Допълнително може да се отбележи езикът за програмиране Borgo, който се опитва да бъде по-изразителен от езика Go, но по-малко сложен от езика Rust. Borgo комбинира най-добрите черти на Go и Rust, запълвайки недостатъците на всеки от езиците. Например, езикът Go е прост и разбираем, но не предоставя разширени средства за осигуряване на безопасност при работа с типове. Езикът Rust предоставя средства за безопасно програмиране, но е прекалено сложен. Проектът се развива от Марко Сампелегрини, автор на книгата „The Simple Haskell Handbook“ и разработчик на системата за непрекъсната интеграция Quad CI.

В Borgo се използва статична типизация, аналогични на езика Go типове и синтаксис, подобен на Rust. Указването на точки с запетая в края на редовете в кода на Borgo не е задължително. Кодът на езика Borgo се компилира в представяне на езика Go, което е напълно съвместимо с съществуващите пакети за езика Go. Кодът на компилатора е написан на езика Rust и се разпространява под лицензия ISC. use fmt enum NetworkState { Loading, Failed(int), Success(T), } struct Response { title: string, duration: int, } fn main() { let res = Response { title: "Hello world", duration: 0, } let state = NetworkState.Success(res) let msg = match state { NetworkState.Loading => "still loading", NetworkState.Failed(code) => fmt.Sprintf("Got error code: %d", code), NetworkState.Success(res) => res.title, } fmt.Println(msg) }
Източник: opennet.ru
