Die Veröffentlichung der Programmiersprache Rust 1.82, die ursprĂŒnglich von Mozilla entwickelt und nun von der unabhĂ€ngigen Non-Profit-Organisation Rust Foundation weiterentwickelt wird, wurde veröffentlicht. Die Sprache konzentriert sich auf eine sichere Arbeit mit dem Speicher und bietet Mittel fĂŒr hohe ParallelitĂ€t bei der AufgabenausfĂŒhrung, ohne einen Garbage Collector oder Runtime zu benötigen (die Runtime beschrĂ€nkt sich auf die grundlegende Initialisierung und die Verwaltung der Standardbibliothek).
Die Methoden zur Speicherverwaltung in Rust befreien den Entwickler von Fehlern beim Umgang mit Zeigern und schĂŒtzen vor Problemen, die durch niedrige Speicherverwaltung entstehen, wie z. B. den Zugriff auf Speicherbereiche nach deren Freigabe, Dereferenzierung von Nullzeigern, PufferĂŒberlĂ€ufen usw. Zur Verbreitung von Bibliotheken, zur GewĂ€hrleistung des Builds und zur Verwaltung von AbhĂ€ngigkeiten wird der Paketmanager Cargo entwickelt. FĂŒr das Hosting von Bibliotheken wird das Repository crates.io unterstĂŒtzt.
Sichere Speicherverwaltung wird in Rust wĂ€hrend der Kompilierung durch ĂberprĂŒfung von Referenzen, Nachverfolgung des Eigentums an Objekten, BerĂŒcksichtigung der Lebensdauer von Objekten (Sichtbarkeitsbereiche) und Bewertung der Korrektheit des Zugriffs auf den Speicher wĂ€hrend der AusfĂŒhrung des Codes gewĂ€hrleistet. Rust bietet ebenfalls Mittel zum Schutz vor ĂberlĂ€ufen bei Ganzzahlen, fordert die zwingende Initialisierung von Variablenwerten vor deren Verwendung und behandelt Fehler in der Standardbibliothek besser. AuĂerdem wird das Konzept der UnverĂ€nderlichkeit (immutable) von Referenzen und Variablen standardmĂ€Ăig angewendet, und es bietet eine starke statische Typisierung zur Minimierung logischer Fehler.
Hauptneuheiten:
- Das Paketverwaltungssystem cargo hat den Befehl âinfoâ hinzugefĂŒgt, um Informationen ĂŒber ein Paket im Repository auszugeben.
- Die UnterstĂŒtzung der Syntax âuse<..>â in âimpl Traitâ wurde hinzugefĂŒgt, die Informationen ĂŒber verborgene Typen definiert. Zum Beispiel bedeutet âimpl Trait + use<âx, T>â, dass im verborgenen Typ nur die Parameter âxâ und âTâ zulĂ€ssig sind.
- Eine separate Syntax zur Erstellung von Raw-Pointern wurde vorgeschlagen, die die zuvor verwendeten Makros ersetzt: Anstelle des Makros âaddr_of!(expr)â kam der Operator â&raw const exprâ, und anstelle des Makros âaddr_of_mut!(expr)â der Operator â&raw mut exprâ. struct Packed { not_aligned_field: i32, } fn main() { let p = Packed { not_aligned_field: 1_82 }; // Alte Methode zur Erstellung eines Raw-Pointers let ptr = std::ptr::addr_of!(p.not_aligned_field); // Neue Methode zur Erstellung eines Raw-Pointers let ptr = &raw const p.not_aligned_field; let val = unsafe { ptr.read_unaligned() }; }
- Es wird die Möglichkeit bereitgestellt, sichere (safe) Funktionen und Konstanten mit der Lebensdauer âstaticâ innerhalb von extern-Blöcken mit dem Zeichen âunsafeâ zu definieren (zuvor konnten alle Elemente in âunsafe externâ nur das Zeichen âunsafeâ haben): unsafe extern { pub safe static TAU: f64; pub safe fn sqrt(x: f64) -> f64; pub unsafe fn strlen(p: *const u8) -> usize; }
- Die Attribute no_mangle, link_section und export_name, die zu nicht definiertem Verhalten fĂŒhren können, gelten nun als unsicher und erfordern eine explizite Kennzeichnung mit dem Zeichen âunsafeâ, zum Beispiel: #[unsafe(no_mangle)] pub fn my_global_function() { }
- Beim Mustervergleich ist es erlaubt, leere Typen wie âenum Void {}â oder Strukturen mit sichtbarem leerem Feld zu ĂŒberspringen. use std::convert::Infallible; pub fn unwrap_without_panic<T>(x: Result<T, Infallible>) -> T { let Ok(x) = x; // âErrâ kann ĂŒbersprungen werden x }
- Das Verhalten im Umgang mit nicht-numerischen Werten NaN (0.0/0.0) wurde fĂŒr Typen fĂŒr FlieĂkommazahlen (f32 und f64) standardisiert, und die Verwendung von FlieĂkommaoperationen in const fn wurde genehmigt.
- In den Assembler-Insertionen besteht die Möglichkeit, Operanden mit dem Attribut âconstâ zu verwenden, um ganze Zahlenwerte direkt zu nutzen, ohne sie zuvor in einem Register zu speichern. const MSG: &str = "Hello, world!\n"; unsafe { core::arch::asm!( "mov rdx, {LEN} \/\/ Es wird die Anweisung 'mov rdx, 14' erstellt", LEN = const MSG.len(), ⊠); }
- Die Adressierung von AusdrĂŒcken mit dem Attribut âstaticâ ist im sicheren Kontext ohne Definition eines unsicheren Blocks erlaubt (die Operatoren â&raw mutâ und â&raw constâ beeinflussen den Wert des Operanden nicht und erstellen lediglich einen Zeiger darauf): static mut STATIC_MUT: Type = Type::new(); extern "C" { static EXTERN_STATIC: Type; } fn main() { let static_mut_ptr = &raw mut STATIC_MUT; let extern_static_ptr = &raw const EXTERN_STATIC; }
- Eine neue Charge von APIs wurde in den stabilen Bereich ĂŒberfĂŒhrt, darunter wurden Methoden und Implementierungen von Traits stabilisiert:
- std::thread::Builder::spawn_unchecked
- std::str::CharIndices::offset
- std::option::Option::is_none_or
- [T]::is_sorted
- [T]::is_sorted_by
- [T]::is_sorted_by_key
- Iterator::is_sorted
- Iterator::is_sorted_by
- Iterator::is_sorted_by_key
- std::future::Ready::into_inner
- std::iter::repeat_n
- impl DoubleEndedIterator for Take
Quelle: opennet.ru
