2015-02-08 10 views
8

Czytanie basic introduction:Dlaczego tablica sprawdzania Rust sprawdza się w czasie wykonywania, kiedy (większość) innych kontroli występuje podczas kompilacji?

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.

Dlaczego granice tablicy check Rust w czasie wykonywania, gdy wydaje się, większość inne kontrole wystąpić w czasie kompilacji?

+0

możliwy duplikat [Dlaczego kompilator Rust zezwala na indeks poza zakresem?] (Http://stackoverflow.com/questions/24898579/why-does-rust-compiler-allow-index-out-of-bounds) – Shepmaster

Odpowiedz

17

Ponieważ sprawdzanie indeksów w czasie kompilacji nie jest możliwe. Rozumowanie o możliwych wartościach arbitralnych zmiennych jest gdzieś pomiędzy trudnymi i niemożliwymi nawet dla małych programów. Nikt nie chce mieć do:

  1. formalnie udowodnić, że indeks nie może być poza boiskiem, a
  2. zakodować, że dowód w systemie typu

... dla każdego slice/Vec/etc. dostęp. Bo właśnie to musisz zrobić, aby sprawdzać granice podczas kompilacji. Potrzebne jest zasadniczo pisanie zależne. Oprócz ewentualnego dokonywania sprawdzenia typu nierozstrzygalnego (i otrzymania programu do sprawdzenia typu znacznie trudniejszego), wnioskowanie typu staje się w ogóle niemożliwe (i znacznie bardziej ograniczone w najlepszym przypadku), typy stają się znacznie bardziej skomplikowane i bardziej rozwlekłe, a złożoność język znacząco się zwiększa. Wskaźniki te są w granicach, które można udowodnić tylko bez znaczącego dodatkowego wysiłku programisty w bardzo prostych okolicznościach.

Ponadto istnieje niewielka zachęta do pozbycia się kontroli granicznych. Żywoty ciągną swoją wagę prawie całkowicie eliminując konieczność zbierania śmieci - co jest ogromną, inwazyjną cechą o nieprzewidywalnych skutkach przepustowości, przestrzeni i opóźnień. Sprawdzanie czasu granicznego w drugiej ręce jest bardzo nieinwazyjne, ma mały i dobrze znany narzut, i może być selektywnie wyłączone w sekcjach o krytycznym znaczeniu, nawet jeśli cała reszta programu używa go w sposób swobodny.

+1

Jest to zasięg sugerujący czasy działania sprawdzanie granic jest "bardzo nieinwazyjne". Wpływ będzie związany ze złożonością algorytmów działających na macierzy. W przypadku miar, takich jak czas działania, zasadniczo dodawanie sprawdzania granic dla każdego dostępu do tablicy jest stałym mnożnikiem. – Rob

+0

@Rob Stały współczynnik czasu działania jakiejś operacji nigdy nie zmienia złożoności algorytmu. Może to mieć bardzo niedopuszczalny wpływ na (nie-asymptotyczny) czas działania. Ale * tak jak powiedziałem *, dla każdego dostępu do pojedynczej macierzy programista może zrezygnować z sprawdzania granic, a jeśli tak, to wydajność jest równoważna C. Sprawdzanie granic nie ma wpływu na żadną część programu, który jej nie używa. I * to * jest tym, co rozumiem przez nieinwazyjne (wspominam o wpływie wydajności na inne miejsce w tym samym zdaniu). – delnan

+1

Nie sugerowałem żadnej zmiany złożoności algorytmu. Możliwość zrezygnowania z funkcji środowiska wykonawczego nie powoduje, że jest ona nieinwazyjna. – Rob

Powiązane problemy