C # में अप्रबंधित सुरक्षित कोड का उपयोग क्यों न करें


10

अनियंत्रित कोड को निष्पादित करने के लिए C # में एक विकल्प है। यह आमतौर पर ऐसा करने की सलाह नहीं दी जाती है, क्योंकि प्रबंधित कोड बहुत अधिक सुरक्षित है और यह बहुत सारी समस्याओं को खत्म करता है।

हालाँकि मैं सोच रहा हूँ, अगर आपको यकीन है कि आपका कोड त्रुटियों का कारण नहीं होगा, और आप जानते हैं कि स्मृति को कैसे संभालना है तो (यदि आपको तेज़ कोड पसंद है) सामान्य सलाह का पालन करें?

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

अब मैं सामान्य रूप से आश्चर्यचकित करता हूं, अगर आपको यकीन है कि आपके पास मेमोरी लीक या क्रैश का जोखिम नहीं है, तो अनवांटेड कोड का अधिक बार उपयोग क्यों न करें?

पीएस मेरी पृष्ठभूमि: मैं थोड़े इस प्रोग्रामिंग दुनिया में लुढ़का और मैं अकेले काम करता हूं (मैं ऐसा कुछ सालों तक करता हूं) और इसलिए मुझे उम्मीद है कि यह सॉफ्टवेयर डिजाइन सवाल अजीब नहीं है। मेरे पास वास्तव में ऐसे लोगों से पूछने के लिए अन्य लोगों की तरह नहीं है।


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

14
मैंने वर्षों में बहुत सारे कोड लिखे हैं जो कभी-कभी दुर्घटनाग्रस्त हो जाते हैं या मेमोरी लीक होते हैं, मुझे यकीन है कि मेमोरी लीक या क्रैश के जोखिम नहीं थे।
whatsisname

1
यहाँ एक अच्छा unsafeउपयोग-केस उदाहरण है: stackoverflow.com/q/11660127/102937
रॉबर्ट हार्वे

3
मुझे लगता है कि आपके बिटमैप कोड में अभी भी कीड़े हैं, लेकिन आपने अभी उनका पता नहीं लगाया है। और यहां तक ​​कि अगर यह मामला नहीं है, तब तक प्रतीक्षा करें जब तक आपको मौजूदा कोड में कुछ नई आवश्यकताओं को लागू नहीं करना है।
डॉक्टर ब्राउन

1
क्योंकि यहां तक ​​कि जब आप सुनिश्चित हैं कि आपके कोड त्रुटियों का कारण नहीं होगा यह अभी भी त्रुटियों का कारण बनता है।
user253751

जवाबों:


27

खैर, यह ज्यादातर उम्रदराज कहावत का मामला है

  • अनुकूलन मत करो
  • (केवल विशेषज्ञों के लिए) अभी तक अनुकूलन न करें

लेकिन वास्तव में मैं असुरक्षित कोड से बचने के लिए तीन मुख्य कारण सोच सकता हूं।

  1. कीड़े : आपके प्रश्न का महत्वपूर्ण हिस्सा "यदि आप सुनिश्चित हैं कि आपका कोड त्रुटियों का कारण नहीं होगा"। खैर, आप पूरी तरह से कैसे सुनिश्चित हो सकते हैं? क्या आपने औपचारिक विधि के साथ एक नीतिवचन का उपयोग किया है जो आपके कोड की गारंटी देता है? प्रोग्रामिंग में एक बात निश्चित है, और वह यह है कि आपके पास कीड़े होंगे। जब आप कोई सुरक्षा हटाते हैं, तो आप नए प्रकार के बगों को रेंगने की अनुमति देते हैं। जब आप कचरा संग्रहकर्ता को आपके लिए मेमोरी का ख्याल रखने देते हैं, तो बहुत सारी समस्या दूर हो जाती है।

  2. हमेशा उतना तेज़ नहीं जितना आप सोचते हैं : दूसरा बिंदु यह है: समस्या के आधार पर, लाभ उतना महान नहीं हो सकता है। हालाँकि मैं उन्हें अभी ढूंढ नहीं पा रहा हूँ, मुझे Google द्वारा जावा, स्काला, गो और सी ++ की गति की तुलना में एक अध्ययन याद है। एक बार जमीन के लिए अनुकूलित, बेशक सी ++ बहुत तेज था। लेकिन "मुहावरेदार" तरीके से प्रोग्राम किए गए एल्गोरिदम वास्तव में बहुत तेज़ नहीं थे। इस अर्थ में कि वे मानक संरचना और मुहावरों का उपयोग कर रहे थे (stl कंटेनर, कोई अनियंत्रित लूप, आदि)। Microsoft ने C # और C ++ के साथ एक समान प्रयोग किया। Microsoft के शीर्ष इंजीनियर में से एक रेमंड चेन को C # को हराकर std :: string का अपना कार्यान्वयन लिखना था। (देखें: http://www.codinghorror.com/blog/2005/05/on-managed-code-performance-again.html) बहुत कम प्रयास के लिए, आपको प्रबंधित कोड में बहुत अच्छा प्रदर्शन मिला, इसलिए अक्सर यह परेशानी के लायक नहीं है।

  3. पुन : प्रयोज्य : असुरक्षित कोड का उपयोग केवल एक पूर्ण विश्वास वातावरण में किया जा सकता है। उदाहरण के लिए, ASP.NET सर्वर में, आप आमतौर पर असुरक्षित कोड का उपयोग नहीं कर सकते हैं, क्योंकि बफर अतिप्रवाह द्वारा भेद्यता का परिचय देना बहुत आसान होगा। एक और उदाहरण क्लिकोन होगा। या यदि आपका एप्लिकेशन नेटवर्क साझा से एक्सेस किया गया था। इसलिए यदि आप विभिन्न प्रकार के परिनियोजन परिदृश्य में अपने कोड का उपयोग करने की योजना बनाते हैं, तो असुरक्षित कोड गेम से बाहर है।

इसलिए मूल रूप से: इसका दोष इस पर पड़ा क्योंकि यह अनावश्यक बग का परिचय दे सकता है, यह अच्छी तरह से बिना किसी लाभ के हो सकता है, और यह आपके कोड की पुन: प्रयोज्य को कम करता है।

लेकिन अगर आपके परिदृश्य को वास्तव में प्रदर्शन के लिए इसकी आवश्यकता होती है (और आपके पास इसे साबित करने के लिए डेटा है), तो आप एक अनुभवी प्रोग्रामर हैं जो जानते हैं कि स्मृति को कैसे संभालना है और आपके कोड को नियंत्रित वातावरण में उपयोग किया जाएगा, फिर सुनिश्चित करें, इसके लिए जाएं।


4

एक तरह से, अप्रबंधित कोड भुगतान का एक रूप है: आप अतिरिक्त विकास प्रयास के साथ तेजी से निष्पादन खरीदते हैं। वास्तव में, अप्रबंधित कोड को विकसित करने, डिबग करने और बनाए रखने के लिए अधिक समय की आवश्यकता होती है। इसे सही तरीके से प्राप्त करना अधिकांश प्रतिभागियों के लिए एक चुनौती है। एक तरह से, इस विधानसभा में प्रोग्रामिंग के समान है: यकीन है, आप और अधिक शक्ति बाहर अपने CPU के लिए यदि आप विधानसभा में लिखने निचोड़ कर सकते हैं * , लेकिन आप एक बहुत अधिक प्रयास "खर्च" में ऐसा कर रहे।

कभी-कभी, विकास के समय का अंतर बहुत महत्वपूर्ण होता है - घंटों के बजाय दिन। हालांकि, निष्पादन की गति में अंतर लगभग नाटकीय नहीं है। यही कारण है कि अप्रबंधित कोड का विकास आपके पोस्ट में वर्णित एक जैसी स्थितियों के लिए आरक्षित है - स्थानीयकृत, स्व-निहित, संसाधन-भूख ​​एल्गोरिदम के कार्यान्वयन, जैसे ऑडियो और वीडियो प्रसंस्करण।

अनिवार्य रूप से, आपके प्रश्न का उत्तर इस बात के उत्तर के समान है कि हर कोई फेरारी क्यों नहीं चलाता: यह बहुत बेहतर कार है, है ना? (अन) सौभाग्य से, हर कोई इसे बर्दाश्त नहीं कर सकता।


* कंपाइलर्स में ऑप्टिमाइज़ेशन तकनीक में पिछले कुछ दशकों की प्रगति ने इस अंतर को इतना कम कर दिया है कि अब यह एक निश्चित शर्त नहीं है, हालाँकि।


0

क्योंकि गणितीय अर्थ में शुद्धता या किसी अन्य बाधा के बारे में "सुनिश्चित" होना (यानी आपके पास प्रमाण है) साम्राज्यवादी भाषाओं के लिए एक बहुत ही कठिन समस्या है। कार्यक्रमों में अक्सर राज्यों की इतनी अधिक संख्या होती है कि प्रत्येक संभावित राज्य की जाँच के साथ भी उन्हें सत्यापित करना संभव नहीं होता है। और एक रचनात्मक प्रमाण बनाना कुछ ऐसा नहीं है जिसे आप स्वचालित कर सकते हैं।

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


1
मुझे नहीं लगता कि इसका सही या सादगी से कोई लेना देना है ..
जिमी हॉफ

किसी ने भी शुद्धता के औपचारिक प्रमाण के बारे में बात नहीं की।

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

1
मुझे ऐसा कोई सवाल नहीं दिखता। यह प्रश्न, जैसा कि मैंने इसे पढ़ा है, इस बारे में है कि प्रबंधित दुनिया से बचने की हैच का उपयोग अधिक बार क्यों नहीं किया जाना चाहिए / (इसका मतलब है कि प्रबंधित कोड को डिफ़ॉल्ट बनाना अर्थपूर्ण है)। किसी भी मामले में, यदि आप उस प्रश्न का उत्तर देना चाहते हैं (शुद्धता को सुनिश्चित करने की कठोरता को इंगित करके), तो आप पूर्णता के पूर्ण, औपचारिक आश्वासन के बारे में बात किए बिना ऐसा कर सकते हैं । अब तक आपका उत्तर पूरी तरह से पूरी तरह से घूमता है, अनिवार्य भाषाओं के लिए शुद्धता के ध्वनि प्रमाण। लेकिन यह ओवरकिल है, और मुझे लगता है कि प्रबंधित C # के बारे में प्रमाण समान रूप से (या लगभग) कठिन हैं।

1
@ मछली: मैं देख सकता हूँ कि आप क्या कह रहे हैं। वहाँ कुछ के बीच संबंध साबित करने के लिए कठिन हो रहा है और कुछ के बारे में कारण के लिए मुश्किल हो रहा है। अगर सही साबित करना मुश्किल है, तो यह बहुत मुश्किल है कि यह सही है।
माइकल शॉ

0

संक्षेप में, C ++ वातावरण में आपके प्रोग्राम के बिट्स और बोल्ट्स को काम करने और प्रबंधित करने में कुछ भी आपको रोकता नहीं है। जैसा कि आपको पूरा यकीन है कि आप कचरा संग्रहण के बिना सभी मेमोरी हुप्स और लीक को सही ढंग से प्रबंधित कर सकते हैं, फिर सी ++ में ऐसा करने के लिए आपका स्वागत है। :)

इसके विपरीत, C # के पास .NET फ्रेमवर्क में सुरक्षित रूप से चलाने के लिए सुरक्षित / प्रबंधित और दृढ़ता से टाइप किए गए विकास वातावरण प्रदान करने के फायदे हैं।

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

इस प्रकार, 4.0 से शुरू होने वाले .NET फ्रेमवर्क में संयुक्त राष्ट्र के प्रबंधित कोड के साथ काम करने का विकल्प किनारे के मामलों के लिए एक विकल्प है जब आप सुनिश्चित करते हैं कि यह आपको इसका उपयोग नहीं करने पर लाभ प्राप्त कर सकता है ...


Aha thats दिलचस्प है कि आप देख रहे हैं कि मैं माइक्रो कंट्रोलर दुनिया से हूँ और वहाँ एक आम तौर पर सभ्य सी ++ लिखता है, त्रुटि के लिए बहुत कम जगह है और सॉफ्टवेयर का अच्छा अच्छा डिज़ाइन करने के लिए महत्वपूर्ण चीज है
user613326
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.