Zur Feier des zehnten Jahrestages der Programmiersprache Rust 1.0 (das Rust-Projekt wurde 2006 gegründet, die Version 0.1 wurde 2012 erstellt und die erste stabile Version wurde 2015 vorgeschlagen) wurde Rust 1.87 veröffentlicht. Die Sprache konzentriert sich auf Speichersicherheit und bietet Mittel zur Erzielung einer hohen Parallelität bei der Aufgabenausführung, wobei auf die Verwendung eines Garbage Collectors und einer Laufzeit verzichtet wird (die Laufzeit wird auf die grundlegende Initialisierung und Wartung der Standardbibliothek reduziert).
Die Speicherverarbeitungsmethoden von Rust bewahren den Entwickler vor Fehlern bei der Manipulation von Zeigern und schützen vor Problemen, die durch die Speicherverarbeitung auf niedriger Ebene entstehen, wie z. B. Zugriff auf einen Speicherbereich, nachdem dieser freigegeben wurde, Dereferenzierung von Nullzeigern, Pufferüberläufe usw. Um Bibliotheken zu verteilen, Builds bereitzustellen und Abhängigkeiten zu verwalten, entwickelt das Projekt den Cargo-Paketmanager. Das crates.io-Repository wird zum Hosten von Bibliotheken unterstützt.
Die Speichersicherheit wird in Rust zur Kompilierungszeit durch Referenzprüfung, Verfolgung des Objektbesitzes, Verfolgung der Objektlebensdauer (Umfänge) und Beurteilung der Korrektheit des Speicherzugriffs während der Codeausführung gewährleistet. Rust bietet außerdem Schutz vor Ganzzahlüberläufen, erfordert eine obligatorische Initialisierung von Variablenwerten vor der Verwendung, behandelt Fehler in der Standardbibliothek besser, wendet standardmäßig das Konzept unveränderlicher Referenzen und Variablen an und bietet starke statische Typisierung, um logische Fehler zu minimieren.
Wichtigste Neuerungen:
- Der Standardbibliothek wurde Unterstützung für anonyme Pipes hinzugefügt. Die Methode std::io::pipe() dient zum Erstellen unbenannter Pipes, die in Kombination mit std::process::Command zum Verarbeiten von Standardeingabe- und -ausgabeströmen und zum Kombinieren von stdout- und stderr-Streams verwendet werden können. verwenden Sie std::process::Command; verwenden Sie std::io::Read; let (mut recv, send) = std::io::pipe()?; let mut command = Command::new("path/to/bin") // stdout und stderr in einem Kanal kombinieren .stdout(send.try_clone()?) .stderr(send) .spawn()?; let mut output = Vec::new(); recv.read_to_end(&mut Ausgabe)?; behaupten!(Befehl.warten()?.erfolg());
- Das Aufrufen der meisten integrierten Funktionen (Intrinsics) des Compilers von std::arch aus sicherem Code ist zulässig. Die Änderung gilt für integrierte std::arch-Funktionen, die nur deshalb als unsicher markiert sind, weil sie an eine bestimmte Funktionalität gebunden sind, sofern diese Funktionalität aktiviert ist. Beispielsweise kann _mm256_add_epi32 aus sicherem Code aufgerufen werden, wenn die Anwendung „#[target_feature(enable = "avx2")]“ verwendet.
- Aus den Blöcken "asm!" Assemblercode darf in Rust-Codeblöcke verzweigen, was die Entwicklung von Low-Level-Code vereinfacht, beispielsweise die Implementierung von Optimierungen im Kernel oder die Organisation der Interaktion mit der Hardware. Der Sprungpunkt für den Assembler-Befehl „jmp“ wird im Makro „asm!“ angegeben. Verwenden Sie einen neuen Operanden „Label“, der einen Blockausdruck mit Rust-Code enthält. unsicher { asm!( "jmp {}", label { println!("Von asm gesprungen!"); } ); }
- Es ist zulässig, erfasste generische Typen und Lebensdauern explizit in Trait-Definitionen unter Verwendung von impl Trait-Rückgabetypen anzugeben. Merkmal Foo { fn Methode<'a>(&'a self) -> impl Sized; Typ Implicit1<'a>: Größe; fn method_desugared<'a>(&'a self) -> Self::Implicit1<'a>; fn precise<'a>(&'a self) -> impl Sized + verwenden ; Typ Implicit2: Größe; fn precise_desugared<'a>(&'a self) -> Self::Implicit2; }
- Ein neuer Teil der API wurde in die Kategorie „stabil“ verschoben, einschließlich der Stabilisierung der Methoden und Implementierungen von Merkmalen:
- Vec::extract_if
- vec::ExtractIf
- LinkedList::extract_if
- linked_list::ExtractIf
- <[T]>::abgespalten
- <[T]>::split_off_mut
- <[T]>::zuerst_abspalten
- <[T]>::split_off_first_mut
- <[T]>::letzte_Abspaltung
- <[T]>::letzten_Mut_abspalten
- String::extend_from_within
- os_str::Anzeige
- OsString::Anzeige
- OsStr::display
- io::pipe
- io::PipeReader
- io::PipeWriter
- impl Von für OwnedHandle
- impl Von für OwnedHandle
- impl Von für Stdio
- impl Von für Stdio
- impl Von für OwnedFd
- impl Von für OwnedFd
- Kasten >::schreiben
- impl TryFrom > für String
- <*const T>::offset_from_unsigned
- <*const T>::byte_offset_from_unsigned
- <*mut T>::offset_from_unsigned
- <*mut T>::byte_offset_from_unsigned
- NonNull::offset_from_unsigned
- NonNull::byte_offset_from_unsigned
- ::cast_signiert
- Ungleich Null:: ::cast_signiert.
- ::cast_unsigned.
- Ungleich Null:: ::cast_unsigned.
- ::ist_ein Vielfaches_von
- ::unbounded_shl
- ::unbounded_shr
- ::unbounded_shl
- ::unbounded_shr
- ::Mittelpunkt
- ::von_utf8
- ::from_utf8_mut
- ::von_utf8_nicht geprüft
- ::from_utf8_unchecked_mut
- Das „const“-Zeichen wird in Funktionen verwendet:
- core::str::from_utf8_mut
- <[T]>::Kopie_von_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::Kapazität
- String::as_bytes
- String::Len
- String::ist_leer
- String::as_mut_str
- String::as_mut_vec
- Vec::as_ptr
- Vec::as_slice
- Vec::Kapazität
- Vec::len
- Vec::ist_leer
- Vec::as_mut_slice
- Vec::as_mut_ptr
- Удалён второй уровень поддержки для целевой платформы i586-pc-windows-msvc. Рекомендуется использовать платформу i686-pc-windows-msvc, которая отличается поддержкой инструкций SSE2. Платформа i586-pc-windows-msvc потеряла смысл, так как для Windows 10 необходима поддержка SSE2, а более ранние выпуски Windows в Rust не поддерживаются.
Source: opennet.ru
