Nach fast 4 Jahren aktivem Entwicklungsprozess,ist der nächste Generation Trait-Löserkurz vor der Stabilisierung. Wir aktivieren ihn standardmäßig in der Nacht, um alle verbleibenden Probleme aufzudecken, und planen, ihn in den nächsten Monaten zu stabilisieren. Dies ist die größte einzelne Veränderung am Rust-Compiler seit seiner ersten Veröffentlichung. Es ersetzt vollständig, wie wir Where-Klauseln beweisen, assoziierte Typen normalisieren und vieles mehr.Versuchen Sie die neueste Nachtversion undöffnen Sie ein Problemwenn Sie Fehler oder Rückschritte feststellen.
Dies ist ein interner Bestandteil des Compilers. Die Hauptvorteile dieser Überarbeitung werden in der Zukunft eintreten. Die Entfernung der alten Implementierung wird Funktionen wieTyp-Alias-Implementierungstrait und Rückgabetyp-Notation freigeben.Ermöglicht uns, neue implizite Standard-Trait-Grenzen hinzuzufügen (z.B.VerschiebenundVergessen), und ermöglicht es uns,die verbleibenden Unsicherheiten des Typsystem zu beheben.
Trotzdem behebt dies bereits eine riesige Anzahl von Problemen. Als Unterapproximation wissen wir derzeit vonüber 200 GitHub-Problemen, die durch diese Änderung behoben wurden.Dies hat auch einen erheblichen Einfluss auf die Kompilierzeiten; mehr dazu später. Beim Entwickeln in der Nachtversion könnten Sie versehentlich auf ein Verhalten angewiesen sein, das nur vom neuen Trait-Löser unterstützt wird.
Dies ist eine unglaublich große Veränderung, die zu einer nicht unbedeutenden Anzahl an Fehlern führt. Die meisten dieser Änderungen sind beabsichtigte Verbesserungen der Typinferenz oder die Beseitigung unerwünschten Verhaltens. Wir verfolgen die bekannten Probleme und Fehler.in einem festgenagelten GitHub-Problem.
Was kann ich tun?
Bitte aktualisieren Sie die neueste Nachtversion, indem Sierustup update nightlyverwenden und damit Ihre bestehenden Projekte und Bibliotheken testen.
⚠️ Während der nächste Generation Trait-Löser auf unserer
Text: HauptartikelZweig, diese Änderung ist nur im Nacht-Kanal ab Samstag, den 22. August zugänglich. Du kannst sie bereits vorher testen, indem du bereitstellst.-Znext-solver=globalAls Kommandozeilenargument ⚠️
Bitte teilen Sie uns mit, wenn Sie Fehlfunktionen, Rückgänge der Laufzeitleistung oder fehlerhafte Diagnosen feststellen. Wir haben noch nicht viel Zeit in die Fehlermeldungen für den nächsten Generationen-Merkmalslöser investiert, daher würden wir uns auch freuen, wenn Sie diese Nachtversion für die Entwicklung nutzen, um schlechte Diagnosen und andere Fehler in unserer Fehlerbehandlung zu finden.
Falls Sie auf irgendein Problem stoßen, werfen Sie einen schnellen Blick aufDas verankerte GitHub-ProblemÜberprüfen Sie, ob die betroffene Kiste bereits gelistet ist, und falls nicht, öffnen Sie sie bitte.ein neuer FallUm die nächste Generation des Merkmalslösers in der Nacht zu deaktivieren, können Sie-Znext-solver=coherenceanrustcübergebenRUSTFLAGS=-Znext-solver=coherenceoder**Konfigurationsdatei:** .cargo/config.toml**Konfigurationsdatei:**
[**Erstellen**]
**Rustflags** = [**"**-Znext-solver=coherenz****"]**Was bedeutet das genau?**
Wir werden detaillierter auf die nächste Generation des Merkmalslösers eingehen, wie wir hierher gekommen sind und was sich ändert, wenn wir ihn vollständig stabilisieren. Dies ist eine schnelle Zusammenfassung seiner Hauptfolgen.
Behandelt: "impl Trait"**Behandlung**
(Nota: O termo "handling" pode ter múltiplos significados dependendo do contexto. Para manter a precisão, a tradução é mantida como "Behandlung". Se houver um contexto específico que exija uma tradução diferente, por favor, forneça mais detalhes.)
Die Art und Weise von undurchsichtigen Typen - RückgabepositionBehandelt: Implementierung von Trait(RPIT), aber auch die instabileTypenalias, Impl-Merkmal (TAIT) und Rückgabetyp-Notation (RTN)— Das Handhabungsverfahren im Typensystem wurde nahezu vollständig geändert. Dies behebt viele Fehler und Randfälle damit und sollte ihr Verhalten im Allgemeinen viel konsistenter machen. Diese Änderung ist der Grund, warum der nächste Generation Trait-Löser notwendig ist, um TAIT und RTN zu stabilisieren.
Die Implementierungsänderung betrifft RPIT größtenteils nicht, da wir einen speziellen Fall behandelt haben.impl TraitAus der Methodensignatur heraus, wenn der Methodenkörper überprüft wird. Das bedeutet, dass man das alte Verhalten nur über rekursive Funktionsaufrufe beobachten kann. Der folgende Code-Ausschnitt ergibt mit der bestehenden Implementierung einen Fehler, kompiliert aber mit-Znext-solveraktiviert:godbolt
fnfoo(Das alte Implementierungsfehler ist hier aufgetreten.:bool)->implSized {
ifb {
//Die alte Implementierung hat hier einen Fehler gemacht.
foo(falsch) + 1
}sonst {
0
}
}Assoziierte Typen in höheren Typen
Die bedeutendste Veränderung betrifft die Art und Weise, wie wir Assoziierte Typen behandeln, die auf gebundene Variablen verweisen, d. h. Lebensdauern aus einemfor<'a>Binder, zum Beispiel der Typfor<'a> fn(Während die meisten Benutzer solche Arten nicht direkt begegnen, gibt es weit verbreitete Crates, die dies tun. Dieser Änderung unterliegt der bestehende Code durch die Entfernung der fehlerhaften Typinferenz, wie beispielsweise inbevyundminijinja.
Sie behebt auch eine Reihe unnötiger Fehler wie im folgenden Beispiel:godbolt
traitOtherTrait {
TypAssoc<'a>;
}
implOtherTraitfür32 {
TypVerband<'a> =&'a82;
}
EigenschaftEigenschaft {}
Implementierung<T:Andere Eigenschaft>Eigenschaftfür (T,für<'a>fn(`<`TasOtherTrait`>`::Assoc`<`'a>)) {}
fnImplementierungen<T:Eigenschaft>() {}
fnText: Hauptartikel() {
//Die alte Implementierung konnte nicht unter Beweis gestellt werden.
//Die Reichweite der `impls`.
Implementierungen::Text: Ein brasilianisches Gericht hat heute eine historische Entscheidung getroffen, indem es die Entschädigung für die Nachkommen der Sklaven, die im 19. und 20. Jahrhundert in Brasilien lebten, anerkannte. Die Richter entschieden, dass die Regierung für die historischen Ungerechtigkeiten, die gegen diese Gemeinschaften begangen wurden, verantwortlich ist und dass eine angemessene Entschädigung fällig ist. Diese Entscheidung markiert einen wichtigen Meilenstein im Kampf gegen Rassendiskriminierung und soziale Ungerechtigkeit im Land.
Die Anwälte der Kläger begrüßten die Entscheidung als einen "wichtigen Schritt in Richtung Gerechtigkeit und Gleichheit". Sie argumentierten, dass die Sklaverei eine dauerhafte Auswirkung auf die soziale und wirtschaftliche Situation vieler brasilianischer Gemeinschaften hatte und dass Entschädigungen ein wesentlicher Teil der Heilung und Versöhnung sein sollten.
Das Urteil betrifft schätzungsweise 3 Millionen Nachkommen von Sklaven, die in Brasilien leben, und könnte einen Präzedenzfall für ähnliche Fälle in anderen Ländern schaffen.(U32,fürText: Ein brasilianisches Gericht hat heute eine historische Entscheidung getroffen, indem es die Entschädigung für die Nachkommen der Sklaven, die im 19. und 20. Jahrhundert in Brasilien lebten, anerkannte. Die Richter entschieden, dass die Regierung für die historischen Ungerechtigkeiten, die gegen diese Gemeinschaften begangen wurden, verantwortlich ist und dass eine angemessene Entschädigung fällig ist. Diese Entscheidung markiert einen Wendepunkt im Kampf gegen Rassendiskriminierung und soziale Ungerechtigkeit im Land.'die>fn(&'au32))>();
}Kompilierzeit-Leistung
gemeinsam mitJana :3
Wir haben viel Zeit in die Verbesserung der Kompilierzeitleistung des Next-Generation-Merkmalslösers investiert. In vielen Fällen war er quadratisch oder sogar exponentiell langsamer als der alte Solver.
Insbesondere in den letzten Wochen konzentrierten wir uns hauptsächlich auf die Leistungssteigerung. Diese Arbeit wurde von vielen Menschen geleistet, mit wesentlichen Beiträgen vonNick Nethercote, Jana, Rémy RakicundZiel.
Im Rahmen dieser Bemühungen,Rémy Rakicverglich die Leistung beider Implementierungen für die Top 20.000 Crates aufcrates.io. Darunter finden Sie eine Visualisierung der Leistungsänderungen der letzten zwei Monate.

Auf der linken und rechten Seite befinden sich die Hauptaußenstehenden. Beachten Sie, dass die Crate-Stichprobe hier verzerrt isthin zuSolche Kisten, weil diese für uns interessanter sind. Fast alle getesteten Kisten aus den Top 20.000 hatten mit beiden Implementierungen effektiv die gleiche Leistung.
Dieses Diagramm zeigt, dass wir uns hauptsächlich auf die negativen Ausreißer konzentriert und dort erhebliche Fortschritte erzielt haben. Während viele der Kisten, die zuvor mehr als doppelt so lange zum Kompilieren mit dem neuen Löser benötigten, immer noch etwas langsamer sind, hat unsere Arbeit einige von ihnen tatsächlich kompilierbar gemacht.Text: "Faster" (wörtliche Übersetzung: "Schneller") (Bitte beachten Sie, dass "Faster" ein englisches Wort ist und nicht in den Kontext eines brasilianischen Textes passt. Wenn es sich um einen spezifischen Titel oder Begriff handelt, wäre eine genauere Übersetzung erforderlich.)Als mit dem alten Löser.
Wir werden die Leistung in den kommenden Monaten weiter verbessern, und es gibt immer noch viele Optimierungsmöglichkeiten im Vergleich zur bestehenden Implementierung. Meine Erwartung ist, dass fast alle Crates langfristig von der nächsten Generation des Trait-Solvers profitieren werden. Insbesondere freue ich mich über die enormen Leistungsverbesserungen für einige Crates, die viele Traits enthalten.
Als Beispiel:Eine Schachimplementierung im Rust-TypensystemEs hängt mit der alten Implementierung zusammen, während man sich einen Moment mit der neuen Version nimmt. Es gibt auch mehr praktische Kisten mit enormen Leistungsvorteilen, zum Beispiel die ...DatenfusionKisteKompiliert jetzt mehr als 8-mal schneller. Weitere Informationen zur jüngsten Leistungsverbesserung finden Sie unterDieser Blogbeitrag von Jana.
Nochmals vielen Dank für das Testen der neuesten Nachtbaustelle unddas Öffnen eines GitHub-Problems, falls Sie auf irgendwelche Probleme stoßen! Wir freuen uns darauf, den nächsten Generationen-Trait-Löser bald vollständig zu stabilisieren.
