टाइप सेफ्टी

From Vigyanwiki
Revision as of 12:37, 26 May 2023 by alpha>Rajkumar

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

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

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

परिभाषाएँ

सहज रूप से टाइप साउंडनेस रॉबिन मिलनर के सारगर्भित कथन द्वारा पकड़ी गई है

अच्छी तरह से टाइप किए गए प्रोग्राम गलत नहीं हो सकते।[1]

दूसरे शब्दों में यदि एक प्रकार की प्रणाली ध्वनि है तो उस प्रकार की प्रणाली द्वारा स्वीकृत अभिव्यक्तियों को उचित प्रकार के मान का मूल्यांकन करना चाहिए (अतिरिक्त किसी अन्य असंबंधित प्रकार या किसी प्रकार की त्रुटि के साथ दुर्घटना के मान का उत्पादन करना) विजय सारस्वत निम्नलिखित संबंधित परिभाषा प्रदान करते हैं:

एक भाषा प्रकार-सुरक्षित है यदि भाषा में डेटा पर किए जा सकने वाले एकमात्र ऑपरेशन डेटा के प्रकार द्वारा स्वीकृत हैं।[2]

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

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

सांकेतिक शब्दार्थ और संरचनात्मक परिचालन शब्दार्थ के संदर्भ में टाइप साउंडनेस के कई अन्य औपचारिक उपचार भी प्रकाशित किए गए हैं।[1][4][5]


सुरक्षा के अन्य रूपों से संबंध

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

  • अवैध संचालन की रोकथाम उदाहरण के लिए एक प्रकार प्रणाली अभिव्यक्ति को अस्वीकार कर सकती है 3 / "Hello, World" अमान्य के रूप में, क्योंकि विभाजन ऑपरेटर (कंप्यूटर प्रोग्रामिंग) को एक स्ट्रिंग (कंप्यूटर विज्ञान) विभाजक के लिए परिभाषित नहीं किया गया है।
  • स्मृति सुरक्षा
    • टाइप सिस्टम वाइल्ड सूचक को रोक सकता है जो अन्यथा पॉइंटर से एक प्रकार की वस्तु को दूसरे प्रकार के पॉइंटर के रूप में माना जा सकता है।
    • अधिक परिष्कृत प्रकार की प्रणालियाँ जैसे कि आश्रित प्रकार का समर्थन करने वाले संभावित बफ़र अधिकता को रोकते हुए आउट-ऑफ़-बाउंड एक्सेस का पता लगा सकते हैं और अस्वीकार कर सकते हैं।[6]
  • विभिन्न प्रकार के शब्दार्थों में उत्पन्न होने वाली तर्क त्रुटियाँ उदाहरण के लिए इंच और मिलीमीटर दोनों को पूर्णांक के रूप में संग्रहीत किया जा सकता है किंतु एक दूसरे के लिए प्रतिस्थापित या जोड़ा नहीं जाना चाहिए। एक प्रकार की प्रणाली उनके लिए दो अलग-अलग प्रकार के पूर्णांक प्रयुक्त कर सकती है।

प्रकार-सुरक्षित और प्रकार-असुरक्षित भाषाएँ

अकादमिक प्रोग्रामिंग भाषा अनुसंधान में प्रस्तावित किसी भी टॉय भाषा (अर्थात गुप्त भाषा) के लिए प्रकार की सुरक्षा सामान्यतः एक आवश्यकता है। दूसरी ओर कई भाषाएँ मानव-निर्मित प्रकार के सुरक्षा प्रमाणों के लिए बहुत बड़ी हैं क्योंकि उन्हें अधिकांशतः हजारों स्थितियों की जाँच करने की आवश्यकता होती है। फिर भी कुछ भाषाएँ जैसे कि मानक एमएल जिसमें शब्दार्थ को कठोर रूप से परिभाषित किया गया है एक प्रकार की सुरक्षा की परिभाषा को पूरा करने के लिए सिद्ध हुई हैं।[7] कुछ अन्य भाषाओं जैसे हास्केल (प्रोग्रामिंग भाषा) को माना जाता है इस प्रकार की सुरक्षा की कुछ परिभाषा को पूरा करने के लिए परंतु कि कुछ एस्केप सुविधाओं का उपयोग न किया जाए (उदाहरण के लिए हास्केल unsafePerformIO, सामान्य प्रतिबंधित वातावरण से बचने के लिए उपयोग किया जाता है जिसमें I/O संभव है, टाइप सिस्टम को बाधित करता है और इसलिए इसका उपयोग टाइप सुरक्षा को तोड़ने के लिए किया जा सकता है।[8]) पनिंग टाइप करें इस तरह के एस्केप फीचर का एक और उदाहरण है। भाषा परिभाषा के गुणों के अतिरिक्त रन टाइम (कार्यक्रम जीवनचक्र चरण) पर कुछ त्रुटियां हो सकती हैं। कार्यान्वयन में बग के कारण रन-टाइम या अन्य भाषाओं में लिखी गई लिंक्ड पुस्तकालय (कंप्यूटर विज्ञान) में; ऐसी त्रुटियां कुछ परिस्थितियों में दिए गए कार्यान्वयन प्रकार को असुरक्षित बना सकती हैं। सन की जावा वर्चुअल मशीन का प्रारंभिक संस्करण इस प्रकार की समस्या के प्रति संवेदनशील था।[2]


शसक्त और अशक्त टाइपिंग

प्रकार की सुरक्षा के कुछ पहलुओं को संदर्भित करने के लिए प्रोग्रामिंग भाषाओं को अधिकांशतः बोलचाल की भाषा में जोरदार टाइप या अशक्त टाइप (भी शिथिल टाइप) के रूप में वर्गीकृत किया जाता है। 1974 में, बारबरा लिस्कोव और ज़िल्स ने एक दृढ़ता से टाइप की गई भाषा को एक के रूप में परिभाषित किया जिसमें जब भी किसी कॉलिंग कार्य से किसी कार्य को वस्तु पास किया जाता है, तो इसका प्रकार कॉल किए गए कार्य में घोषित प्रकार के साथ संगत होना चाहिए।[9]

1977 में जैक्सन ने लिखा एक दृढ़ता से टाइप की गई भाषा में प्रत्येक डेटा क्षेत्र का एक अलग प्रकार होगा और प्रत्येक प्रक्रिया इन प्रकारों के संदर्भ में अपनी संचार आवश्यकताओं को बताएगी।[10]

इसके विपरीत एक अशक्त टाइप की गई भाषा अप्रत्याशित परिणाम उत्पन्न कर सकती है या अंतर्निहित प्रकार का रूपांतरण कर सकती है।[11]


स्मृति प्रबंधन और प्रकार की सुरक्षा

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

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

अधिकांश प्रकार-सुरक्षित भाषाएँ गार्बेज संग्रह (कंप्यूटर विज्ञान) का उपयोग करती हैं। पियर्स कहते हैं डंगलिंग वाली सूचक समस्या के कारण एक स्पष्ट डीललोकेशन ऑपरेशन की उपस्थिति में प्रकार की सुरक्षा प्राप्त करना अधिक कठिन है।[12] चूँकि जंग (प्रोग्रामिंग भाषा) को सामान्यतः टाइप-सेफ माना जाता है और गार्बेज संग्रहण के अतिरिक्त मेमोरी सुरक्षा प्राप्त करने के लिए उधार लेने वाले चेकर का उपयोग करता है।

वस्तु उन्मुख भाषाओं में टाइप सुरक्षा

वस्तु उन्मुख भाषाओं में प्रकार की सुरक्षा सामान्यतः इस तथ्य में आंतरिक होती है कि एक प्रकार की प्रणाली उपस्थित है। यह वर्ग परिभाषाओं के संदर्भ में व्यक्त किया गया है।

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

हर बार जब कोई नई वस्तु बनाई जाती है तो वह उस अनुबंध का पालन करेगी।

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

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

विशिष्ट भाषाओं में टाइप सुरक्षा उद्देश्य

एडीए

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

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

एडीए 2012 अनुबंध द्वारा भाषा में ही डिजाइन जोड़ता है (पूर्व- और बाद की स्थितियों के साथ-साथ टाइप अपरिमित के रूप में)।

C

सी (प्रोग्रामिंग भाषा) सीमित संदर्भों में टाइप-सुरक्षित है उदाहरण के लिए एक संकलन-समय त्रुटि तब उत्पन्न होती है जब एक पॉइंटर को एक प्रकार की संरचना में एक पॉइंटर को दूसरे प्रकार की संरचना में बदलने का प्रयास किया जाता है, जब तक कि एक स्पष्ट कास्ट का उपयोग नहीं किया जाता है। चूँकि बहुत से सामान्य ऑपरेशन गैर-प्रकार-सुरक्षित हैं उदाहरण के लिए पूर्णांक को प्रिंट करने का सामान्य विधि कुछ इस प्रकार है printf("%d", 12), जहां %d कहता है printf पूर्णांक तर्क की अपेक्षा करने के लिए रन-टाइम पर (कुछ इस तरह printf("%s", 12) जो कार्य को एक वर्ण-स्ट्रिंग के लिए एक सूचक की अपेक्षा करने के लिए कहता है और फिर भी एक पूर्णांक तर्क प्रदान करता है जिसे संकलक द्वारा स्वीकार किया जा सकता है किंतु अपरिभाषित परिणाम उत्पन्न करेगा।) यह कुछ संकलक (जैसे जीसीसी) द्वारा प्रिंटफ तर्कों और प्रारूप तार आंशिक रूप से कम किया जाता है जो बीच के प्रकार के पत्राचार की जाँच करता है।

इसके अतिरिक्त सी (प्रोग्रामिंग भाषा) एडीए की तरह अनिर्दिष्ट या अपरिभाषित स्पष्ट रूपांतरण प्रदान करता है; और एडीए के विपरीत इन रूपांतरणों का उपयोग करने वाले मुहावरे बहुत समान हैं और सी (प्रोग्रामिंग भाषा) को एक प्रकार-असुरक्षित प्रतिष्ठा देने में सहायता की है। उदाहरण के लिए हीप पर मेमोरी आवंटित करने का मानक विधि एक मेमोरी आवंटन कार्य को कॉल करना है, जैसे कि malloc, एक तर्क के साथ कि कितने बाइट्स की आवश्यकता है। कार्य एक अनटाइप्ड पॉइंटर लौटाता है (टाइप void *), जिसे कॉलिंग कोड को स्पष्ट रूप से या निहित रूप से उचित सूचक प्रकार में डाला जाना चाहिए। सी के पूर्व-मानकीकृत कार्यान्वयन के लिए ऐसा करने के लिए एक स्पष्ट कलाकार की आवश्यकता होती है इसलिए कोड (struct foo *) malloc(sizeof(struct foo)) स्वीकृत प्रथा बन गई।[14]

C++

C++ की कुछ विशेषताएं जो अधिक टाइप-सुरक्षित कोड को बढ़ावा देती हैं:

  • नया (सी ++) ऑपरेटर ऑपरेंड के आधार पर प्रकार का सूचक देता है जबकि मैलोक एक शून्य सूचक देता है।
  • सी ++ कोड शून्य पॉइंटर्स के बिना बहुरूपता प्राप्त करने के लिए आभासी कार्यों और टेम्पलेट (प्रोग्रामिंग) का उपयोग कर सकता है।
  • सुरक्षित कास्टिंग ऑपरेटर जैसे गतिशील कास्ट जो रन-टाइम टाइप चेकिंग करता है।
  • C++11 दृढ़ता से टाइप की गई गणनाओं को पूर्ण रूप से पूर्णांक या अन्य गणना प्रकारों में परिवर्तित नहीं किया जा सकता है।
  • C++ स्पष्ट रूपांतरण और C++11 स्पष्ट रूपांतरण ऑपरेटर अंतर्निहित प्रकार के रूपांतरणों को रोकते हैं।

C#

C# टाइप-सुरक्षित है (किंतु स्टेटिकली टाइप-सेफ नहीं) इसमें अनटाइप्ड पॉइंटर्स के लिए समर्थन है, किंतु इसे असुरक्षित कीवर्ड का उपयोग करके एक्सेस किया जाना चाहिए, जिसे कंपाइलर स्तर पर प्रतिबंधित किया जा सकता है। इसमें रन-टाइम कास्ट सत्यापन के लिए अंतर्निहित समर्थन है। कास्ट को कीवर्ड के रूप में उपयोग करके सत्यापित किया जा सकता है जो कास्ट अमान्य होने पर एक शून्य संदर्भ लौटाएगा या सी-स्टाइल कास्ट का उपयोग करके जो कास्ट अमान्य होने पर अपवाद फेंक देगा। सी शार्प सिंटेक्स या रूपांतरण ऑपरेटर देखें।

ऑब्जेक्ट प्रकार (जिससे अन्य सभी प्रकार व्युत्पन्न होते हैं) पर अनुचित निर्भरता C# प्रकार प्रणाली के उद्देश्य को पराजित करने का कठिन परिस्थिति उठाती है। जेनरिक के पक्ष में ऑब्जेक्ट संदर्भों को छोड़ना सामान्यतः उत्तम अभ्यास है, C++ में टेम्प्लेट और जावा में जेनरिक के समान है।

जावा

जावा प्रोग्रामिंग भाषा को प्रकार की सुरक्षा को प्रयुक्त करने के लिए डिज़ाइन किया गया है। जावा में कुछ भी एक वस्तु (कंप्यूटर विज्ञान) के अंदर होता है

और प्रत्येक वस्तु एक वर्ग (कंप्यूटर प्रोग्रामिंग) का एक उदाहरण है।

प्रकार के सुरक्षा प्रवर्तन को प्रयुक्त करने के लिए उपयोग से पहले प्रत्येक वस्तु को मेमोरी आवंटन की आवश्यकता होती है। जावा आदिम डेटा प्रकार के उपयोग की अनुमति देता है किंतु केवल ठीक से आवंटित वस्तुओं के अंदर है।

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

इस स्थिति में यदि विभाजन का कोई परिमित प्रतिनिधित्व नहीं है जैसे कि जब कोई गणना करता है उदा। 1/3 = 0.33333 ..., ऑपरेशन के लिए कोई राउंडिंग मोड परिभाषित नहीं होने पर डिवाइड () विधि अपवाद उठा सकती है।इसलिए पुस्तकालय भाषा के अतिरिक्त यह आश्वासन देता है कि वस्तु वर्ग परिभाषा में निहित अनुबंध का सम्मान करती है।

मानक एमएल

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

मोडुला -2

मोडुला -2 एक डिजाइन दर्शन के साथ एक दृढ़ता से टाइप की गई भाषा है, जिसमें किसी भी असुरक्षित सुविधाओं को स्पष्ट रूप से असुरक्षित के रूप में चिह्नित करने की आवश्यकता होती है। यह ऐसी सुविधाओं को सिस्टम नामक एक अंतर्निहित छद्म-पुस्तकालय में स्थानांतरित करके प्राप्त किया जाता है जहां से उनका उपयोग करने से पहले उन्हें आयात किया जाना चाहिए। इस प्रकार जब ऐसी सुविधाओं का उपयोग किया जाता है तो आयात इसे दृश्यमान बनाता है। दुर्भाग्य से यह मूल भाषा सूची और उसके कार्यान्वयन में फलस्वरूप प्रयुक्त नहीं किया गया था।[15] टाइप कास्ट सिंटैक्स और वैरिएंट रिकॉर्ड (पास्कल से विरासत में मिली) जैसी असुरक्षित सुविधाएं अभी भी बनी हुई हैं जिनका उपयोग बिना पूर्व आयात के किया जा सकता है।[16] सिस्टम स्यूडो-मॉड्यूल में इन सुविधाओं को स्थानांतरित करने में कठिनाई सुविधा के लिए किसी भी पहचानकर्ता की कमी थी जिसे तब आयात किया जा सकता था क्योंकि केवल पहचानकर्ताओं को आयात किया जा सकता था किंतु सिंटैक्स नहीं है ।

IMPORT SYSTEM; (* allows the use of certain unsafe facilities: *)
VAR word : SYSTEM.WORD; addr : SYSTEM.ADDRESS;
addr := SYSTEM.ADR(word);

(* but type cast syntax can be used without such import *)
VAR i : INTEGER; n : CARDINAL;
n := CARDINAL(i); (* or *) i := INTEGER(n);

आईएसओ मोडुला-2 मानक ने टाइप कास्ट सिंटैक्स को कास्ट नामक कार्य में बदलकर टाइप कास्ट सुविधा के लिए इसे सही किया जिसे स्यूडो-मॉड्यूल सिस्टम से आयात किया जाना है। चूँकि अन्य असुरक्षित सुविधाएं जैसे वेरिएंट रिकॉर्ड छद्म-मॉड्यूल सिस्टम से किसी आयात के बिना उपलब्ध रहीं है।[17]

IMPORT SYSTEM;
VAR i : INTEGER; n : CARDINAL;
i := SYSTEM.CAST(INTEGER, n); (* Type cast in ISO Modula-2 *)

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

IMPORT UNSAFE;
VAR i : INTEGER; n : CARDINAL;
i := UNSAFE.CAST(INTEGER, n); (* Type cast in Modula-2 Revision 2010 *)

FROM UNSAFE IMPORT FFI; (* enabling identifier for foreign function interface facility *)
<*FFI="C"*> (* pragma for foreign function interface to C *)

<वाक्यविन्यास लैंग = मॉड्यूल 2>

असुरक्षित आयात करें; वर मैं : पूर्णांक; n : कार्डिनल; मैं := असुरक्षित कास्ट (पूर्णांक, एन); (*मोडुला-2 संशोधन 2010 में टाइप कास्ट*)

असुरक्षित आयात एफएफआई से; (* विदेशी कार्य इंटरफ़ेस सुविधा के लिए पहचानकर्ता को सक्षम करना *) <*FFI= C *> (* विदेशी कार्य इंटरफ़ेस के लिए C * के लिए pragma) </वाक्यविन्यास हाइलाइट>

पास्कल

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

type
  TwoTypes = record
     I: Integer;
     Q: Real;
  end;

  DualTypes = record
    I: Integer;
    Q: Real;
  end;

var
  T1, T2:  TwoTypes;
  D1, D2:  DualTypes;


सख्त टाइपिंग के तहत TwoTypes के रूप में परिभाषित एक चर DualTypes के साथ संगत नहीं है (क्योंकि वे समान नहीं हैं, तथापि उस उपयोगकर्ता परिभाषित प्रकार के घटक समान हों) औरT1 := D2; अवैध है। का एक कार्य T1 := T2;नियमबद्ध होगा क्योंकि जिन उपप्रकारों को परिभाषित किया गया है वे समान हैं। चूँकि एक असाइनमेंट जैसेT1.Q := D1.Q; नियमबद्ध होगा।

सामान्य लिस्प

सामान्यतः सामान्य लिस्प एक प्रकार की सुरक्षित भाषा है। एक सामान्य लिस्प संकलक संचालन के लिए गतिशील जांच डालने के लिए उत्तरदाई होता है जिसकी प्रकार की सुरक्षा को स्थिर रूप से सिद्ध नहीं किया जा सकता है। चूँकि एक प्रोग्रामर संकेत दे सकता है कि एक प्रोग्राम को गतिशील टाइप-चेकिंग के निम्न स्तर के साथ संकलित किया जाना चाहिए।[18] ऐसे मोड में संकलित प्रोग्राम को टाइप-सेफ नहीं माना जा सकता है।

C++उदाहरण

निम्न उदाहरण दिखाता है कि गलत विधि से उपयोग किए जाने पर C++ कास्ट ऑपरेटर टाइप सुरक्षा को कैसे तोड़ सकते हैं। पहला उदाहरण दिखाता है कि मूलभूत डेटा प्रकारों को गलत विधि से कैसे डाला जा सकता है:

#include <iostream>
using namespace std;

int main () {
    int   ival = 5;                              // integer value
    float fval = reinterpret_cast<float&>(ival); // reinterpret bit pattern
    cout << fval << endl;                        // output integer as float
    return 0;
}


इस उदाहरण में, reinterpret_castस्पष्ट रूप से संकलक को पूर्णांक से फ़्लोटिंग-पॉइंट मान में सुरक्षित रूपांतरण करने से रोकता है।[19] जब प्रोग्राम चलता है तो यह गार्बेज फ़्लोटिंग-पॉइंट वैल्यू आउटपुट करेगा। इसके अतिरिक्त float fval = ival; लिखकर समस्या से बचा जा सकता था।

अगला उदाहरण दिखाता है कि कैसे वस्तु संदर्भों को गलत विधि से डाउनकास्ट किया जा सकता है:

#include <iostream>
using namespace std;

class Parent {
public:
    virtual ~Parent() {} // virtual destructor for RTTI
};

class Child1 : public Parent {
public:
    int a;
};

class Child2 : public Parent {
public:
    float b;
};

int main () {
    Child1 c1;
    c1.a = 5;
    Parent & p = c1;                     // upcast always safe
    Child2 & c2 = static_cast<Child2&>(p); // invalid downcast
    cout << c2.b << endl;          // will output garbage data
    return 0;
}


दो चाइल्ड वर्गों में विभिन्न प्रकार के सदस्य होते हैं। चाइल्ड क्लास पॉइंटर को पैरेंट क्लास पॉइंटर को डाउनकास्ट करते समय परिणामी पॉइंटर सही प्रकार की वैध वस्तु को इंगित नहीं कर सकता है। उदाहरण में, इससे गारबेज वैल्यू प्रिंट हो जाती है। static_castको dynamic_cast से बदलकर समस्या से बचा जा सकता था जो अमान्य कास्ट्स पर एक अपवाद फेंकता है।[20]

यह भी देखें

टिप्पणियाँ

  1. 1.0 1.1 Milner, Robin (1978), "A Theory of Type Polymorphism in Programming", Journal of Computer and System Sciences, 17 (3): 348–375, doi:10.1016/0022-0000(78)90014-4
  2. 2.0 2.1 Saraswat, Vijay (1997-08-15). "जावा टाइप-सेफ नहीं है". Retrieved 2008-10-08.
  3. Wright, A. K.; Felleisen, M. (15 November 1994). "टाइप साउंडनेस के लिए एक सिंटैक्टिक दृष्टिकोण". Information and Computation (in English). 115 (1): 38–94. doi:10.1006/inco.1994.1093. ISSN 0890-5401.
  4. Damas, Luis; Milner, Robin (25 January 1982). "कार्यात्मक कार्यक्रमों के लिए प्रिंसिपल टाइप-स्कीम". Proceedings of the 9th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages. Association for Computing Machinery: 207–212. doi:10.1145/582153.582176. ISBN 0897910656. S2CID 11319320.
  5. Tofte, Mads (1988). परिचालन शब्दार्थ और बहुरूपी प्रकार का अनुमान (Thesis) (in English).
  6. Henriksen, Troels; Elsman, Martin (17 June 2021). "सरणी प्रोग्रामिंग के लिए आकार-निर्भर प्रकारों की ओर". Proceedings of the 7th ACM SIGPLAN International Workshop on Libraries, Languages and Compilers for Array Programming. Association for Computing Machinery: 1–14. doi:10.1145/3460944.3464310. ISBN 9781450384667. S2CID 235474098.
  7. Standard ML. Smlnj.org. Retrieved on 2013-11-02.
  8. "सिस्टम.आईओ.असुरक्षित". GHC libraries manual: base-3.0.1.0. Archived from the original on 2008-07-05. Retrieved 2008-07-17.
  9. Liskov, B; Zilles, S (1974). "अमूर्त डेटा प्रकारों के साथ प्रोग्रामिंग". ACM SIGPLAN Notices. 9 (4): 50–59. CiteSeerX 10.1.1.136.3043. doi:10.1145/942572.807045.
  10. Jackson, K. (1977). "समानांतर प्रसंस्करण और मॉड्यूलर सॉफ्टवेयर निर्माण". Design and Implementation of Programming Languages. Lecture Notes in Computer Science. 54: 436–443. doi:10.1007/BFb0021435. ISBN 3-540-08360-X.
  11. "CS1130. Transition to OO programming. – Spring 2012 --self-paced version". Cornell University, Department of Computer Science. 2005. Archived from the original on 2005. Retrieved 2015-11-23. {{cite web}}: Check date values in: |archive-date= (help)
  12. Pierce, Benjamin C. (2002). प्रकार और प्रोग्रामिंग भाषाएँ. Cambridge, Mass.: MIT Press. p. 158. ISBN 0-262-16209-1.
  13. Type safety is hence also a matter of good class definition: public methods that modify the internal state of an object shall preserve the object itegrity
  14. Kernighan; Dennis M. Ritchie (March 1988). सी प्रोग्रामिंग लैंग्वेज (2nd ed.). Englewood Cliffs, NJ: Prentice Hall. p. 116. ISBN 978-0-13-110362-7. सी में, उचित विधि यह घोषित करना है कि मॉलोक एक पॉइंटर को शून्य पर लौटाता है, फिर पॉइंटर को वांछित प्रकार में कास्ट के साथ स्पष्ट रूप से मजबूर करता है।
  15. Niklaus Wirth (1985). Programming in Modula-2. Springer Verlag.
  16. 16.0 16.1 "सुरक्षित और असुरक्षित सुविधाओं का पृथक्करण". Retrieved 24 March 2015.
  17. "ISO Modula-2 Language Reference". Retrieved 24 March 2015.
  18. "सामान्य लिस्प हाइपरस्पेक". Retrieved 26 May 2013.
  19. "reinterpret_cast conversion - cppreference.com". En.cppreference.com. Retrieved 2022-09-21.
  20. "dynamic_cast conversion - cppreference.com". En.cppreference.com. Retrieved 2022-09-21.


संदर्भ