zveřejněno vydání 1.45 systémového programovacího jazyka Rezzaložil projekt Mozilla. Jazyk se zaměřuje na bezpečnou správu paměti, poskytuje automatickou správu paměti a poskytuje prostředky k dosažení vysokého paralelismu úloh a zároveň se vyhýbá použití garbage collectoru a runtime.
Automatická správa paměti Rust šetří vývojáře před chybami při manipulaci s ukazateli a chrání před problémy, které vznikají v důsledku nízkoúrovňové manipulace s pamětí, jako je přístup k oblasti paměti po jejím uvolnění, dereferencování nulových ukazatelů, přetečení vyrovnávací paměti atd. Pro distribuci knihoven, zajištění sestavení a správu závislostí projekt vyvíjí správce balíčků Náklad, což vám umožní získat knihovny, které potřebujete pro program, jedním kliknutím. Hostitelské knihovny podporují úložiště crates.io.
Vyřazeno dlouhodobě vada při provádění převodů mezi celými čísly a čísly s plovoucí desetinnou čárkou. Vzhledem k tomu, že kompilátor Rust používá LLVM jako backend, operace převodu typu byly prováděny prostřednictvím instrukcí středního kódu LLVM, jako je např. fptoui, které mají jednu významnou vlastnost - nedefinované chování, pokud výsledná hodnota nezapadá do cílového typu. Například při převodu plovoucí hodnoty 300 s typem f32 na celé číslo typu u8 je výsledek nepředvídatelný a může se lišit v různých systémech. Problém je v tom, že tato funkce se objevuje v kódu, který není označen jako „nebezpečný“.
Od verze Rust 1.45 je chování přetečení velikosti typu přísně regulováno a operace převodu „jako“ kontroluje přetečení a nutí převáděnou hodnotu na maximální nebo minimální hodnotu cílového typu (pro příklad výše hodnotu 300 by bylo převedeno na 255). Chcete-li takové kontroly zakázat, jsou k dispozici další volání API „{f64, f32}::to_int_unchecked“, která fungují v nebezpečném režimu.
fn cast(x: f32) -> u8 {
x jako u8
}
fn main() {
let too_big = 300.0;
let too_small = -100.0;
nechť nan = f32::NAN;
println!("too_big_casted = {}", cast(too_big)); // výstup 255
println!("too_small_casted = {}", cast(too_small)); // výstup 0
println!("not_a_number_casted = {}", cast(nan)); // výstup 0
}
Použijte stabilizovaný procedurální makrafunkční výrazy, šablony a příkazy. Dříve se taková makra nedala volat všude, ale jen v určitých částech kódu (jako samostatné volání, nepropletené s jiným kódem). Rozšíření způsobu volání maker, podobně jako u funkcí, bylo jedním z požadavků, aby webový framework fungoval Raketa ve stabilních vydáních Rust. Dříve bylo dosažení další flexibility při definování ovladačů v Rocketu vyžadováno povolením experimentální funkce nazvané „proc_macro_hygiene“, která není dostupná ve stabilních verzích Rust. Tato funkce je nyní zabudována do stabilních verzí jazyka.
Je povoleno používat rozsahy s typem „char“ k iteraci hodnot rozsahu (ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):
pro ch v 'a'..='z' {
print!("{}", ch);
}
println!(); // Vytiskne "abcdefghijklmnopqrstuvwxyz"
Nová část API byla převedena do kategorie stabilních, včetně stabilizovaných
Arc::as_ptr,
BTreeMap::remove_entry,
Rc::as_ptr,
rc::Slabý::as_ptr,
rc::Slabý::from_raw,
rc::Slabý::into_raw,
str::prefix_stripu,
str::přípona_stripu,
sync::Weak::as_ptr,
synchronizace::Slabá::from_raw,
sync::Weak::into_raw,
znak::UNICODE_VERSION,
Span::resolved_at,
Span::location_at,
Span::mixed_site,
unix::process::CommandExt::arg0.
Kompilátor rustc přidal podporu pro přepsání různých funkcí cílové platformy pomocí příznaku "target-feature", například "-C target-feature=+avx2,+fma". Byly také přidány nové vlajky:
"force-unwind-tables" pro generování unwind call tabulek, bez ohledu na strategii řešení havárií; "embed-bitcode" pro kontrolu, zda je bitkód LLVM zahrnut do generovaných rlibs. Příznak „embed-bitcode“ je v Cargo standardně povolen, aby se optimalizovala doba sestavení a spotřeba místa na disku.
Třetí úroveň podpory byla poskytnuta pro platformy mipsel-sony-psp a thumbv7a-uwp-windows-msvc. Třetí úroveň zahrnuje základní podporu, ale bez automatického testování a publikování oficiálních sestavení.
Navíc lze poznamenat příběh o vytvoření toho nejjednoduššího aplikace v jazyce Rust, počínaje používáním zavaděče systému a připraveného k samostatnému načítání namísto operačního systému.
Článek je prvním ze série věnované demonstraci technik, které jsou žádané v nízkoúrovňovém programování a vývoji OS.