8

Lesen der basic introduction:Warum überprüft Rust Array-Grenzen zur Laufzeit, wenn (die meisten) anderen Prüfungen zur Kompilierzeit stattfinden?

If you try to use a subscript that is not in the array, you will get an error: array access is bounds-checked at run-time.

Warum Rust Check Feldgrenzen zur Laufzeit, wenn es scheint, die meisten anderen Kontrollen bei der Kompilierung auftreten?

+0

mögliches Duplikat von [Warum lässt der Rust-Compiler den Index außerhalb der zulässigen Grenzen zu?] (Http://stackoverflow.com/questions/24898579/why-does-rust-compiler-allow-index-out-of-bounds) – Shepmaster

Antwort

17

Weil die Überprüfung von Indizes zur Kompilierzeit nicht möglich ist. Das Nachdenken über die möglichen Werte von willkürlichen Variablen ist irgendwo zwischen hart und unmöglich sogar für kleine Programme. Niemand will müssen:

  1. formal beweisen, dass der Index nicht außerhalb der Grenzen sein kann und
  2. kodieren, dass der Nachweis in das Typsystem

... für jedes einzelne Scheibe/Vec/etc. Zugriff. Da müssen Sie zum Überprüfen der Kompilierung während der Kompilierung eine Überprüfung durchführen. Sie benötigen im Wesentlichen abhängige Typisierung. Neben der Möglichkeit, die Typüberprüfung unentscheidbar zu machen (und ein Programm zur Typüberprüfung erheblich härter zu bekommen), wird Typinkompensation im Allgemeinen unmöglich (und im besten Fall viel stärker eingeschränkt), Typen werden viel komplizierter und wortreicher und die Komplexität der Sprache steigt deutlich. Dass Indizes in Grenzen sind, lässt sich nur unter sehr einfachen Umständen ohne signifikanten zusätzlichen Programmieraufwand nachweisen.

Darüber hinaus gibt es wenig Anreiz, Grenzen Checks loszuwerden. Lebenszeiten ziehen ihr Gewicht, indem sie die Notwendigkeit der Garbage-Collection fast vollständig eliminieren - was ein riesiges, invasives Merkmal mit unvorhersehbarem Durchsatz, Raum und Latenz-Implikationen ist. Das Überprüfen der Laufzeitgrenzen ist dagegen sehr wenig invasiv, hat einen kleinen und bekannten Overhead und kann in leistungskritischen Bereichen selektiv ausgeschaltet werden, selbst wenn der gesamte Rest des Programms es großzügig verwendet.

+1

Es ist eine Reichweite, um Laufzeiten Grenzen Überprüfung ist "sehr nicht-invasiv" vorschlagen. Die Auswirkung hängt mit der Komplexität der Algorithmen zusammen, die an dem Array arbeiten. Für Messungen wie die Laufzeit ist das Hinzufügen eines Begrenzungs-Checks für jeden Array-Zugriff ein konstanter Multiplikator. – Rob

+0

@Rob Ein konstanter Faktor für die Laufzeit eines Vorgangs ändert niemals die Komplexität des Algorithmus. Es kann sehr wohl einen inakzeptablen Einfluss auf die (nicht asymptotische) Laufzeit haben. Aber * wie gesagt * kann der Programmierer für jeden einzelnen Array-Zugriff die Überprüfung außerhalb der Grenzen deaktivieren, und wenn dies der Fall ist, ist die Leistung gleich C. Die Überprüfung der Grenzen wirkt sich nicht auf einen Teil des Programms aus, der sie nicht verwendet. Und * das * ist, was ich mit nicht-invasiv meine (ich erwähne die Auswirkungen auf die Leistung woanders im selben Satz). – delnan

+1

Ich habe nicht vorgeschlagen, dass es irgendeine Änderung der Komplexität des Algorithmus geben würde. Die Möglichkeit, eine Laufzeitfunktion zu deaktivieren, macht es nicht nichtinvasiv. – Rob