8

पढ़ना basic introduction:रस्ट रनटाइम पर सरणी सीमाओं को क्यों चेक करता है, जब (अधिकतर) अन्य चेक संकलन समय पर होते हैं?

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.

क्यों जब ऐसा लगता है कि अधिकांश अन्य चेक के संकलन समय पर पाए जाते हैं, कार्यावधि में जंग की जांच सरणी सीमा करता है?

+0

संभावित डुप्लिकेट [जंग प्रतिरोधक इंडेक्स को सीमाओं से बाहर क्यों अनुमति देता है?] (Http://stackoverflow.com/questions/24898579/why-does-rust-compiler-allow-index-out-of-bounds) – Shepmaster

उत्तर

17

क्योंकि संकलन समय पर सूचकांक की जांच करना संभव नहीं है। मनमानी चर के संभावित मूल्यों के बारे में तर्क छोटे कार्यक्रमों के लिए भी मुश्किल और असंभव के बीच कहीं है।

  1. औपचारिक रूप से साबित होता है कि सूचकांक सीमा से बाहर नहीं किया जा सकता और हर एक के लिए,
  2. एनकोड प्रकार प्रणाली

में है कि सबूत ...: कोई नहीं है करने के लिए करना चाहता है टुकड़ा/वीइसी/आदि। पहुंच। क्योंकि संकलन समय पर सीमा शुल्क करने के लिए आपको यही करना होगा। आपको अनिवार्य रूप से निर्भर टाइपिंग की आवश्यकता है। संभावित रूप से टाइपिंग की जांच करने के अलावा अनिश्चित (और एक प्रोग्राम को बहुत कठिन टाइप करने के लिए प्रोग्राम प्राप्त करना), सामान्य रूप से अनुमान सामान्य रूप से असंभव हो जाता है (और सबसे अच्छे मामले में कहीं अधिक प्रतिबंधित), प्रकार अधिक जटिल और शब्दशः, और जटिलता प्राप्त करते हैं भाषा में काफी वृद्धि हुई है। यह सूचकांक सीमाओं में हैं केवल बहुत ही सरल परिस्थितियों में महत्वपूर्ण अतिरिक्त प्रोग्रामर प्रयास किए बिना सिद्ध किए जा सकते हैं।

इसके अलावा, सीमा शुल्क से छुटकारा पाने के लिए थोड़ा प्रोत्साहन है। लाइफटाइम कचरा संग्रह की आवश्यकता को लगभग पूरी तरह खत्म कर अपना वजन खींचते हैं --- जो अप्रत्याशित थ्रूपुट, अंतरिक्ष और विलंबता प्रभावों के साथ एक विशाल, आक्रामक विशेषता है। दूसरी ओर चलने वाली रन-टाइम सीमाएं बहुत ही गैर-आक्रामक हैं, उनके पास एक छोटा और प्रसिद्ध ओवरहेड है, और प्रदर्शन के महत्वपूर्ण वर्गों में चुनिंदा रूप से बंद किया जा सकता है भले ही पूरे कार्यक्रम का उदारतापूर्वक इसका उपयोग किया जाए।

+1

यह रन करने के लिए एक पहुंच है कि रन टाइम सीमा जांच "बहुत गैर-आक्रामक" है। प्रभाव सरणी पर काम कर रहे एल्गोरिदम की जटिलता से संबंधित होगा। रन टाइम जैसे उपायों के लिए, अनिवार्य रूप से प्रत्येक सरणी एक्सेस पर एक सीमा जांच जोड़ना निरंतर गुणक होता है। – Rob

+0

@Rob कुछ ऑपरेशन के चलने वाले समय पर एक निरंतर कारक कभी भी एल्गोरिदम जटिलता को नहीं बदलता है। यह (गैर-एसिम्प्टोटिक) चलने वाले समय में अस्वीकार्य प्रभाव हो सकता है। लेकिन * जैसा कि मैंने कहा *, किसी भी व्यक्तिगत सरणी के लिए प्रोग्रामर सीमाओं की जांच से बाहर निकल सकता है, और यदि वे करते हैं, तो प्रदर्शन सी के बराबर है। बाउंड्स जांच प्रोग्राम के किसी भी हिस्से को प्रभावित नहीं करती है जो इसका उपयोग नहीं करती है। और * वह * मेरा मतलब गैर-आक्रामक द्वारा है (मैं उसी वाक्य में कहीं और प्रदर्शन प्रभाव का उल्लेख करता हूं।) – delnan

+1

मैंने सुझाव नहीं दिया कि एल्गोरिदम जटिलता में कोई बदलाव आएगा। रनटाइम फीचर से ऑप्ट आउट करने में सक्षम होने से यह गैर-आक्रामक नहीं बनता है। – Rob

संबंधित मुद्दे