Op de dag van de viering van het tienjarig bestaan van de programmeertaal Rust 1.0 (het Rust-project werd opgericht in 2006, versie 0.1 werd in 2012 gelanceerd, en de eerste stabiele versie werd in 2015 aangeboden) is de release van Rust 1.87 gepubliceerd. De taal richt zich op veilig geheugenbeheer en biedt mogelijkheden voor het bereiken van hoge parallelle uitvoering van taken, terwijl het zonder garbage collection en runtime werkt (runtime bestaat uit basisinitialisatie en ondersteuning van de standaardbibliotheek).
Geheugenmethoden in Rust helpen ontwikkelaars om fouten bij het manipuleren van pointers te voorkomen en beschermen tegen problemen die voortkomen uit laag-niveau geheugenwerk, zoals toegang tot geheugen na vrijgave, derefereren van null pointers, buffer overflows, enz. Voor het verspreiden van bibliotheken, het garanderen van builds en het beheren van projectafhankelijkheden is er een pakketbeheerder genaamd Cargo ontwikkeld. Voor het plaatsen van bibliotheken wordt de repository crates.io ondersteund.
Veilige geheugenwerking in Rust wordt tijdens de compilatie gegarandeerd door middel van referentiecontrole, het bijhouden van eigenaarschap van objecten, het in acht nemen van de levensduur van objecten (scope) en het evalueren van toegangsrechten tot geheugen tijdens de uitvoering van code. Rust biedt ook middelen om integer-overflows te voorkomen, vereist dat waarden van variabelen voor gebruik worden geïnitialiseerd, behandelt fouten beter in de standaardbibliotheek, past het concept van onveranderlijke (immutable) referenties en variabelen als standaard toe en biedt sterke statische type-onderzoek voor het minimaliseren van logische fouten.
Belangrijkste vernieuwingen:
- De standaardbibliotheek heeft ondersteuning voor niet-genaamde kanalen (anonymous pipe) toegevoegd. Voor het creëren van niet-genaamde kanalen is de methode std::io::pipe() voorgesteld, die in combinatie met std::process::Command kan worden gebruikt voor het verwerken van standaard in- en uitstromen, evenals voor het combineren van stdout- en stderr-stromen. use std::process::Command; use std::io::Read; let (mut recv, send) = std::io::pipe()?; let mut command = Command::new("path/to/bin") // combineren van stdout en stderr in één kanaal .stdout(send.try_clone()?) .stderr(send) .spawn()?; let mut output = Vec::new(); recv.read_to_end(&mut output)?; assert!(command.wait()?.success());
- Het aanroepen vanuit veilige code van de meeste ingebouwde functies (Intrinsics) van de compiler std::arch is toegestaan. De wijziging is van toepassing op de ingebouwde functies std::arch, die als unsafe zijn gemarkeerd alleen vanwege de binding aan bepaalde functionaliteit, als deze functionaliteit is ingeschakeld. Bijvoorbeeld, _mm256_add_epi32 kan vanuit veilige code worden aangeroepen als in de applicatie '#[target_feature(enable = "avx2")]' wordt gebruikt.
- Vanuit de blokken "asm!" met assemblercode zijn overgangen naar blokken met code in de programmeertaal Rust toegestaan, wat de ontwikkeling van low-level code vereenvoudigt, zoals het implementeren van optimalisaties in de kernel of het organiseren van interactie met hardware. Het overgangspunt voor de assembleropdracht "jmp" wordt gedefinieerd in de "asm!"-macro met behulp van de nieuwe operand "label", die een blokexpressie met Rust-code bevat. unsafe { asm!( "jmp {}", label { println!("From asm!"); } ); }
- Het is toegestaan om nauwkeurig de gevangen generieke types en levensduur te specificeren in type-definities met behulp van de teruggegeven types impl Trait. trait Foo { fn method(&'a self) -> impl Sized; type Implicit1: Sized; fn method_desugared(&'a self) -> Self::Implicit1; fn precise(&'a self) -> impl Sized + use; type Implicit2: Sized; fn precise_desugared(&'a self) -> Self::Implicit2; }
- Een nieuwe lading API's is gestabiliseerd, inclusief gestabiliseerde methoden en implementaties van traits:
- Vec::extract_if
- vec::ExtractIf
- LinkedList::extract_if
- linked_list::ExtractIf
- ::split_off
- ::split_off_mut
- ::split_off_first
- ::split_off_first_mut
- ::split_off_last
- ::split_off_last_mut
- String::extend_from_within
- os_str::Display
- OsString::display
- OsStr::display
- io::pipe
- io::PipeReader
- io::PipeWriter
- impl From for OwnedHandle
- impl From for OwnedHandle
- impl From for Stdio
- impl From for Stdio
- impl From for OwnedFd
- impl From for OwnedFd
- Box<MaybeUninit>::write
- impl TryFrom<Vec> for String
- ::offset_from_unsigned
- ::byte_offset_from_unsigned
- ::offset_from_unsigned
- ::byte_offset_from_unsigned
- NonNull::offset_from_unsigned
- NonNull::byte_offset_from_unsigned
- ::cast_signed
- NonZero::::cast_signed.
- ::cast_unsigned.
- NonZero::::cast_unsigned.
- ::is_multiple_of
- ::unbounded_shl
- ::unbounded_shr
- ::unbounded_shl
- ::unbounded_shr
- ::midpoint
- ::from_utf8
- ::from_utf8_mut
- ::from_utf8_unchecked
- ::from_utf8_unchecked_mut
- De eigenschap "const" is toegepast in de functies:
- core::str::from_utf8_mut
- ::copy_from_slice
- SocketAddr::set_ip
- SocketAddr::set_port,
- SocketAddrV4::set_ip
- SocketAddrV4::set_port,
- SocketAddrV6::set_ip
- SocketAddrV6::set_port
- SocketAddrV6::set_flowinfo
- SocketAddrV6::set_scope_id
- char::is_digit
- char::is_whitespace
- <N::as_flattened
- <N::as_flattened_mut
- String::into_bytes
- String::as_str
- String::capacity
- String::as_bytes
- String::len
- String::is_empty
- String::as_mut_str
- String::as_mut_vec
- Vec::as_ptr
- Vec::as_slice
- Vec::capacity
- Vec::len
- Vec::is_empty
- Vec::as_mut_slice
- Vec::as_mut_ptr
- De tweede ondersteuningslaag voor het doelsysteem i586-pc-windows-msvc is verwijderd. Het wordt aangeraden om het systeem i686-pc-windows-msvc te gebruiken, dat ondersteuning biedt voor SSE2-instructies. Het systeem i586-pc-windows-msvc is zinloos geworden, omdat Windows 10 SSE2-ondersteuning vereist en eerdere versies van Windows in Rust niet meer worden ondersteund.
Bron: opennet.ru
