2015-02-08 14 views
8

Okuma basic introduction:Rust, derleme zamanında diğer denetimler gerçekleştiğinde çalışma zamanı sınırlarını neden sınırlar?

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.

Neden birçok diğer kontroller derleme zamanında meydana görünüyor zaman, zamanında Pas onay dizi sınırları nedir?

+0

olası yinelemesi [Neden Rust derleyicisi dizin dışı sınırlara izin veriyor?] (Http://stackoverflow.com/questions/24898579/why-does-rust-compiler-allow-index-out-of-bounds) – Shepmaster

cevap

17

Derleme zamanında dizinleri kontrol etmek mümkün olmadığından. Rastgele değişkenlerin muhtemel değerleri üzerine düşünmek, küçük programlar için bile zor ve imkansız arasında bir yerdedir. her için ...

  1. resmen endeks sınırların dışında olamayacağını kanıtlamak ve tipi sisteminin

içine

  • kodlamak olduğunun kanıtıdır: Kimse zorunda istiyor dilim/Vec/vb. erişim. Çünkü derleme zamanında sınır denetimleri yapmak için yapmanız gereken budur. Esasen bağımlı yazım gerekiyor. Muhtemelen tip kontrolü kararsız hale getirmenin yanı sıra (ve bir programın çok daha zorlu bir şekilde yazılmasını sağlama), türün çıkarımı genel olarak imkansız hale gelir (ve en iyi durumda çok daha kısıtlı), türler çok daha karmaşık ve endişeli olur ve karmaşıklığı dil önemli ölçüde artmaktadır. Bu endeksler sınırlıdır, ancak çok basit durumlarda önemli ek programcı çabaları olmadan kanıtlanabilir. Ayrıca, sınır kontrollerinden kurtulmak için çok az teşvik vardır. Yaşam süreleri, çöp toplama ihtiyacını neredeyse tamamen ortadan kaldırarak ağırlıklarını çekmektedir - bu, öngörülemeyen iş hacmi, uzam ve gecikme etkileri olan devasa, istilacı bir özelliktir. Öte yandan, çalışma zamanı sınırları çok invaziv değildir, küçük ve iyi bilinen bir ek yüke sahiptir ve programın geri kalanı serbestçe kullansa bile performans açısından kritik bölümlerde seçici olarak kapatılabilir.

  • +1

    Çalışma sürelerini önermek için bir sınırdır, kontrol "çok non-invaziv" dir. Etki, dizi üzerinde çalışan algoritmaların karmaşıklığı ile ilişkili olacaktır. Çalışma zamanı gibi ölçüler için, esasen her bir dizi erişiminde sınır denetimi eklemek, sabit bir çarpandır. – Rob

    +0

    @Rob Bazı işlemlerin çalışma süresinde sabit bir faktör, algoritma karmaşıklığını hiçbir zaman değiştirmez. (Asimptotik olmayan) çalışma süresinde kabul edilemez etkilere sahip olabilir. Fakat * dediğim gibi *, herhangi bir bireysel dizi erişimi için programcının sınır kontrolünü devre dışı bırakabilir ve eğer yaparlarsa, performans C'ye eşdeğerdir. Sınırları kontrol etme, kullanmayan programın herhangi bir bölümünü etkilemez. Ve * bu ben non-invaziv (ben aynı cümle içinde başka bir yerde performans etkisi bahsediyorum) ne demek olduğunu. – delnan

    +1

    Ben herhangi bir algoritma karmaşıklığı herhangi bir değişiklik olacağını ileri sürmedim. Bir çalışma zamanı özelliğinden çıkabilmek, onu non-invaziv hale getirmez. – Rob

    İlgili konular