lomia faasalalau fa'amalolo 1.45 o le gagana polokalame polokalame ele, na faavaeina e le poloketi Mozilla. O le gagana e taulaʻi i le saogalemu o manatuaga, e maua ai le faʻaogaina o mea e manatua ai, ma tuʻuina atu meafaigaluega mo le ausiaina maualuga o galuega tutusa e aunoa ma le faʻaogaina o le lapisi ma taʻaloga.
Ole pulega otometi ole manatua ole Rust e fa'ate'aina mea sese pe a fa'aogaina fa'ailoga ma puipuia mai fa'afitauli e tula'i mai i le fa'aogaina o mafaufauga maualalo, e pei o le ulufale atu i se vaega manatua pe a uma ona fa'asa'olotoina, fa'aletonu le fa'asinomaga, fa'alavelave fa'aletonu, ma isi. O lo'o fa'atupuina se pule o pusa e tufatufaina atu faletusi, fa'amautinoa le fa'apotopotoina ma pulea fa'alagolago e le poloketi. uta, e mafai ai ona e mauaina faletusi e manaʻomia mo le polokalame i le kiliki e tasi. E lagolagoina se fale teu oloa e talimalo ai faletusi crates.io.
Устранена давняя недоработка при выполнении преобразований между целыми числами и числами с плавающей запятой. Так как компилятор Rust использует LLVM в качестве бэкенда, операции преобразования типов выполнялись через инструкции промежуточного кода LLVM, такие как fptoui, в которых имеется одна существенная особенность — неопределённое поведение, если результирующее значение не умещается в целевой тип. Например, при преобразовании вещественного значения 300 с типом f32 в целый тип u8 результат непредсказуем и может отличаться на разных системах. Проблема в том, что подобная особенность проявляется в коде, не помеченном как «unsafe».
Начиная с Rust 1.45 поведение при переполнении размера типа жёстко регламентировано, а операция преобразования «as» выполняет проверку на переполнение и приводит преобразуемое значение к максимальному или минимальному значению целевого типа (для вышеотмеченного примера значение 300 будет преобразовано в 255). Для отключения подобных проверок предусмотрены дополнительные вызовы API «{f64, f32}::to_int_unchecked», работающие в режиме unsafe.
fn cast(x: f32) -> u8 {
x as u8
}
fn autu() {
let too_big = 300.0;
let too_small = -100.0;
let nan = f32::NAN;
let x: f32 = 1.0;
let y: u8 = unsafe { x.to_int_unchecked() };
println!(«too_big_casted = {}», cast(too_big)); // на выходе 255
println!(«too_small_casted = {}», cast(too_small)); // на выходе 0
println!(«not_a_number_casted = {}», cast(nan)); // на выходе 0
}
Стабилизировано использование процедурных макросов, похожих на функции, в выражениях, шаблонах и утверждениях. Ранее подобные макросы могли вызываться не везде, а только в определённых частях кода (отдельным вызовом, не переплетающимся с другим кодом). Расширение способов вызова макросов, похожих на функции, было одним из требовалось для обеспечения работы web-фреймворка roketa в стабильных выпусках Rust. Ранее для достижения дополнительной гибкости задания обработчиков в Rocket требовалось включение экспериментальной возможности «proc_macro_hygiene», недоступной в стабильных версиях Rust. Теперь указанная функциональность встроена в стабильные выпуски языка.
Разрешено использование диапазонов с типом «char» для перебора значений диапазона (ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):
for ch in ‘a’..=’z’ {
print!(«{}», ch);
}
println!(); // Будет выведено «abcdefghijklmnopqrstuvwxyz»
O se vaega fou o API ua tuʻuina atu i le vaega mautu, e aofia ai le faʻamautuina
Arc::as_ptr,
BTreeMap::remove_entry,
Rc::as_ptr,
rc::Weak::as_ptr,
rc::Weak::from_raw,
rc::Weak::into_raw,
str::strip_prefix,
str::strip_suffix,
sync::Weak::as_ptr,
sync::Weak::from_raw,
sync::Weak::into_raw,
char::UNICODE_VERSION,
Span::resolved_at,
Span::located_at,
Span::mixed_site,
unix::process::CommandExt::arg0.
В компилятор rustc добавлена поддержка переопределения различных возможностей целевой платформы при помощи флага «target-feature», например, «-C target-feature=+avx2,+fma». Также добавлены новые флаги:
«force-unwind-tables» для генерации «раскрученных» (unwind) таблиц вызовов, независимо от стратегии обработки краха; «embed-bitcode» для управления включением биткода LLVM в генерируемые rlibs. Флаг «embed-bitcode» по умолчанию задействован в Cargo для оптимизации времени сборки и потребления дискового пространства.
Обеспечен третий уровень поддержи для платформ mipsel-sony-psp и thumbv7a-uwp-windows-msvc. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования и публикации официальных сборок.
E le gata i lea, e mafai ona matauina le tala о создании простейшего apps на языке Rust, стартующего при помощи системного загрузчика и готового к самодостаточной загрузке вместо операционной системы.
Статья является первой в серии, посвящённой демонстрацией приёмов, востребованных при низкоуровневом программировании и разработке ОС.