Thema: rust
-
Go oder Rust für einen neuen Dienst wählen: ein Entscheidungsverfahren ohne Benchmarks
Die Wahl zwischen Go und Rust für einen Dienst anhand dokumentierter Spracheigenschaften und Teambeschränkungen treffen statt anhand von Benchmark-Folklore: Speicherverwaltungsmodell, Fehler- und Nebenläufigkeitsstil, Form der Arbeitslast, die Bibliotheken, mit denen der Dienst sprechen muss, und wer ihn in zwei Jahren pflegen wird.
-
Packed-Felder in Rust: keine unausgerichtete Referenz vor einem Raw-Pointer-Cast erzeugen
Erklärt, warum eine temporäre Referenz Ausrichtungsanforderungen bereits verletzen kann, und zieht, wo möglich, ein explizites Byte-Dekodieren vor.
-
Rust Pin: die Adresse des Zielobjekts bewahren, ohne die Zeigervariable einzufrieren
Diagnostiziert Pinning-Fehler, indem der adresssensitive Wert und die Operation identifiziert werden, die ihn verschieben könnte.
-
Cargo, Crates und Editions: wie ein Rust-Projekt gebaut und versioniert wird
Cargo baut ein Crate aus Cargo.toml, löst Abhängigkeiten mit SemVer-kompatiblen Bereichen in Cargo.lock auf und kann zwei inkompatible Hauptversionen desselben Crates in einem einzigen Build enthalten. Editions sind pro Crate wählbare Sprachversionen, die zusammenarbeiten, sodass das Anheben der Edition eines Crates dessen abhängige Crates nie zum Mitziehen zwingt.
-
CString an einer FFI-Grenze: geliehenen Zeiger von übertragenem Besitz unterscheiden
Den CString-Eigentümer bei geliehenen Aufrufen am Leben halten und die rohe Besitzübertragung nur unter einem expliziten Rückgabevertrag verwenden.
-
Rust Ownership und Borrowing im Überblick
Jeder Rust-Wert hat genau einen Owner und wird verworfen (dropped), sobald der Owner den Gültigkeitsbereich verlässt; das Übergeben eines Werts verschiebt ihn (move), ausser der Typ ist Copy, und Referenzen leihen ihn (borrow) unter der Regel: entweder eine veränderliche oder beliebig viele gemeinsame Referenzen gleichzeitig. Der Borrow Checker erzwingt das zur Kompilierzeit, und daraus entsteht Speichersicherheit ohne Garbage Collector.
-
Rust-FFI-Layout: repr(C) an einer äusseren Struct repariert keine verschachtelten Felder
Jedes Feld überprüfen, das eine C-ABI-Grenze überquert, und das Layout auf jedem unterstützten Zielsystem verifizieren.
-
Ressourcenzuständigkeit bei Rust-FFI: den fremden Konstruktor mit seinem tatsächlichen Destruktor paaren
Allokation, Freigabe und Callback-Lebensdauer in einem engen Rust-Wrapper um fremde Ressourcen explizit machen.
-
Wie viel länger braucht eine Fachperson aus einer dynamisch typisierten Sprache, um in Rust produktiv zu werden, als in Go, und welche Konzepte erklären diesen Unterschied?
Offene Frage: Go gilt oft als schnell erlernbar und Rust als anspruchsvoll, und die State-of-Rust-Umfrage 2024 berichtet, dass rund 31 % der Nichtnutzenden die wahrgenommene Schwierigkeit als Grund nennen; aber nur wenige Quellen messen die Zeit bis zur ersten gemergten Änderung, die Zeit bis zu unbeaufsichtigten Code-Reviews oder welche Konzepte (Ownership, Lifetimes, Async, Traits) diese Zeit für Fachleute beanspruchen, die von Python, Ruby oder JavaScript kommen.
-
Tokio-Send-Fehler: den über await hinweg erhaltenen Zustand untersuchen
Ein gestartetes Future reparieren, indem untersucht wird, was die Suspendierung überdauert, statt unsichere Trait-Implementierungen hinzuzufügen.
-
Rust-Traits versus Go-Interfaces: explizites impl, implizite Erfüllung
Beide Sprachen abstrahieren Verhalten ohne Klassenhierarchien, doch ein Go-Typ erfüllt ein Interface allein dadurch, dass er die Methoden besitzt, während ein Rust-Typ einen Trait nur über einen expliziten impl-Block implementiert, der der Waisenregel (orphan rule) unterliegt; Rust trennt zusätzlich zur Kompilierzeit erzeugte Generics (monomorphisiert) von dyn-Trait-Objekten (dynamischer Dispatch) – eine Entscheidung, die Go dem Programmierer abnimmt.
-
Result, Option und der ?-Operator: Fehlerbehandlung in Rust
Rust kennt weder Exceptions noch null: fehlschlagbare Operationen geben Result<T, E> zurück, fehlende Werte sind Option<T>, und beide sind Enums, die der Compiler abgleichen lässt. Der ?-Operator gibt Err oder None frühzeitig zurück und wandelt Fehlertypen über From um, und ein ignoriertes Result löst eine Compiler-Warnung aus, weil der Typ mit #[must_use] markiert ist.
-
Rust-FFI-Unwinding: eine explizite Grenze für Panics und Exceptions wählen
Gewöhnliche Fehlerrückgaben, Rust-Panics und fremde Exceptions trennen, bevor die ABI der Grenze gewählt wird.
-
Bei Personen, die neu mit Rust arbeiten, überholt die Wartezeit auf Builds innerhalb der ersten zwei Monate die Borrow-Checker-Fehler als grösste protokollierte Reibung
Hypothese: Borrow-Checker-Fehler dominieren die Reibung, die Personen, die neu mit Rust arbeiten, in ihren ersten Wochen protokollieren, ihr Anteil sinkt jedoch schnell, während Einträge über das Warten auf Builds (trotz cargo check, das die Cargo-Dokumentation als Verzicht auf die Codegenerierung und damit als schneller als cargo build beschreibt) zunehmen und innerhalb von zwei Monaten zur grössten Kategorie werden; ein vorgeschlagener Test mit Reibungsprotokoll, ohne behauptetes Ergebnis.
Maschinenlesbar: JSON