Die Version 1.53 der Programmiersprache Rust wurde veröffentlicht. Rust wurde ursprünglich von Mozilla entwickelt, wird jedoch jetzt von der unabhängigen gemeinnützigen Organisation Rust Foundation weitergeführt. Die Sprache konzentriert sich auf sicheren Umgang mit Speicher, bietet automatisches Speicher-Management und ermöglicht hohe Parallelität bei der Ausführung von Aufgaben, ohne einen Garbage Collector oder eine Runtime zu benötigen (die Runtime beschränkt sich auf die grundlegende Initialisierung und die Unterstützung der Standardbibliothek).
Das automatische Speichermanagement in Rust befreit Entwickler von Fehlern beim Umgang mit Zeigern und schützt vor Problemen, die aus der niederen Speicherverwaltung entstehen, wie etwa dem Zugreifen auf Speicherbereiche nach deren Freigabe, dem Dereferenzieren von Nullzeigern, Pufferüberläufen usw. Zur Verbreitung von Bibliotheken, zur Gewährleistung des Builds und zur Verwaltung der Abhängigkeiten wird der Paketmanager Cargo entwickelt. Für die Bereitstellung von Bibliotheken wird das Repository crates.io unterstützt.
Hauptneuheiten:
- Für Arrays wurde das Trait IntoIterator implementiert, das die Iteration über die Elemente eines Arrays anhand ihrer Werte ermöglicht: for i in [1, 2, 3] { .. }
Außerdem gibt es jetzt die Möglichkeit, Arrays an Methoden zu übergeben, die Iteratoren erwarten, zum Beispiel: let set = BTreeSet::from_iter([1, 2, 3]); for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) { .. }
Früher wurde IntoIterator nur für Referenzen auf Arrays implementiert, das heißt, um über die Werte zu iterieren, musste man Referenzen verwenden ("&[1, 2, 3]") oder ".iter()" aufrufen. Die Implementierung von IntoIterator für Arrays war durch Kompatibilitätsprobleme beeinträchtigt, die durch die zuvor in den Compiler eingefügte Umwandlung der Methode array.into_iter() in (&array).into_iter() verursacht wurden. Diese Probleme konnten durch einen Workaround gelöst werden: Der Compiler wird die Umwandlung von array.into_iter() in (&array).into_iter() weiterhin durchführen, als ob die Implementierung des Traits IntoIterator nicht vorhanden wäre, jedoch nur bei der Aufrufmethode mit dem Syntax "into_iter()" und nicht bei Aufrufen in der Form "in [1, 2, 3]", "iter.zip([1, 2, 3])", "IntoIterator::into_iter([1, 2, 3])".
- Es wurde die Möglichkeit eingeführt, "|" (logische ODER-Operation) an beliebiger Stelle im Muster anzugeben, zum Beispiel anstelle von "Some(1) | Some(2)" kann jetzt "Some(1 | 2)" geschrieben werden: match result { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. } _ => { .. } }
- Die Verwendung von nicht-ASCII-Zeichen in Identifikatoren ist erlaubt, einschließlich aller nationalen Zeichen, die in der Unicode-Spezifikation UAX 31 definiert sind, jedoch ohne Emoji-Zeichen. Wenn verschiedene, aber ähnlich aussehende Zeichen verwendet werden, gibt der Compiler eine Warnung aus. const BLÅHAJ: &str = «🦈»; struct 人 { 名字: String, } let α = 1; let sos = 2; warning: Identifierpaar wird als verwirrend zwischen 's' und 's' angesehen.
- Eine neue Runde der API wurde in den stabilen Bereich überführt, darunter stabilisiert:
- array::from_ref
- array::from_mut
- AtomicBool::fetch_update
- AtomicPtr::fetch_update
- BTreeSet::retain
- BTreeMap::retain
- BufReader::seek_relative
- cmp::min_by
- cmp::min_by_key
- cmp::max_by
- cmp::max_by_key
- DebugStruct::finish_non_exhaustive
- Duration::ZERO
- Duration::MAX
- Duration::is_zero
- Duration::saturating_add
- Duration::saturating_sub
- Duration::saturating_mul
- f32::is_subnormal
- f64::is_subnormal
- IntoIterator für Arrays
- {integer}::BITS
- io::Error::Unsupported
- NonZero*::leading_zeros
- NonZero*::trailing_zeros
- Option::insert
- Ordering::is_eq
- Ordering::is_ne
- Ordering::is_lt
- Ordering::is_gt
- Ordering::is_le
- Ordering::is_ge
- OsStr::make_ascii_lowercase
- OsStr::make_ascii_uppercase
- OsStr::to_ascii_lowercase
- OsStr::to_ascii_uppercase
- OsStr::is_ascii
- OsStr::eq_ignore_ascii_case
- Peekable::peek_mut
- Rc::increment_strong_count
- Rc::decrement_strong_count
- slice::IterMut::as_slice
- AsRef für slice::IterMut
- impl SliceIndex für (Bound, Bound)
- Vec::extend_from_within
- Die dritte Unterstützungsebene für die Plattform wasm64-unknown-unknown wurde implementiert. Diese dritte Ebene bietet grundlegende Unterstützung, jedoch ohne automatisierte Tests, Bereitstellung offizieller Builds und Überprüfung der Build-Möglichkeiten.
- Der Paketmanager Cargo wurde standardmäßig auf die Verwendung des Namens „main“ für den Hauptbranch des Git-Repositorys (HEAD) umgestellt. Für Abhängigkeiten, die in Repositories gehostet werden, die den Namen main anstelle von master verwenden, ist es nicht mehr erforderlich, in den Einstellungen branch = „main“ anzugeben.
- Im Compiler wurden die Anforderungen an die Mindestversion von LLVM auf LLVM 10 angehoben.
Zusätzlich kann die Bereitstellung von finanziellen Mitteln für die Entwicklung von Integrationswerkzeugen für den Linux-Kernel zur Entwicklung von Komponenten in der Programmiersprache Rust hervorgehoben werden. Diese Arbeit wird im Rahmen des Projekts Prossimo unter der Schirmherrschaft der ISRG (Internet Security Research Group) durchgeführt, die das Projekt Let’s Encrypt ins Leben gerufen hat und die Verbreitung von HTTPS sowie die Entwicklung von Technologien zur Verbesserung der Internetsicherheit fördert. Die Mittel werden von Google bereitgestellt, die die Arbeit von Miguel Ojeda, dem Autor des Projekts Rust-for-Linux, finanzieren. Zuvor hatten ISRG und Google bereits die Erstellung eines alternativen HTTP-Backends für das Tool curl sowie die Entwicklung eines neuen TLS-Moduls für den HTTP-Server Apache finanziert.
Laut den Unternehmen Microsoft und Google sind etwa 70 % der Sicherheitsanfälligkeiten auf unsichere Speicherpraktiken zurückzuführen. Es wird angenommen, dass die Verwendung der Programmiersprache Rust für die Entwicklung von Kernel-Komponenten, wie z. B. Gerätetreibern, das Risiko von Sicherheitsanfälligkeiten, die durch unsicheres Speichermanagement verursacht werden, verringern und Fehler wie das Zugreifen auf Speicherbereiche nach deren Freigabe sowie Pufferüberläufe ausschließen kann.
Die sichere Verwaltung von Speicher in Rust erfolgt während der Kompilierung durch Überprüfung von Referenzen, das Verfolgen des Eigentums an Objekten und das Management der Lebensdauer von Objekten (Sichtbarkeiten). Außerdem bewertet Rust die Korrektheit des Zugriffs auf den Speicher zur Laufzeit. Rust bietet auch Mechanismen zum Schutz vor Überläufen bei Ganzzahlen, verlangt die obligatorische Initialisierung von Variablen vor ihrer Verwendung, behandelt Fehler in der Standardbibliothek besser und wendet das Konzept der Unveränderlichkeit (immutable) für Referenzen und Variablen standardmäßig an. Zudem bietet es eine starke statische Typisierung zur Minimierung logischer Fehler.
Quelle: opennet.ru
