Die Veröffentlichung der Programmiersprache Rust 1.78, die ursprĂŒnglich von Mozilla entwickelt wurde und nun unter der Aufsicht der unabhĂ€ngigen gemeinnĂŒtzigen Organisation Rust Foundation weiterentwickelt wird, wurde bekannt gegeben. Die Sprache fokussiert sich auf eine sichere Speicherverwaltung und bietet Mittel zur Erreichung einer hohen ParallelitĂ€t bei der AusfĂŒhrung von Aufgaben, ohne dabei einen Garbage Collector oder eine Laufzeitumgebung (runtime) zu verwenden, die auf die grundlegende Initialisierung und UnterstĂŒtzungsfunktionen der Standardbibliothek beschrĂ€nkt ist.
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:
- Ein neuer Namensraum fĂŒr Attribute "#[diagnostic]" wurde eingefĂŒhrt, der Möglichkeiten bietet, die vom Compiler ausgegebenen Fehlermeldungen zu beeinflussen. Der erste im neuen Namensraum realisierte Attribut ist "#[diagnostic::on_unimplemented]", der verwendet werden kann, um Fehlermeldungen anzupassen, die angezeigt werden, wenn ein Trait benötigt wird, der fĂŒr einen Typ nicht implementiert ist. #[diagnostic::on_unimplemented( message = "My Message for `ImportantTrait<{A}>` is not implemented for `{Self}`", label = "My Label", note = "Note 1", note = "Note 2" )] trait ImportantTrait<A> {} fn use_my_trait(_: impl ImportantTrait<i32>) {} fn main() { use_my_trait(String::new()); } error[E0277]: My Message for `ImportantTrait<i32>` is not implemented for `String` â> src/main.rs:12:18 | 12 | use_my_trait(String::new()); | ââââ ^^^^^^^^^^^^^ My Label | | | required by a bound introduced by this call | = help: the trait `ImportantTrait<i32>` is not implemented for `String` | = note: Note 1 | = note: Note 2
- VorlĂ€ufige Assert-PrĂŒfungen, die auf unsafe-Funktionen angewendet werden, können jetzt bis zur Codegenerierungsphase verschoben werden, sodass diese PrĂŒfungen durchgefĂŒhrt werden können, ohne dass die Standardbibliothek im Modus "#[cfg(debug_assertions)]" erstellt werden muss. Um die PrĂŒfungen auszulösen, reicht es jetzt aus, die Debug-Assert fĂŒr Test- oder Debug-Bauten des eigenen Codes zu aktivieren.
- Das Verhalten von Funktionen in der Standardbibliothek, die die Ausrichtung von Zeigern und Slices beeinflussen, ist nun zur Laufzeit vorhersagbar und hĂ€ngt von den Eingabewerten ab. Die Funktion pointer::align_offset, die den Offset fĂŒr die Ausrichtung eines Zeigers berechnet, gibt jetzt nur dann usize::MAX zurĂŒck, wenn die Operation nicht ausgefĂŒhrt werden kann. Die Funktionen slice::align_to und slice::align_to_mut, die Slices in eine Darstellung mit ausgerichteten mittleren Slices und den ursprĂŒnglichen Anfangs- und End-Slices umwandeln, geben jetzt immer den gröĂten mittleren Teil zurĂŒck.
- In die Kategorie stabil ĂŒberfĂŒhrt wurden:
- impl Read for &Stdin
- Die Verwendung einer nicht statischen Lebensdauer (nicht âstatic) ist fĂŒr einige Implementierungen, die mit std::error::Error verbunden sind, erlaubt.
- Es ist in der Implementierung impl<Fd: AsFd> erlaubt, den Wert ?Sized zu verwenden.
- impl From<TryReserveError> fĂŒr io::Error
- Die Funktion Barrier::new() wurde stabilisiert, um mit dem Attribut âconstâ in jedem Kontext verwendet zu werden, anstelle von konstanten Werten.
- FĂŒr die Zielplattformen x86_64-pc-windows-msvc, i686-pc-windows-msvc, x86_64-pc-windows-gnu, i686-pc-windows-gnu, x86_64-pc-windows-gnullvm und i686-pc-windows-gnullvm wird jetzt mindestens Windows 10 benötigt.
- Der dritte Support-Level fĂŒr die Plattformen wasm32-wasip2, arm64ec-pc-windows-msvc, armv8r-none-eabihf und loongarch64-unknown-linux-musl wurde implementiert. Der dritte Level bedeutet grundlegende UnterstĂŒtzung, jedoch ohne automatisierte Tests, Veröffentlichung offizieller Builds und ĂberprĂŒfung der BuildfĂ€higkeit des Codes.
- Der zweite Support-Level fĂŒr die Zielplattform Add wasm32-wasip1 wurde implementiert. Der zweite Support-Level garantiert das Bauen.
- Die Plattform wasm32-wasi-preview1-threads wurde in wasm32-wasip1-threads umbenannt.
- Der Compiler wurde auf die Verwendung von LLVM 18 umgestellt. Bei Verwendung von LLVM 18 fĂŒr die Architekturen x86-32 und x86-64 wurde das ABI, das mit den Typen u128 und i128 verbunden ist, geĂ€ndert.
- Im Paketmanager Cargo wurde die Version 4 der Lockdateien (lockfile v4) stabilisiert.
- In Cargo wurde ein globaler Cache mit Informationen zur letzten Nutzung von Daten stabilisiert. Der Cache wird in der Datei $CARGO_HOME/.global-cache mit SQLite gespeichert, automatisch aktualisiert und spiegelt die letzten Ănderungen wider, die mit dem Index, der crate-Datei, dem Quellcodeverzeichnis, git clone und git checkout verbunden sind.
ZusĂ€tzlich kann die Programmiersprache Borgo erwĂ€hnt werden, die versucht, ausdrucksvoller als Go, aber weniger komplex als Rust zu sein. Borgo kombiniert die besten Eigenschaften von Go und Rust und kompensiert die MĂ€ngel jeder Sprache. Zum Beispiel ist Go einfach und verstĂ€ndlich, bietet jedoch keine erweiterten Mittel zur GewĂ€hrleistung der Sicherheit im Umgang mit Typen. Rust bietet Mittel fĂŒr sicheres Programmieren, ist jedoch ĂŒberkompliziert. Das Projekt wird von Marco Sampellegrini entwickelt, dem Autor des Buches âThe Simple Haskell Handbookâ und dem Entwickler des Systems fĂŒr kontinuierliche Integration Quad CI.

In Borgo wird statische Typisierung verwendet, Ă€hnlich wie bei der Programmiersprache Go, und die Syntax erinnert an Rust. Das Setzen von Semikolons am Ende der Zeilen im Borgo-Code ist nicht verpflichtend. Der Code in der Sprache Borgo wird in Go-Code kompiliert, der vollstĂ€ndig kompatibel mit bestehenden Paketen fĂŒr die Sprache Go ist. Der Compiler-Code ist in Rust geschrieben und wird unter der ISC-Lizenz vertrieben. use fmt enum NetworkState { Loading, Failed(int), Success(T), } struct Response { title: string, duration: int, } fn main() { let res = Response { title: «Hello world», duration: 0, } let state = NetworkState.Success(res) let msg = match state { NetworkState.Loading => «still loading», NetworkState.Failed(code) => fmt.Sprintf(«Got error code: %d», code), NetworkState.Success(res) => res.title, } fmt.Println(msg) }
Quelle: opennet.ru
