Објавено е објавувањето на програмскиот јазик за општа намена Rust 1.59, основан од проектот Mozilla, но сега развиен под покровителство на независната непрофитна организација Rust Foundation. Јазикот се фокусира на безбедноста на меморијата и обезбедува средства за постигнување на висок паралелизам на работните места, притоа избегнувајќи употреба на собирач на ѓубре и време на работа (времето на работа е сведено на основна иницијализација и одржување на стандардната библиотека).
Методите за ракување со меморијата на Rust го спасуваат развивачот од грешки при манипулирање со покажувачите и го штитат од проблеми што се јавуваат поради ракување со меморијата на ниско ниво, како што се пристап до мемориската област откако ќе се ослободи, дереференцирање на нула покажувачи, пречекорувања на баферот итн. За да се дистрибуираат библиотеки, да се обезбедат градби и да управуваат со зависности, проектот го развива менаџерот на пакети Cargo. Репозиториумот crates.io е поддржан за хостирање библиотеки.
Безбедноста на меморијата е обезбедена во Rust за време на компајлирањето преку проверка на референци, следење на сопственоста на објектот, следење на животниот век на објектите (обеми) и проценка на исправноста на пристапот до меморијата за време на извршувањето на кодот. Rust исто така обезбедува заштита од прелевање на цели броеви, бара задолжителна иницијализација на вредностите на променливите пред употреба, подобро се справува со грешките во стандардната библиотека, стандардно го применува концептот на непроменливи референци и променливи, нуди силно статичко пишување за да се минимизираат логичките грешки.
Главните иновации:
- Можно е да се користат инсерти на асемблерски јазик, кои се барани во апликации кои треба да го контролираат извршувањето на ниско ниво или да можат да користат специјализирани машински инструкции. Склопните инсерти се додаваат со помош на макроа "asm!" и "global_asm!" користење на синтакса за форматирање низа за именување на регистри слична на онаа што се користи за замена на низи во Rust. Компајлерот поддржува инструкции за склопување за архитектурите x86, x86-64, ARM, AArch64 и RISC-V. Пример за вметнување: користете std::arch::asm; // Множете го x со 6 користејќи поместувања и додавања нека mut x: u64 = 4; небезбеден { asm!( „mov {tmp}, {x}“, „shl {tmp}, 1“, „shl {x}, 2“, „add {x}, {tmp}“, x = inout(reg ) x, tmp = надвор(рег) _, ); } assert_eq!(x, 4 * 6);
- Додадена е поддршка за деструктурирани (паралелни) задачи, во кои неколку особини, парчиња или структури се наведени на левата страна на изразот. На пример: нека (a, b, c, d, e); (а, б) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Структура { e, .. } = Структура { e: 5, f: 3 }; тврдам_еднакво!([1, 2, 1, 4, 5], [a, b, c, d, e]);
- Обезбедена е способноста да се специфицираат стандардните вредности за генерика за const: struct ArrayStorage { arr: [T; N], } импл ArrayStorage { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
- Менаџерот на пакети Cargo обезбедува предупредувања за употребата на неважечки структури во зависности кои се обработуваат поради грешки во компајлерот (на пример, поради грешка, полињата со спакувани структури беа дозволени да се позајмат во безбедни блокови). Таквите конструкции повеќе нема да бидат поддржани во идната верзија на Rust.
- Cargo и rustc имаат вградена способност да генерираат извршни датотеки лишени од податоци за отстранување грешки (лента = „инфо за дебагирање“) и симболи (лента = „симболи“), без потреба од повикување посебна алатка. Поставката за чистење се спроведува преку параметарот „strip“ во Cargo.toml: [profile.release] strip = „debuginfo“, „symbols“
- Инкременталната компилација е стандардно оневозможена. Причината се вели дека е привремено решение за грешка во компајлерот што доведува до падови и грешки во десериализацијата. Поправка на грешки е веќе подготвена и ќе биде вклучена во следното издание. За да ја вратите инкременталната компилација, можете да ја користите променливата на околината RUSTC_FORCE_INCREMENTAL=1.
- Нов дел од API е преместен во категоријата стабилни, вклучувајќи ги и методите и имплементацијата на карактеристиките се стабилизирани:
- std::thread::available_parallelism
- Резултат::копиран
- Резултат::клониран
- арх::асм!
- arch::global_asm!
- ops::ControlFlow::is_break
- ops::ControlFlow::is_continue
- TryFrom за u8
- char::TryFromCharError (клонирање, отстранување грешки, приказ, PartialEq, Копирај, Eq, Грешка)
- iter::zip
- NonZeroU8::is_power_of_two
- NonZeroU16::is_power_of_two
- NonZeroU32::is_power_of_two
- NonZeroU64::is_power_of_two
- NonZeroU128::is_power_of_two
- DoubleEndedIterator за структура Towercase
- DoubleEndedIterator за структура со големи букви
- TryFrom<&mut [T]> за [T; N]
- Структурата UnwindSafe for Once
- RefUnwindSafe еднаш
- Функциите за поддршка на неонски armv8 вградени во компајлерот за aarch64
- Атрибутот „const“, кој ја одредува можноста да се користи во кој било контекст наместо константи, се користи во функции:
- mem::MaybeUninit::as_ptr
- mem:: МожебиUninit::assume_init
- mem::МожебиЕдиница::assume_init_ref
- ffi::CStr::from_bytes_with_nul_нештиклирано
Извор: opennet.ru
