एक प्रकार की प्रणाली के सुरक्षा लाभ क्या हैं?


47

में जावास्क्रिप्ट: The Good पार्ट्स डगलस Crockford द्वारा, वह अपने विरासत अध्याय में उल्लेख है,

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

तो सबसे पहले, वास्तव में सुरक्षा क्या है? डेटा भ्रष्टाचार, या हैकर्स, या सिस्टम की खराबी, आदि के खिलाफ सुरक्षा?

एक प्रकार की प्रणाली के सुरक्षा लाभ क्या हैं? एक प्रकार की प्रणाली क्या अलग बनाती है जो इसे इन सुरक्षा लाभों को प्रदान करने की अनुमति देती है?


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

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

4
@BenjaminGruenbaum क्या आप का वर्णन पहले से ही OCaml जैसी भाषाओं में मौजूद है। इसे संरचनात्मक टाइपिंग कहा जाता है, यह वास्तव में काफी पुराना है, नाममात्र टाइपिंग नया है।
जोजफग

2
@BenjaminGruenbaum: ... क्या !? यह स्पष्ट रूप से वैधानिक रूप से टाइप की जाने वाली भाषाओं में अपरिहार्य नहीं है , अन्यथा उन भाषाओं के लिए एक कंपाइलर लिखना असंभव होगा।
ब्लूराजा - डैनी पफ्लुगुफ़ेक्ट

6
@BenjaminGruenbaum: आपकी टिप्पणी मूल्यवान हैं, और है कि कागज दिलचस्प है, लेकिन यह अपने दावे कि "यह आम तौर पर भी जावा की तरह स्थिर भाषाओं में अनिर्णनीय है", क्योंकि यह दर्शाता है कि इसे बाहर वहन नहीं करती है सी # में डिसाइडेबल, और पत्तियों सवाल खोलने क्या यह जावा में अपरिहार्य है। (और वैसे भी, IME, जब एक स्टेटिक-टाइप की गई भाषा के लिए कंपाइलर यह तय नहीं कर सकता है कि कोई चीज़ अच्छी तरह से टाइप की गई है, तो वह इसे अस्वीकार कर देता है (या इसे कंपाइल करने में विफल रहता है), इसलिए टाइप में छेद के बजाय अनिर्वायता एक झुंझलाहट है- सुरक्षा।)
रुख

जवाबों:


82

टाइप सिस्टम त्रुटियों को रोकते हैं

टाइप सिस्टम अवैध कार्यक्रमों को समाप्त करता है। निम्नलिखित पायथन कोड पर विचार करें।

 a = 'foo'
 b = True
 c = a / b

पायथन में, यह कार्यक्रम विफल रहता है; यह एक अपवाद फेंकता है। जावा, C #, हास्केल जैसी भाषा में , जो भी हो, यह एक कानूनी कार्यक्रम भी नहीं है। आप इन त्रुटियों से पूरी तरह से बचते हैं क्योंकि वे केवल इनपुट कार्यक्रमों के सेट में संभव नहीं हैं।

इसी तरह, एक बेहतर प्रकार की प्रणाली अधिक त्रुटियों को नियंत्रित करती है। अगर हम सुपर एडवांस टाइप सिस्टम पर कूदते हैं तो हम इस तरह की बातें कह सकते हैं:

 Definition divide x (y : {x : integer | x /= 0}) = x / y

अब टाइप सिस्टम गारंटी देता है कि कोई भी विभाजन-दर-० त्रुटियां नहीं हैं।

किस तरह की त्रुटियां

यहां एक संक्षिप्त सूची दी गई है कि सिस्टम किस प्रकार की त्रुटियों को रोक सकते हैं

  1. आउट-ऑफ-रेंज त्रुटियों
  2. एसक्यूएल इंजेक्षन
  3. 2 को सामान्य बनाना, कई सुरक्षा समस्याएं ( पर्ल में कौन सी दागी जाँच है )
  4. अनुक्रम की त्रुटियां
  5. उपयोग किए जाने वाले मूल्यों का सबसेट मजबूर करना (उदाहरण के लिए, केवल 0 से अधिक पूर्णांक)
  6. नापाक बिल्ली के बच्चे (हां, यह एक मजाक था)
  7. हानि-सटीक परिशुद्धता
  8. सॉफ़्टवेयर ट्रांसेक्शनल मेमोरी (STM) त्रुटियां (इसके लिए शुद्धता की आवश्यकता होती है, जिसमें भी प्रकार की आवश्यकता होती है)
  9. 8 को सामान्य बनाना, दुष्प्रभावों को नियंत्रित करना
  10. डेटा संरचनाओं पर आक्रमणकारी (क्या एक द्विआधारी पेड़ संतुलित है?)
  11. एक अपवाद को भूल जाना या गलत को फेंक देना

और याद रखें, यह संकलन के समय भी है । केवल टाइप त्रुटियों के लिए जाँच करने के लिए 100% कोड कवरेज के साथ परीक्षण लिखने की आवश्यकता नहीं है, संकलक सिर्फ आपके लिए करता है :)

केस स्टडी: टाइप्ड लैंबडा कैलकुलस

ठीक है, चलो सभी प्रकार की सरलतम प्रणालियों की जांच करते हैं, बस टाइप किए गए लैम्ब्डा कैलकुलस

मूल रूप से दो प्रकार के होते हैं,

Type = Unit | Type -> Type

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

इस बारे में सोचें, हम ग्वारेंटी के लिए टाइप सिस्टम का उपयोग कर सकते हैं कि हमारा प्रोग्राम हमेशा के लिए लूप नहीं करता है, बल्कि सही है?

गतिशील प्रकारों में खोजें

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

इसलिए डायनामिक प्रकार कुछ कार्यक्रमों को खारिज नहीं करते हैं, बल्कि विकृत कार्यक्रमों को विकृत कार्य करते हैं, जैसे अपवादों को फेंकना।

TLDR

तो यह लंबे और छोटे, यह है कि सिस्टम कुछ कार्यक्रमों को नियंत्रित करता है। कई कार्यक्रमों को किसी तरह से तोड़ दिया जाता है, इसलिए, प्रकार सिस्टम के साथ हम इन टूटे हुए कार्यक्रमों से बचते हैं।


25
बहुत सारे परीक्षण लिखने के बराबर संकलन के लिए +1।
दान नीली

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

3
यदि आपके प्रकार की प्रणाली ने साबित कर दिया है कि आपका कार्यक्रम समाप्त होना चाहिए, तो यह (शायद) यह साबित करके किया गया है कि यह एक आदिम-पुनरावर्ती फ़ंक्शन की गणना कर रहा है। जो शांत है मुझे लगता है, लेकिन उससे भी कम दिलचस्प जटिलता वर्ग है जो एक सच्ची ट्यूरिंग मशीन हल कर सकती है। (इसका मतलब यह नहीं है कि मध्यवर्ती मूल्य बड़े नहीं हैं; एकरमन फ़ंक्शन आदिम-पुनरावर्ती है ...)
डोनल फैलो

5
@DonalFellows एकरमन फ़ंक्शन आदिम पुनरावर्ती नहीं है, हालांकि यह कुल कम्प्यूटेशनल फ़ंक्शन है।
तैमून

4
@sacundim बिल्कुल, एग्डा जैसी भाषाएं वैकल्पिक समग्रता जाँच के लिए अनुमति देती हैं और दुर्लभ मामलों में जहाँ आप मनमाने ढंग से पुनरावृत्ति नहीं चाहते हैं, आप इसे अच्छी तरह से पूछ सकते हैं, यह काफी चालाक प्रणाली है।
जोजफग

17

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

एक प्रकार की प्रणाली में, अलग-अलग इकाइयों में व्यक्त की गई दो लंबाई जोड़ने से या तो कोई त्रुटि हुई होगी या स्वत: कलाकारों का कारण होगा।


15

एक प्रकार की प्रणाली आपको सरल कोडिंग त्रुटियों से बचने में मदद करती है, या बल्कि कंपाइलर आपके लिए उन त्रुटियों को पकड़ने की अनुमति देता है।

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

if (someRareCondition)
     a = 1
else
     a = {1, 2, 3}

// 10 lines below
k = a.length

जबकि एक दृढ़ता से टाइप की गई भाषा आपको स्पष्ट रूप aसे यह बताने के लिए मजबूर करेगी कि एक सरणी है और आपको पूर्णांक निर्दिष्ट नहीं करने देगी। इस तरह, वहाँ कोई मौका aनहीं है length- भी दुर्लभ मामलों में नहीं होगा ।


5
और WebStorm जावास्क्रिप्ट की तरह एक IDE में एक चतुर लाइनर "संख्या के लिए संभव आवृत्ति के लिए अपरिभाषित संदर्भ" कह सकता है। यह एक स्पष्ट प्रकार प्रणाली होने से हमें नहीं दिया गया है।
बेंजामिन ग्रुएनबाउम

4
1. सांख्यिकीय रूप से दृढ़ता से नहीं। @BenjaminGruenbaum हां, लेकिन यह पृष्ठभूमि में असाइनमेंट के एक ग्राफ का पीछा करते हुए किया जाता है, इसे एक मिनी दुभाषिया की तरह समझें जहां चीजें जा रही हैं। जब आप इसे मुफ्त में देते हैं तो उससे भी ज्यादा कठिन
jozefg

6
@BenjaminGruenbaum: मजबूत / कमजोर के साथ निहित / स्पष्ट भ्रमित न करें। हास्केल, उदाहरण के लिए, एक अविश्वसनीय रूप से मजबूत प्रकार की प्रणाली है जो शर्म करने के लिए अधिकांश अन्य भाषाओं को डालती है, लेकिन कुछ निश्चित भाषा डिजाइन निर्णयों के कारण यह लगभग पूरी तरह से सार्वभौमिक प्रकार के आविष्कार में भी सक्षम है, अनिवार्य रूप से इसे स्पष्ट रूप से टाइपिंग के लिए समर्थन के साथ एक मजबूत रूप से टाइप की गई भाषा बना रही है (यह है कि आप का उपयोग करना चाहिए, क्योंकि प्रकार
हीनता

6
"दृढ़ता से टाइप की गई भाषा आपको स्पष्ट रूप से यह बताने के लिए मजबूर करेगी कि एक सरणी है" यह गलत है। अजगर दृढ़ता से टाइप किया गया है और इसकी आवश्यकता नहीं है। यहां तक ​​कि सांख्यिकीय रूप से और दृढ़ता से टाइप की गई भाषाओं के लिए यह आवश्यक नहीं है कि यदि वे टाइप इनफैक्शन (और आजकल की अधिकांश मुख्यधारा की भाषाएं, कम से कम आंशिक रूप से) का समर्थन करती हैं।
कोनराड रुडोल्फ

1
@BenjaminGruenbaum: आह, पर्याप्त निष्पक्ष। फिर भी, ऐसे मामले होंगे जहां कोई भी जेएस स्टैटिक एनालाइजर एक ही तरह की टाइपकास्ट का प्रदर्शन नहीं कर सकता है। हास्केल को लगभग 100% प्रकार की सजा प्राप्त करने के लिए उचित कुछ डिजाइन निर्णय लेने पड़े, और C # / Scala सब कुछ अनुमान नहीं लगा सकता। बेशक, उन मामलों में, इससे कोई फर्क नहीं पड़ता क्योंकि आप केवल स्पष्ट रूप से प्रकार निर्दिष्ट कर सकते हैं - जावास्क्रिप्ट में, इसका मतलब यह है कि सबसे अच्छा स्थिर विश्लेषक अब आपके कोड की जांच नहीं कर सकता है।
फ़ॉसी

5

सॉफ्टवेयर विकास चक्र में पहले आप एक त्रुटि पकड़ सकते हैं, इसे ठीक करना जितना कम खर्चीला होगा। एक त्रुटि पर विचार करें जिसके कारण आपका सबसे बड़ा ग्राहक, या आपके सभी ग्राहक डेटा खो देते हैं। इस तरह की त्रुटि आपकी कंपनी का अंत हो सकती है यदि यह वास्तविक ग्राहकों द्वारा डेटा खो जाने के बाद ही पकड़ा जाता है! उत्पादन के लिए आगे बढ़ने से पहले इस बग को खोजना और ठीक करना बहुत कम खर्चीला है ।

यहां तक ​​कि कम खर्चीली त्रुटियों के लिए, अधिक समय और ऊर्जा खर्च की जाती है यदि परीक्षक की तुलना में इसमें शामिल हैं यदि प्रोग्रामर इसे ढूंढ और ठीक कर सकते हैं। यह सस्ता है अगर यह स्रोत नियंत्रण में नहीं मिलता है जहां अन्य प्रोग्रामर उस पर निर्भर होने वाले सॉफ़्टवेयर का निर्माण कर सकते हैं। प्रकार सुरक्षा त्रुटियों के कुछ वर्गों को भी संकलित करने से रोकती है, इस प्रकार उन त्रुटियों की लगभग पूरी संभावित लागत को समाप्त कर देती है।

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

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


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

@MattFenwick आपको क्या लगता है कि डायनामिक टाइपिंग के प्राथमिक लाभ क्या हैं?
ग्लेनपेटर्सन

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

4

परिचय

टाइप सेफ्टी (टाइप, स्टैटिक टाइप चेकिंग) और / या रनटाइम (मूल्यांकित, डायनामिक टाइप चेकिंग) भाषाओं के साथ टाइप सेफ्टी हासिल की जा सकती है। विकिपीडिया के अनुसार a ... ... मजबूत प्रकार की प्रणाली को एक के रूप में वर्णित किया गया है जिसमें अनियंत्रित रनटाइम प्रकार त्रुटि (एड लुका कार्डेली) की संभावना नहीं है। अन्य लेखन में, अनियंत्रित रन-टाइम त्रुटियों की अनुपस्थिति को सुरक्षा या प्रकार की सुरक्षा के रूप में संदर्भित किया जाता है ... '

सुरक्षा - स्टेटिक प्रकार की जाँच

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

स्टेटिक टाइपिंग पूरी तरह से सुरक्षित नहीं है , लेकिन सुरक्षा को बढ़ाता है । यहां तक ​​कि सांख्यिकीय रूप से टाइप किए गए सिस्टम में भयावह परिणाम हो सकते हैं। कई विशेषज्ञ मानते हैं कि सांख्यिकीय रूप से टाइप किए जाने का उपयोग अधिक मजबूत और कम त्रुटि-प्रवण (मिशन क्रिटिकल) सिस्टम लिखने के लिए किया जा सकता है।

स्थिर टाइप भाषाओं कर सकते हैं डेटा या संख्यात्मक काम में सटीकता की हानि की हानि के जोखिम को कम करने के लिए, कि गलत मिलान या तैरने लगते हैं या गलत मिलान अभिन्न और नाव प्रकार के लिए डबल छोटा के कारण हो सकता मदद करते हैं।

दक्षता और निष्पादन की गति के लिए सांख्यिकीय रूप से टाइप की गई भाषाओं का उपयोग करने में एक फायदा है। निष्पादन के दौरान प्रकार निर्धारित नहीं करने से रनटाइम लाभ होता है।

सुरक्षा - रनटाइम प्रकार की जाँच

उदाहरण के लिए, Erlang एक प्रकार की घोषणात्मक, गतिशील रूप से टाइप की गई भाषा है जो एक आभासी मशीन पर चलती है। Erlang कोड को बाइट संकलित किया जा सकता है। एर्लैंग को शायद सबसे महत्वपूर्ण मिशन-महत्वपूर्ण, गलती सहिष्णु भाषा उपलब्ध माना जाता है, और यह बताया गया है कि एर्लैंग में नौ 9 की विश्वसनीयता (99.9999999% या प्रति वर्ष 31.5 मिसे से अधिक नहीं) है।

कुछ भाषाएँ, जैसे कि कॉमन लिस्प, सांख्यिकीय रूप से टाइप नहीं की जाती हैं, लेकिन यदि वांछित है तो गति और दक्षता में सुधार करने में मदद करने वाले प्रकार घोषित किए जा सकते हैं। यह भी ध्यान दिया जाना चाहिए कि कई अधिक व्यापक रूप से इस्तेमाल की जाने वाली व्याख्या की गई भाषाएं, जैसे कि पायथन, हैं, मूल्यांकन लूप के नीचे, सी-सी ++ जैसी सांख्यिकीय रूप से टाइप की गई भाषाओं में लिखा गया है। ऊपर दिए गए परिभाषा के अनुसार कमोम लिस्प और पायथन दोनों को सुरक्षित माना जाता है।


2
मुझे "जोरदार टाइप्ड" पर आपत्ति है। आपका मतलब स्टैटिकली टाइप्ड है। जोरदार प्रकार बहुत ज्यादा कोई मतलब नहीं रखता है, यह मूल रूप से "मुझे इस प्रकार की प्रणाली पसंद है" कहने के लिए प्रयोग किया जाता है
जोज़फग

@ jozefg अच्छी बात है। मैं पद में संशोधन करूंगा।
असिमलैब्स

3
यह व्याख्या की गई भाषा कहने के लिए भी उपयोगी नहीं है ... एक भाषा कार्यान्वयन के बारे में हाँ, लेकिन भाषा ही नहीं। किसी भी भाषा की व्याख्या या संकलन किया जा सकता है। और एडिट होने के बाद भी आप शब्दों को मजबूत और कमजोर टाइपिंग का उपयोग कर रहे हैं।
एस्लेइजा

3
@jozefg: मैंने हमेशा सोचा था कि दृढ़ता से टाइप किए जाने का मतलब है कि प्रत्येक मूल्य का एक निश्चित प्रकार (जैसे पूर्णांक, स्ट्रिंग, आदि) है, जबकि कमजोर टाइप का मतलब है कि एक मूल्य को दूसरे प्रकार के मूल्य के लिए ज़ब्त किया जा सकता है, अगर इसे करने के लिए सुविधाजनक माना जाता है। इसलिए। उदाहरण के लिए, पायथन (दृढ़ता से टाइप किया हुआ), 1 + "1"एक अपवाद को फेंकता है, जबकि PHP में (कमजोर रूप से टाइप किया गया) 1 + "1"उत्पादन करता है 2(स्ट्रिंग "1"स्वचालित रूप से पूर्णांक में परिवर्तित हो जाता है 1)।
जियोर्जियो

1
@ उदाहरण के लिए इस तरह की परिभाषा के साथ जॉर्जियो जोरदार टाइप नहीं किया गया है। लेकिन कई मामलों में ऐसा होने का दावा किया जाता है। इन शब्दों का कोई अर्थ नहीं है। मजबूत / कमजोर टाइप की अधिक सटीक परिभाषा है जैसा कि "मुझे पसंद है / इस भाषा को पसंद नहीं है" जैसे जोज़फग कहते हैं।
एस्लेइजा

1

एक प्रकार की प्रणाली के सुरक्षा लाभ खो जाते हैं।

तो सबसे पहले, वास्तव में सुरक्षा क्या है? डेटा भ्रष्टाचार, या हैकर्स, या सिस्टम की खराबी, आदि के खिलाफ सुरक्षा?

एक प्रकार की प्रणाली के सुरक्षा लाभ क्या हैं? एक प्रकार की प्रणाली क्या अलग बनाती है जो इसे इन सुरक्षा लाभों को प्रदान करने की अनुमति देती है?

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

जिस प्रकार के विनिर्देश एक प्रकार के रूप में सांकेतिक शब्दों में बदलना कर सकते हैं, वह भाषा के प्रकार पर निर्भर करता है, या सीधे भाषा के प्रकार पर निर्भर करता है।

सबसे बुनियादी प्रकार का विनिर्देश कार्यों के इनपुट / आउटपुट व्यवहार और फ़ंक्शन बॉडी के अंदर की वैधता के बारे में एक गारंटी है। फ़ंक्शन हेडर पर विचार करें

f : (Int,Int) -> String

एक अच्छा प्रकार सिस्टम यह सुनिश्चित करेगा कि f केवल उन वस्तुओं पर लागू होता है जो मूल्यांकन करते समय Int की एक जोड़ी का उत्पादन करेगा, और गारंटी देता है कि f हमेशा एक स्ट्रिंग का उत्पादन करेगा।

किसी भाषा में कुछ कथन, जैसे अगर-तब ब्लॉक होते हैं, तो इनपुट / आउटपुट व्यवहार नहीं होता है; यहाँ प्रकार प्रणाली गारंटी देती है कि ब्लॉक में प्रत्येक घोषणा या बयान वैध है; यह सही प्रकार की वस्तुओं पर परिचालन लागू होता है। ये गारंटी योग्य हैं।

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

विचार करें

Foo x = new Foo(3,4,5,6);
f((Int)x,(Int)x);

कास्टिंग के कारण, x को एक इंट में बदल दिया जाता है, इसलिए तकनीकी रूप से उपरोक्त प्रकार की जांच होती है; हालाँकि, यह वास्तव में टाइपकास्ट करने के उद्देश्य को पराजित करता है।

एक चीज जो एक अलग और बेहतर प्रकार की प्रणाली बना सकती है, वह यह है कि जब तक बी टाइप नहीं किया जाता है, तब तक ए (एक्स) एक्स को हटा देना है, जब तक कि बी ए का उपप्रकार (या सबोबेज) नहीं है। सिक्योरिटी में थ्योरी को घटाने के सिद्धांत का इस्तेमाल किया गया है। पूर्णांक ओवरफ़्लो / अंडरफ़्लो हमलों की संभावना को दूर करने के लिए।

सारांश

एक प्रकार की प्रणाली एक कार्यक्रम साबित करने का एक तरीका है जो किसी प्रकार के विनिर्देश को पूरा करता है। एक प्रकार की प्रणाली के लाभ, उपयोग की जाने वाली प्रकार की प्रणाली की ताकत पर निर्भर कर सकते हैं।


1

इस प्रकार के सिस्टम केंद्रों के लिए अभी तक उल्लेख नहीं किया गया एक लाभ यह है कि कई कार्यक्रमों को उनके द्वारा लिखे गए से अधिक पढ़ा जाता है, और कई मामलों में एक प्रकार की प्रणाली बहुत सारी जानकारी को एक तरीके से निर्दिष्ट करने की अनुमति दे सकती है जो संक्षिप्त है और आसानी से हो सकती है कोड पढ़ने वाले किसी व्यक्ति द्वारा पचा लिया गया। हालांकि पैरामीटर प्रकार वर्णनात्मक टिप्पणियों की जगह नहीं लेते हैं, ज्यादातर लोग इसे पढ़ने के लिए तेजी से पाएंगे: "अंतर दूरी;" याDistance As Int32पढ़ने के लिए "दूरी एक पूरी संख्या +/- 2147483647 होनी चाहिए"; भिन्न अंशों से असंगत परिणाम प्राप्त हो सकते हैं। "आगे, पैरामीटर प्रकार एक एपीआई के किसी विशेष कार्यान्वयन के बीच के अंतर को कम करने में मदद कर सकते हैं, बनाम क्या कॉल करने वालों पर भरोसा करने के लिए हकदार हैं। उदाहरण के लिए, यदि किसी विशेष जावास्क्रिप्ट के जावास्क्रिप्ट के कार्यान्वयन का उपयोग करता है। एक तरह से जो संख्यात्मक विधि में कोई भी तार मजबूर हैं अपने मानकों, यह स्पष्ट नहीं हो सकता है कॉल इस तरह के व्यवहार पर निर्भर करने की अनुमति है, या यदि एपीआई पराक्रम खराबी के अन्य कार्यान्वयन अगर दिए गए तार या नहीं। एक विधि जिसका पैरामीटर के रूप में निर्दिष्ट किया जाता है के बाद Doubleचाहेंगे यह स्पष्ट करें कि किसी भी स्ट्रिंग मान को पास होने से पहले कॉलर द्वारा ज़ब्त किया जाना चाहिए; एक अधिभार के साथ एक विधि; जो स्वीकार करता है Doubleऔर दूसरा जो स्वीकार करता है;String यह कुछ हद तक स्पष्ट कर देगा कि तार रखने वाले कॉलर्स को उन्हें इस तरह से पारित करने की अनुमति दी जाएगी।


0

तो सबसे पहले, वास्तव में सुरक्षा क्या है? डेटा भ्रष्टाचार, या हैकर्स, या सिस्टम की खराबी, आदि के खिलाफ संरक्षण?

अन्य सभी उत्तर और अधिक। सामान्य तौर पर, "टाइप सेफ्टी" का सीधा मतलब है कि कंपाइलर सफलतापूर्वक संकलित किए गए प्रोग्रामों में से कोई भी टाइप एरर नहीं होगा।

अब, एक प्रकार की त्रुटि क्या है? सिद्धांत रूप में, आप किसी भी अवांछनीय संपत्ति को एक प्रकार की त्रुटि के रूप में निर्दिष्ट कर सकते हैं, और कुछ प्रकार के सिस्टम सांख्यिकीय रूप से यह सुनिश्चित करने में सक्षम होंगे कि किसी भी कार्यक्रम में ऐसी कोई त्रुटि नहीं है।

उपरोक्त "संपत्ति" से, मेरा मतलब है कि कुछ प्रकार के तार्किक प्रस्ताव जो आपके कार्यक्रम पर लागू होते हैं, उदाहरण के लिए, "सभी सूचकांक सरणी घावों के भीतर हैं"। अन्य प्रकार की संपत्तियों में शामिल हैं, "सभी स्थगित संकेत मान्य हैं", "यह कार्यक्रम किसी भी I / O का प्रदर्शन नहीं करता है, या" यह कार्यक्रम केवल / dev / null के लिए I / O करता है, आदि। बस किसी भी प्रकार के बारे में संपत्ति को निर्दिष्ट किया जा सकता है और इस प्रकार से चेक किया जा सकता है, जो आपके प्रकार सिस्टम की स्पष्टता पर निर्भर करता है।

आश्रित प्रकार की प्रणालियाँ सबसे सामान्य प्रकार की प्रणालियों में से एक हैं, जिसके द्वारा आप अपनी पसंद की किसी भी संपत्ति को लागू कर सकते हैं। हालांकि ऐसा करना जरूरी नहीं है, क्योंकि परिष्कृत गुण गोडेल के अधूरे शिष्टाचार के अधीन हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.