टाइप सेफ्टी: Difference between revisions
m (Sugatha moved page सुरक्षा टाइप करें to टाइप सेफ्टी without leaving a redirect) |
No edit summary |
||
Line 1: | Line 1: | ||
{{Type systems}} | {{Type systems}} | ||
[[कंप्यूटर विज्ञान]] में, प्रकार की सुरक्षा और प्रकार की | [[कंप्यूटर विज्ञान]] में, प्रकार की सुरक्षा और प्रकार की शक्ति वह सीमा है जिस तक एक [[प्रोग्रामिंग भाषा]] प्रकार की त्रुटियों को हतोत्साहित करती है या रोकती है। प्रकार की सुरक्षा को कभी-कभी वैकल्पिक रूप से कंप्यूटर भाषा की सुविधाओं की गुण माना जाता है अर्थात्, कुछ सुविधाएं टाइप-सेफ हैं और उनके उपयोग के परिणामस्वरूप [[ त्रुटि प्रकार |त्रुटि प्रकार]] नहीं होंगे जबकि उसी भाषा में अन्य सुविधाएं टाइप-असुरक्षित हो सकती हैं और उनका उपयोग करने वाला प्रोग्राम टाइप एरर का सामना कर सकता है। किसी दी गई प्रोग्रामिंग भाषा द्वारा प्रकार की त्रुटियों के रूप में वर्गीकृत व्यवहार सामान्यतः वे होते हैं जो [[मूल्य (कंप्यूटर विज्ञान)|मान (कंप्यूटर विज्ञान)]] पर संचालन करने के प्रयासों के परिणामस्वरूप होते हैं जो उपयुक्त [[डेटा प्रकार]] के नहीं होते हैं उदाहरण के लिए एक स्ट्रिंग को एक पूर्णांक में जोड़ना जब कोई परिभाषा नहीं होती है इस स्थिति को संभालने के लिए यह वर्गीकरण आंशिक रूप से राय पर आधारित है। | ||
प्रकार प्रवर्तन स्थिर हो सकता है | प्रकार प्रवर्तन स्थिर हो सकता है [[संकलन समय]] पर संभावित त्रुटियों को पकड़ना या गतिशील प्रकार की जानकारी को रन टाइम (प्रोग्राम जीवनचक्र चरण) रन-टाइम पर मानो के साथ जोड़ना और आसन्न त्रुटियों का पता लगाने के लिए आवश्यकतानुसार परामर्श करना या दोनों का संयोजन गतिशील प्रकार प्रवर्तन अधिकांशतः उन प्रोग्रामों को चलाने की अनुमति देता है जो स्थिर प्रवर्तन के तहत अमान्य होंगे। | ||
स्थैतिक (संकलन-समय) प्रकार की प्रणालियों के संदर्भ में | स्थैतिक (संकलन-समय) प्रकार की प्रणालियों के संदर्भ में प्रकार की सुरक्षा में सामान्यतः (अन्य बातों के अतिरिक्त ) एक आश्वासन सम्मिलित होती है कि किसी भी [[अभिव्यक्ति (प्रोग्रामिंग)]] का अंतिम मान उस अभिव्यक्ति के स्थिर प्रकार का एक वैध सदस्य होगा। स्पष्ट आवश्यकता इससे कहीं अधिक सूक्ष्म है - उदाहरण के लिए जटिलताओं के लिए उपप्रकार और [[बहुरूपता (कंप्यूटर विज्ञान)]] देखें। | ||
== परिभाषाएँ == | == परिभाषाएँ == | ||
सहज रूप से | सहज रूप से टाइप साउंडनेस [[रॉबिन मिलनर]] के सारगर्भित कथन द्वारा पकड़ी गई है | ||
: अच्छी तरह से टाइप किए गए प्रोग्राम गलत नहीं हो सकते।<ref name="Milner 1978">{{Citation | : अच्छी तरह से टाइप किए गए प्रोग्राम गलत नहीं हो सकते।<ref name="Milner 1978">{{Citation | ||
| last1 = Milner | first1 = Robin | | last1 = Milner | first1 = Robin | ||
Line 19: | Line 19: | ||
| doi-access = free | | doi-access = free | ||
}}</ref> | }}</ref> | ||
दूसरे शब्दों में | दूसरे शब्दों में यदि एक प्रकार की प्रणाली ध्वनि है तो उस प्रकार की प्रणाली द्वारा स्वीकृत अभिव्यक्तियों को उचित प्रकार के मान का मूल्यांकन करना चाहिए (अतिरिक्त किसी अन्य असंबंधित प्रकार या किसी प्रकार की त्रुटि के साथ दुर्घटना के मान का उत्पादन करना) विजय सारस्वत निम्नलिखित संबंधित परिभाषा प्रदान करते हैं: | ||
: एक भाषा प्रकार-सुरक्षित है यदि भाषा में डेटा पर किए जा सकने वाले एकमात्र ऑपरेशन डेटा के प्रकार द्वारा स्वीकृत हैं।<ref name=saraswat-java>{{cite web|last=Saraswat |first=Vijay | date=1997-08-15 |title=जावा टाइप-सेफ नहीं है|url=http://www.cis.upenn.edu/~bcpierce/courses/629/papers/Saraswat-javabug.html |access-date=2008-10-08 }}</ref> | : एक भाषा प्रकार-सुरक्षित है यदि भाषा में डेटा पर किए जा सकने वाले एकमात्र ऑपरेशन डेटा के प्रकार द्वारा स्वीकृत हैं।<ref name=saraswat-java>{{cite web|last=Saraswat |first=Vijay | date=1997-08-15 |title=जावा टाइप-सेफ नहीं है|url=http://www.cis.upenn.edu/~bcpierce/courses/629/papers/Saraswat-javabug.html |access-date=2008-10-08 }}</ref> | ||
चूँकि किसी प्रोग्राम के अच्छी तरह से टाइप होने या गलत होने का क्या अर्थ है इसके स्थिर शब्दार्थ और [[गतिशील शब्दार्थ]] के गुण हैं जो प्रत्येक प्रोग्रामिंग भाषा के लिए विशिष्ट हैं। परिणाम स्वरुप प्रकार की ध्वनि की एक स्पष्ट औपचारिक परिभाषा एक भाषा को निर्दिष्ट करने के लिए प्रयुक्त औपचारिक शब्दों की शैली पर निर्भर करती है। 1994 में एंड्रयू राइट और [[मैथ्यू फेलिसेन]] ने [[परिचालन शब्दार्थ]] द्वारा परिभाषित भाषाओं में प्रकार की सुरक्षा के लिए मानक परिभाषा और प्रमाण विधि क्या बन गई है '''तैयार की'''।<ref name="Wright and Felleisen 1994">{{cite journal |last1=Wright |first1=A. K. |last2=Felleisen |first2=M. |title=टाइप साउंडनेस के लिए एक सिंटैक्टिक दृष्टिकोण|journal=Information and Computation |date=15 November 1994 |volume=115 |issue=1 |pages=38–94 |doi=10.1006/inco.1994.1093 |language=en |issn=0890-5401|doi-access=free }}</ref> जो अधिकांश प्रोग्रामर द्वारा समझी जाने वाली प्रकार की सुरक्षा की धारणा के सबसे समीप है। इस दृष्टिकोण के तहत किसी भाषा के शब्दार्थ में टाइप-साउंड माने जाने के लिए निम्नलिखित दो गुण होने चाहिए: | |||
;प्रगति: एक अच्छी तरह से टाइप किया गया प्रोग्राम कभी अटकता नहीं है: प्रत्येक [[अभिव्यक्ति (कंप्यूटर विज्ञान)]] या तो पहले से ही एक | ;प्रगति: एक अच्छी तरह से टाइप किया गया प्रोग्राम कभी अटकता नहीं है: प्रत्येक [[अभिव्यक्ति (कंप्यूटर विज्ञान)]] या तो पहले से ही एक मान (कंप्यूटर विज्ञान) है या किसी अच्छी तरह से परिभाषित विधि से मान की ओर कम किया जा सकता है। दूसरे शब्दों में कार्यक्रम कभी भी एक अपरिभाषित स्थिति में नहीं आता है जहां कोई और बदलाव संभव नहीं है। | ||
;संरक्षण (या [[विषय में कमी]]): प्रत्येक मूल्यांकन चरण के बाद | ;संरक्षण (या [[विषय में कमी]]): प्रत्येक मूल्यांकन चरण के बाद प्रत्येक अभिव्यक्ति का प्रकार समान रहता है (अर्थात इसका प्रकार संरक्षित है)। | ||
[[सांकेतिक शब्दार्थ]] और [[संरचनात्मक परिचालन शब्दार्थ]] के संदर्भ में टाइप साउंडनेस के कई अन्य औपचारिक उपचार भी प्रकाशित किए गए हैं।<ref name="Milner 1978" /><ref>{{cite journal |last1=Damas |first1=Luis |last2=Milner |first2=Robin |title=कार्यात्मक कार्यक्रमों के लिए प्रिंसिपल टाइप-स्कीम|journal=Proceedings of the 9th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages |date=25 January 1982 |pages=207–212 |doi=10.1145/582153.582176 |url=https://dl.acm.org/doi/10.1145/582153.582176 |publisher=Association for Computing Machinery|isbn=0897910656 |s2cid=11319320 }}</ref><ref>{{cite thesis |last1=Tofte |first1=Mads |title=परिचालन शब्दार्थ और बहुरूपी प्रकार का अनुमान|date=1988 |url=https://era.ed.ac.uk/handle/1842/6606 |language=en}}</ref> | [[सांकेतिक शब्दार्थ]] और [[संरचनात्मक परिचालन शब्दार्थ]] के संदर्भ में टाइप साउंडनेस के कई अन्य औपचारिक उपचार भी प्रकाशित किए गए हैं।<ref name="Milner 1978" /><ref>{{cite journal |last1=Damas |first1=Luis |last2=Milner |first2=Robin |title=कार्यात्मक कार्यक्रमों के लिए प्रिंसिपल टाइप-स्कीम|journal=Proceedings of the 9th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages |date=25 January 1982 |pages=207–212 |doi=10.1145/582153.582176 |url=https://dl.acm.org/doi/10.1145/582153.582176 |publisher=Association for Computing Machinery|isbn=0897910656 |s2cid=11319320 }}</ref><ref>{{cite thesis |last1=Tofte |first1=Mads |title=परिचालन शब्दार्थ और बहुरूपी प्रकार का अनुमान|date=1988 |url=https://era.ed.ac.uk/handle/1842/6606 |language=en}}</ref> | ||
Line 30: | Line 30: | ||
== सुरक्षा के अन्य रूपों से संबंध == | == सुरक्षा के अन्य रूपों से संबंध == | ||
अलगाव में | अलगाव में टाइप साउंडनेस एक अपेक्षाकृत अशक्त गुण है क्योंकि यह अनिवार्य रूप से केवल यह बताता है कि एक प्रकार की प्रणाली के नियम आंतरिक रूप से सुसंगत हैं और इन्हें विकृत नहीं किया जा सकता है। चूँकि व्यवहार में प्रोग्रामिंग भाषाओं को डिज़ाइन किया गया है जिससे अच्छी तरह से टाइप किए गए अन्य, शसक्त गुणों को भी सम्मिलित किया जा सकता है जिनमें से कुछ सम्मिलित हैं: | ||
* अवैध संचालन की | * अवैध संचालन की रोकथाम उदाहरण के लिए एक प्रकार प्रणाली अभिव्यक्ति को अस्वीकार कर सकती है <code>3 / "Hello, World"</code> अमान्य के रूप में, क्योंकि विभाजन [[ऑपरेटर (कंप्यूटर प्रोग्रामिंग)]] को एक [[स्ट्रिंग (कंप्यूटर विज्ञान)]] वि[[भाजक]] के लिए परिभाषित नहीं किया गया है। | ||
* [[स्मृति सुरक्षा]] | * [[स्मृति सुरक्षा]] | ||
** टाइप सिस्टम [[ जंगली सूचक ]] | ** टाइप सिस्टम [[ जंगली सूचक | वाइल्ड सूचक]] को रोक सकता है जो अन्यथा पॉइंटर से एक प्रकार की वस्तु को दूसरे प्रकार के पॉइंटर के रूप में माना जा सकता है। | ||
** अधिक परिष्कृत प्रकार की प्रणालियाँ | ** अधिक परिष्कृत प्रकार की प्रणालियाँ जैसे कि [[आश्रित प्रकार]] का समर्थन करने वाले संभावित [[ बफ़र अधिकता ]] को रोकते हुए आउट-ऑफ़-बाउंड एक्सेस का पता लगा सकते हैं और अस्वीकार कर सकते हैं।<ref>{{cite journal |last1=Henriksen |first1=Troels |last2=Elsman |first2=Martin |title=सरणी प्रोग्रामिंग के लिए आकार-निर्भर प्रकारों की ओर|journal=Proceedings of the 7th ACM SIGPLAN International Workshop on Libraries, Languages and Compilers for Array Programming |date=17 June 2021 |pages=1–14 |doi=10.1145/3460944.3464310 |url=https://dl.acm.org/doi/10.1145/3460944.3464310 |publisher=Association for Computing Machinery|isbn=9781450384667 |s2cid=235474098 }}</ref> | ||
* विभिन्न प्रकार के शब्दार्थों में उत्पन्न होने वाली [[तर्क त्रुटि]] | * विभिन्न प्रकार के शब्दार्थों में उत्पन्न होने वाली [[तर्क त्रुटि]]याँ उदाहरण के लिए इंच और मिलीमीटर दोनों को पूर्णांक के रूप में संग्रहीत किया जा सकता है किंतु एक दूसरे के लिए प्रतिस्थापित या जोड़ा नहीं जाना चाहिए। एक प्रकार की प्रणाली उनके लिए दो अलग-अलग प्रकार के पूर्णांक प्रयुक्त कर सकती है। | ||
== प्रकार-सुरक्षित और प्रकार-असुरक्षित भाषाएँ == | == प्रकार-सुरक्षित और प्रकार-असुरक्षित भाषाएँ == | ||
अकादमिक प्रोग्रामिंग भाषा अनुसंधान में प्रस्तावित किसी भी | अकादमिक प्रोग्रामिंग भाषा अनुसंधान में प्रस्तावित किसी भी टॉय भाषा (अर्थात [[गूढ़ भाषा|गुप्त भाषा]]) के लिए प्रकार की सुरक्षा सामान्यतः एक आवश्यकता है। दूसरी ओर कई भाषाएँ मानव-निर्मित प्रकार के सुरक्षा प्रमाणों के लिए बहुत बड़ी हैं क्योंकि उन्हें अधिकांशतः हजारों स्थितियों की जाँच करने की आवश्यकता होती है। फिर भी कुछ भाषाएँ जैसे कि [[मानक एमएल]] जिसमें शब्दार्थ को कठोर रूप से परिभाषित किया गया है एक प्रकार की सुरक्षा की परिभाषा को पूरा करने के लिए सिद्ध हुई हैं।<ref>[http://www.smlnj.org/sml.html Standard ML]. Smlnj.org. Retrieved on 2013-11-02.</ref> कुछ अन्य भाषाओं जैसे [[हास्केल (प्रोग्रामिंग भाषा)]] को माना जाता है इस प्रकार की सुरक्षा की कुछ परिभाषा को पूरा करने के लिए परंतु कि कुछ एस्केप सुविधाओं का उपयोग न किया जाए (उदाहरण के लिए हास्केल {{mono|unsafePerformIO}}, सामान्य प्रतिबंधित वातावरण से बचने के लिए उपयोग किया जाता है जिसमें I/O संभव है, टाइप सिस्टम को बाधित करता है और इसलिए इसका उपयोग टाइप सुरक्षा को तोड़ने के लिए किया जा सकता है।<ref>{{cite web |url=http://www.haskell.org/ghc/docs/latest/html/libraries/base/System-IO-Unsafe.html#v:unsafePerformIO |title=सिस्टम.आईओ.असुरक्षित|work=GHC libraries manual: base-3.0.1.0 |access-date=2008-07-17 |archive-url=https://web.archive.org/web/20080705163908/http://haskell.org/ghc/docs/latest/html/libraries/base/System-IO-Unsafe.html#v:unsafePerformIO |archive-date=2008-07-05 |url-status=dead }}</ref>) [[ पनिंग टाइप करें ]] इस तरह के एस्केप फीचर का एक और उदाहरण है। भाषा परिभाषा के गुणों के अतिरिक्त रन टाइम (कार्यक्रम जीवनचक्र चरण) पर कुछ त्रुटियां हो सकती हैं। कार्यान्वयन में बग के कारण रन-टाइम या अन्य भाषाओं में लिखी गई लिंक्ड [[ पुस्तकालय (कंप्यूटर विज्ञान) ]] में; ऐसी त्रुटियां कुछ परिस्थितियों में दिए गए कार्यान्वयन प्रकार को असुरक्षित बना सकती हैं। सन की [[जावा वर्चुअल मशीन]] का प्रारंभिक संस्करण इस प्रकार की समस्या के प्रति संवेदनशील था।<ref name=saraswat-java /> | ||
== | == शसक्त और अशक्त टाइपिंग == | ||
{{Main| | {{Main|शसक्त और अशक्त टाइपिंग}} | ||
प्रकार की सुरक्षा के कुछ पहलुओं को संदर्भित करने के लिए प्रोग्रामिंग भाषाओं को | |||
1977 में | प्रकार की सुरक्षा के कुछ पहलुओं को संदर्भित करने के लिए प्रोग्रामिंग भाषाओं को अधिकांशतः बोलचाल की भाषा में जोरदार टाइप या अशक्त टाइप (भी शिथिल टाइप) के रूप में वर्गीकृत किया जाता है। 1974 में, [[बारबरा लिस्कोव]] और ज़िल्स ने एक दृढ़ता से टाइप की गई भाषा को एक के रूप में परिभाषित किया जिसमें जब भी किसी कॉलिंग कार्य से किसी कार्य को वस्तु पास किया जाता है, तो इसका प्रकार कॉल किए गए कार्य में घोषित प्रकार के साथ संगत होना चाहिए।<ref>{{cite journal | citeseerx = 10.1.1.136.3043 | title = अमूर्त डेटा प्रकारों के साथ प्रोग्रामिंग| first1 = B | last1 = Liskov | first2 = S | last2 = Zilles | journal = ACM SIGPLAN Notices | volume = 9 | issue = 4 | pages = 50–59 | year = 1974 | doi=10.1145/942572.807045}}</ref> | ||
इसके विपरीत | |||
1977 में जैक्सन ने लिखा एक दृढ़ता से टाइप की गई भाषा में प्रत्येक डेटा क्षेत्र का एक अलग प्रकार होगा और प्रत्येक प्रक्रिया इन प्रकारों के संदर्भ में अपनी संचार आवश्यकताओं को बताएगी।<ref>{{cite journal | title = समानांतर प्रसंस्करण और मॉड्यूलर सॉफ्टवेयर निर्माण| first1 = K. | last1 = Jackson | journal = Design and Implementation of Programming Languages | year = 1977 | volume = 54 | pages = 436–443 | doi = 10.1007/BFb0021435 | series = Lecture Notes in Computer Science | isbn = 3-540-08360-X }}</ref> | |||
इसके विपरीत एक अशक्त टाइप की गई भाषा अप्रत्याशित परिणाम उत्पन्न कर सकती है या अंतर्निहित प्रकार का रूपांतरण कर सकती है।<ref>{{cite web | url =http://www.cs.cornell.edu/ | title =CS1130. Transition to OO programming. – Spring 2012 --self-paced version | date = 2005 | publisher = Cornell University, Department of Computer Science | archive-url = http://www.cs.cornell.edu/courses/CS1130/2012sp/1130selfpaced/module1/module1part4/strongtyping.htm| archive-date = 2005 | access-date = 2015-11-23}}</ref> | |||
== स्मृति प्रबंधन और प्रकार की सुरक्षा == | == स्मृति प्रबंधन और प्रकार की सुरक्षा == | ||
प्रकार की सुरक्षा स्मृति सुरक्षा से निकटता से जुड़ी हुई है। उदाहरण के लिए | प्रकार की सुरक्षा स्मृति सुरक्षा से निकटता से जुड़ी हुई है। उदाहरण के लिए एक ऐसी भाषा के कार्यान्वयन में जिसमें कुछ प्रकार <math>t</math> है जो कुछ बिट पैटर्न की अनुमति देता है किंतु अन्य नहीं एक लटकती सूचक स्मृति त्रुटि एक बिट पैटर्न लिखने की अनुमति देती है जो <math>t</math> के वैध सदस्य को टाइप <math>t</math> के मृत चर में नहीं दर्शाती है, चर पढ़ने पर एक प्रकार की त्रुटि उत्पन्न होती है। इसके विपरीत यदि भाषा स्मृति-सुरक्षित है तो यह एक इच्छानुसार पूर्णांक को सूचक के रूप में उपयोग करने की अनुमति नहीं दे सकती है इसलिए एक अलग सूचक या संदर्भ प्रकार होना चाहिए। | ||
एक न्यूनतम | एक न्यूनतम नियम के रूप में एक प्रकार-सुरक्षित भाषा को विभिन्न प्रकार के आवंटन में डंगलिंग वाले पॉइंटर्स की अनुमति नहीं देनी चाहिए। किंतु अधिकांश भाषाएँ प्रोग्रामर द्वारा परिभाषित अमूर्त डेटा प्रकारों के उचित उपयोग को प्रयुक्त करती हैं तब भी जब यह स्मृति सुरक्षा के लिए या किसी भी प्रकार की भयावह विफलता की रोकथाम के लिए कठिन रूप से आवश्यक नहीं है। आवंटन को इसकी सामग्री का वर्णन करने वाला एक प्रकार दिया गया है और आवंटन की अवधि के लिए यह प्रकार तय किया गया है। यह टाइप-आधारित उपनाम विश्लेषण को यह अनुमान लगाने की अनुमति देता है कि विभिन्न प्रकार के आवंटन अलग-अलग हैं। | ||
अधिकांश प्रकार-सुरक्षित भाषाएँ [[कचरा संग्रह (कंप्यूटर विज्ञान)]] का उपयोग करती हैं। पियर्स कहते हैं | अधिकांश प्रकार-सुरक्षित भाषाएँ [[कचरा संग्रह (कंप्यूटर विज्ञान)|गार्बेज संग्रह (कंप्यूटर विज्ञान)]] का उपयोग करती हैं। पियर्स कहते हैं डंगलिंग वाली सूचक समस्या के कारण एक स्पष्ट डीललोकेशन ऑपरेशन की उपस्थिति में प्रकार की सुरक्षा प्राप्त करना अधिक कठिन है।<ref>{{cite book |last1=Pierce |first1=Benjamin C. |title=प्रकार और प्रोग्रामिंग भाषाएँ|date=2002 |publisher=MIT Press |location=Cambridge, Mass. |isbn=0-262-16209-1 |page=158}}</ref> चूँकि[[ जंग (प्रोग्रामिंग भाषा) ]] को सामान्यतः टाइप-सेफ माना जाता है और गार्बेज संग्रहण के अतिरिक्त मेमोरी सुरक्षा प्राप्त करने के लिए उधार लेने वाले चेकर का उपयोग करता है। | ||
== वस्तु उन्मुख भाषाओं में टाइप सुरक्षा == | == वस्तु उन्मुख भाषाओं में टाइप सुरक्षा == | ||
वस्तु उन्मुख भाषाओं में प्रकार की सुरक्षा | वस्तु उन्मुख भाषाओं में प्रकार की सुरक्षा सामान्यतः इस तथ्य में आंतरिक होती है कि एक प्रकार की प्रणाली उपस्थित है। यह वर्ग परिभाषाओं के संदर्भ में व्यक्त किया गया है। | ||
एक वर्ग (कंप्यूटर विज्ञान) अनिवार्य रूप से इन वस्तुओं को संभालने के लिए एक अनुबंध के रूप में वस्तु-उन्मुख भाषाओं में इससे प्राप्त वस्तुओं की संरचना और एक एपीआई या एपीआई को परिभाषित करता है। | |||
हर बार जब कोई नई वस्तु बनाई जाती है तो वह उस अनुबंध का पालन करेगी। | हर बार जब कोई नई वस्तु बनाई जाती है तो वह उस अनुबंध का पालन करेगी। | ||
प्रत्येक | प्रत्येक कार्य जो एक विशिष्ट वर्ग से प्राप्त वस्तुओं का आदान-प्रदान करता है या एक विशिष्ट [[इंटरफ़ेस (कंप्यूटर विज्ञान)]] को प्रयुक्त करता है, उस अनुबंध का पालन करेगा: इसलिए उस कार्य में उस वस्तु पर अनुमत संचालन केवल वे होंगे जो वस्तु के वर्ग के विधियों से परिभाषित होते हैं जो वस्तु प्रयुक्त करता है कि वस्तु अखंडता संरक्षित रहेगी।<ref>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</ref> | ||
इसके अपवाद वस्तु उन्मुख भाषाएं हैं जो वस्तु संरचना के गतिशील संशोधन की अनुमति देती हैं, या वर्ग विधियों की परिभाषाओं द्वारा लगाए गए बाधाओं को दूर करने के लिए किसी वस्तु की सामग्री को संशोधित करने के लिए [[प्रतिबिंब (कंप्यूटर विज्ञान)]] का उपयोग करती हैं। | इसके अपवाद वस्तु उन्मुख भाषाएं हैं जो वस्तु संरचना के गतिशील संशोधन की अनुमति देती हैं, या वर्ग विधियों की परिभाषाओं द्वारा लगाए गए बाधाओं को दूर करने के लिए किसी वस्तु की सामग्री को संशोधित करने के लिए [[प्रतिबिंब (कंप्यूटर विज्ञान)]] का उपयोग करती हैं। | ||
== विशिष्ट भाषाओं में टाइप सुरक्षा | == विशिष्ट भाषाओं में टाइप सुरक्षा उद्देश्य == | ||
एडीए | |||
{{wikibooks|Ada Programming|Type System}} | {{wikibooks|Ada Programming|Type System}} | ||
[[एडीए प्रोग्रामिंग भाषा]] को [[ अंतः स्थापित प्रणाली ]], [[डिवाइस ड्राइवर]] | [[एडीए प्रोग्रामिंग भाषा]] को [[ अंतः स्थापित प्रणाली ]], [[डिवाइस ड्राइवर]] और [[सिस्टम प्रोग्रामिंग]] के अन्य रूपों के लिए उपयुक्त होने के लिए डिज़ाइन किया गया था किंतु टाइप-सेफ प्रोग्रामिंग को प्रोत्साहित करने के लिए भी इन परस्पर विरोधी लक्ष्यों को हल करने के लिए, एडीए प्रकार-असुरक्षा को विशेष निर्माणों के एक निश्चित सेट तक सीमित करता है जिनके नाम सामान्यतः स्ट्रिंग से प्रारंभ होते हैं {{mono|Unchecked_}}. आवेदन करके एडीए टेक्स्ट की एक इकाई से अनचेक_डीललोकेशन प्रभावी रूप से प्रतिबंधित किया जा सकता है {{mono|pragma Pure}} इस इकाई के लिए यह उम्मीद की जाती है कि प्रोग्रामर उपयोग करेंगे {{mono|Unchecked_}} बहुत सावधानी से और केवल तभी बनाता है जब आवश्यक हो प्रोग्राम जो उनका उपयोग नहीं करते हैं वे टाइप-सेफ हैं। | ||
[[स्पार्क प्रोग्रामिंग भाषा]] | [[स्पार्क प्रोग्रामिंग भाषा]] एडीए का एक उपसमूह है जो इसकी सभी संभावित अस्पष्टताओं और असुरक्षाओं को दूर करता है जबकि एक ही समय में उपलब्ध भाषा सुविधाओं के लिए [[अनुबंध द्वारा डिजाइन]] को जोड़ता है। स्पार्क पूरी तरह से रन टाइम पर आवंटन को अस्वीकार कर डंगलिंग वाले पॉइंटर्स के साथ उद्देश्यों से बचाता है। | ||
एडीए 2012 अनुबंध द्वारा भाषा में ही डिजाइन जोड़ता है (पूर्व- और बाद की स्थितियों के साथ-साथ टाइप अपरिमित के रूप में)। | |||
=== | === C === | ||
{{Wikibooks|C Programming}} | {{Wikibooks|C Programming}} | ||
[[सी (प्रोग्रामिंग भाषा)]] सीमित संदर्भों में टाइप-सुरक्षित है | [[सी (प्रोग्रामिंग भाषा)]] सीमित संदर्भों में टाइप-सुरक्षित है उदाहरण के लिए एक संकलन-समय त्रुटि तब उत्पन्न होती है जब एक पॉइंटर को एक प्रकार की संरचना में एक पॉइंटर को दूसरे प्रकार की संरचना में बदलने का प्रयास किया जाता है, जब तक कि एक स्पष्ट कास्ट का उपयोग नहीं किया जाता है। चूँकि बहुत से सामान्य ऑपरेशन गैर-प्रकार-सुरक्षित हैं उदाहरण के लिए पूर्णांक को प्रिंट करने का सामान्य विधि कुछ इस प्रकार है <code>printf("%d", 12)</code>, जहां <code>%d</code> कहता है <code>printf</code> पूर्णांक तर्क की अपेक्षा करने के लिए रन-टाइम पर (कुछ इस तरह <code>printf("%s", 12)</code> जो कार्य को एक वर्ण-स्ट्रिंग के लिए एक सूचक की अपेक्षा करने के लिए कहता है और फिर भी एक पूर्णांक तर्क प्रदान करता है जिसे संकलक द्वारा स्वीकार किया जा सकता है किंतु अपरिभाषित परिणाम उत्पन्न करेगा।) यह कुछ संकलक (जैसे जीसीसी) द्वारा प्रिंटफ तर्कों और प्रारूप तार आंशिक रूप से कम किया जाता है जो बीच के प्रकार के पत्राचार की जाँच करता है। | ||
=== सी ++ === | इसके अतिरिक्त [[सी (प्रोग्रामिंग भाषा)]] एडीए की तरह अनिर्दिष्ट या अपरिभाषित स्पष्ट रूपांतरण प्रदान करता है; और एडीए के विपरीत इन रूपांतरणों का उपयोग करने वाले मुहावरे बहुत समान हैं और [[सी (प्रोग्रामिंग भाषा)]] को एक प्रकार-असुरक्षित प्रतिष्ठा देने में सहायता की है। उदाहरण के लिए हीप पर मेमोरी आवंटित करने का मानक विधि एक मेमोरी आवंटन कार्य को कॉल करना है, जैसे कि <code>[[malloc]]</code>, एक तर्क के साथ कि कितने बाइट्स की आवश्यकता है। कार्य एक अनटाइप्ड पॉइंटर लौटाता है (टाइप <code>void *</code>), जिसे कॉलिंग कोड को स्पष्ट रूप से या निहित रूप से उचित सूचक प्रकार में डाला जाना चाहिए। सी के पूर्व-मानकीकृत कार्यान्वयन के लिए ऐसा करने के लिए एक स्पष्ट कलाकार की आवश्यकता होती है इसलिए कोड <code>(struct foo *) malloc([[sizeof]](struct foo))</code> स्वीकृत प्रथा बन गई।<ref name="knr">{{cite book | last = Kernighan | author1-link = Brian Kernighan | author2 = Dennis M. Ritchie | author-link2 = Dennis Ritchie | title = सी प्रोग्रामिंग लैंग्वेज| edition = 2nd | publisher = [[Prentice Hall]] | date = March 1988 | location = [[Englewood Cliffs, NJ]] | url = https://archive.org/details/cprogramminglang00bria/page/116 | isbn = 978-0-13-110362-7 | quote = सी में, उचित विधि यह घोषित करना है कि मॉलोक एक पॉइंटर को शून्य पर लौटाता है, फिर पॉइंटर को वांछित प्रकार में कास्ट के साथ स्पष्ट रूप से मजबूर करता है।| page = [https://archive.org/details/cprogramminglang00bria/page/116 116] | url-access = registration }}</ref> | ||
=== C++ === | |||
C++ की कुछ विशेषताएं जो अधिक टाइप-सुरक्षित कोड को बढ़ावा देती हैं: | C++ की कुछ विशेषताएं जो अधिक टाइप-सुरक्षित कोड को बढ़ावा देती हैं: | ||
* [[नया (सी ++)]] ऑपरेटर ऑपरेंड के आधार पर प्रकार का सूचक देता है | * [[नया (सी ++)]] ऑपरेटर ऑपरेंड के आधार पर प्रकार का सूचक देता है जबकि [[malloc|मैलोक]] एक शून्य सूचक देता है। | ||
* सी ++ कोड शून्य पॉइंटर्स के बिना बहुरूपता प्राप्त करने के लिए आभासी कार्यों और [[टेम्पलेट (प्रोग्रामिंग)]] का उपयोग कर सकता है। | * सी ++ कोड शून्य पॉइंटर्स के बिना बहुरूपता प्राप्त करने के लिए आभासी कार्यों और [[टेम्पलेट (प्रोग्रामिंग)]] का उपयोग कर सकता है। | ||
* सुरक्षित कास्टिंग ऑपरेटर | * सुरक्षित कास्टिंग ऑपरेटर जैसे [[गतिशील कास्ट]] जो रन-टाइम टाइप चेकिंग करता है। | ||
* C++11 | *C++11 दृढ़ता से टाइप की गई गणनाओं को पूर्ण रूप से पूर्णांक या अन्य गणना प्रकारों में परिवर्तित नहीं किया जा सकता है। | ||
* C++ | *C++ स्पष्ट रूपांतरण और C++11 स्पष्ट रूपांतरण ऑपरेटर अंतर्निहित प्रकार के रूपांतरणों को रोकते हैं। | ||
=== | ===C#=== | ||
C# टाइप-सुरक्षित है (किंतु स्टेटिकली टाइप-सेफ नहीं) इसमें अनटाइप्ड पॉइंटर्स के लिए समर्थन है, किंतु इसे असुरक्षित कीवर्ड का उपयोग करके एक्सेस किया जाना चाहिए, जिसे कंपाइलर स्तर पर प्रतिबंधित किया जा सकता है। इसमें रन-टाइम कास्ट सत्यापन के लिए अंतर्निहित समर्थन है। कास्ट को कीवर्ड के रूप में उपयोग करके सत्यापित किया जा सकता है जो कास्ट अमान्य होने पर एक शून्य संदर्भ लौटाएगा या सी-स्टाइल कास्ट का उपयोग करके जो कास्ट अमान्य होने पर अपवाद फेंक देगा। सी शार्प सिंटेक्स या रूपांतरण ऑपरेटर देखें। | |||
ऑब्जेक्ट प्रकार (जिससे अन्य सभी प्रकार व्युत्पन्न होते हैं) पर अनुचित निर्भरता C# प्रकार प्रणाली के उद्देश्य को पराजित करने का कठिन परिस्थिति उठाती है। जेनरिक के पक्ष में ऑब्जेक्ट संदर्भों को छोड़ना सामान्यतः उत्तम अभ्यास है, C++ में टेम्प्लेट और जावा में जेनरिक के समान है। | |||
=== जावा === | === जावा === | ||
{{Wikibooks|Java Programming}} | {{Wikibooks|Java Programming}} | ||
[[जावा प्रोग्रामिंग भाषा]] को प्रकार की सुरक्षा को | [[जावा प्रोग्रामिंग भाषा]] को प्रकार की सुरक्षा को प्रयुक्त करने के लिए डिज़ाइन किया गया है। जावा में कुछ भी एक [[वस्तु (कंप्यूटर विज्ञान)]] के अंदर होता है | ||
जावा में कुछ भी एक [[वस्तु (कंप्यूटर विज्ञान)]] के अंदर होता है | |||
और प्रत्येक वस्तु एक [[वर्ग (कंप्यूटर प्रोग्रामिंग)]] का एक उदाहरण है। | और प्रत्येक वस्तु एक [[वर्ग (कंप्यूटर प्रोग्रामिंग)]] का एक उदाहरण है। | ||
प्रकार के सुरक्षा प्रवर्तन को | प्रकार के सुरक्षा प्रवर्तन को प्रयुक्त करने के लिए उपयोग से पहले प्रत्येक वस्तु को मेमोरी आवंटन की आवश्यकता होती है। जावा [[आदिम डेटा प्रकार]] के उपयोग की अनुमति देता है किंतु केवल ठीक से आवंटित वस्तुओं के अंदर है। | ||
जावा [[आदिम डेटा प्रकार]] के उपयोग की अनुमति देता है | |||
कभी-कभी प्रकार की सुरक्षा का एक | कभी-कभी प्रकार की सुरक्षा का एक भाग अप्रत्यक्ष रूप से कार्यान्वित किया जाता है: उदा। वर्ग बड़ा दशमलव इच्छानुसार परिशुद्धता के एक फ़्लोटिंग पॉइंट संख्या का प्रतिनिधित्व करता है किंतु केवल उन संख्याओं को संभालता है जिन्हें परिमित प्रतिनिधित्व के साथ व्यक्त किया जा सकता है। | ||
ऑपरेशन | ऑपरेशन बिगडिसीमल.डिवाइड () बड़ा दशमलव के रूप में व्यक्त दो संख्याओं के विभाजन के रूप में एक नई वस्तु की गणना करता है। | ||
इस | इस स्थिति में यदि विभाजन का कोई परिमित प्रतिनिधित्व नहीं है जैसे कि जब कोई गणना करता है उदा। 1/3 = 0.33333 ..., ऑपरेशन के लिए कोई राउंडिंग मोड परिभाषित नहीं होने पर डिवाइड () विधि अपवाद उठा सकती है।इसलिए पुस्तकालय भाषा के अतिरिक्त यह आश्वासन देता है कि वस्तु वर्ग परिभाषा में निहित अनुबंध का सम्मान करती है। | ||
=== मानक एमएल === | === मानक एमएल === | ||
{{Wikibooks|Standard ML Programming}} | {{Wikibooks|Standard ML Programming}} | ||
मानक एमएल ने शब्दार्थ को | मानक एमएल ने शब्दार्थ को कठिन से परिभाषित किया है और इसे टाइप-सेफ के रूप में जाना जाता है। चूँकि [[न्यू जर्सी के मानक एमएल]] (एसएमएल/एनजे), इसके सिंटैक्टिक वैरिएंट [[Mythryl|मिथाइल]] और [[MLton|एमएलटन]] सहित कुछ कार्यान्वयन पुस्तकालय प्रदान करते हैं जो असुरक्षित संचालन प्रदान करते हैं। इन सुविधाओं का उपयोग अधिकांशतः गैर-एमएल कोड (जैसे सी पुस्तकालयों) के साथ बातचीत करने के लिए उन कार्यान्वयनों के [[विदेशी फ़ंक्शन इंटरफ़ेस|विदेशी कार्य इंटरफ़ेस]] के संयोजन के साथ किया जाता है जिन्हें विशिष्ट विधियों से निर्धारित डेटा की आवश्यकता हो सकती है। एक अन्य उदाहरण स्वयं एसएमएल/एनजे [[रीड-इवल-प्रिंट लूप]] है जिसे उपयोगकर्ता द्वारा दर्ज किए गए एमएल कोड को निष्पादित करने के लिए असुरक्षित संचालन का उपयोग करना चाहिए। | ||
=== मोडुला -2 === | === मोडुला -2 === | ||
मोडुला -2 एक डिजाइन दर्शन के साथ एक दृढ़ता से टाइप की गई भाषा है, जिसमें किसी भी असुरक्षित सुविधाओं को स्पष्ट रूप से असुरक्षित के रूप में चिह्नित करने की आवश्यकता होती है। यह ऐसी सुविधाओं को सिस्टम नामक एक अंतर्निहित छद्म-पुस्तकालय में स्थानांतरित करके प्राप्त किया जाता है | मोडुला -2 एक डिजाइन दर्शन के साथ एक दृढ़ता से टाइप की गई भाषा है, जिसमें किसी भी असुरक्षित सुविधाओं को स्पष्ट रूप से असुरक्षित के रूप में चिह्नित करने की आवश्यकता होती है। यह ऐसी सुविधाओं को सिस्टम नामक एक अंतर्निहित छद्म-पुस्तकालय में स्थानांतरित करके प्राप्त किया जाता है जहां से उनका उपयोग करने से पहले उन्हें आयात किया जाना चाहिए। इस प्रकार जब ऐसी सुविधाओं का उपयोग किया जाता है तो आयात इसे दृश्यमान बनाता है। दुर्भाग्य से यह मूल भाषा सूची और उसके कार्यान्वयन में फलस्वरूप प्रयुक्त नहीं किया गया था।<ref>{{cite book|author=Niklaus Wirth|title=Programming in Modula-2|publisher=Springer Verlag|date=1985}}</ref> टाइप कास्ट सिंटैक्स और वैरिएंट रिकॉर्ड (पास्कल से विरासत में मिली) जैसी असुरक्षित सुविधाएं अभी भी बनी हुई हैं जिनका उपयोग बिना पूर्व आयात के किया जा सकता है।<ref name="knightsoftype.blogspot.com">{{cite web|title=सुरक्षित और असुरक्षित सुविधाओं का पृथक्करण|url=http://knightsoftype.blogspot.com/2013/12/the-separation-of-safe-and-unsafe.html|access-date=24 March 2015}}</ref> सिस्टम स्यूडो-मॉड्यूल में इन सुविधाओं को स्थानांतरित करने में कठिनाई सुविधा के लिए किसी भी पहचानकर्ता की कमी थी जिसे तब आयात किया जा सकता था क्योंकि केवल पहचानकर्ताओं को आयात किया जा सकता था किंतु सिंटैक्स नहीं है ।<syntaxhighlight> | ||
IMPORT SYSTEM; (* allows the use of certain unsafe facilities: *) | |||
VAR word : SYSTEM.WORD; addr : SYSTEM.ADDRESS; | |||
addr := SYSTEM.ADR(word); | |||
<वाक्यविन्यास लैंग = मॉड्यूल 2> | (* but type cast syntax can be used without such import *) | ||
VAR i : INTEGER; n : CARDINAL; | |||
n := CARDINAL(i); (* or *) i := INTEGER(n); | |||
</syntaxhighlight>'''<वाक्यविन्यास लैंग = मॉड्यूल 2> | |||
आयात प्रणाली; (* कुछ असुरक्षित सुविधाओं के उपयोग की अनुमति देता है: *) | आयात प्रणाली; (* कुछ असुरक्षित सुविधाओं के उपयोग की अनुमति देता है: *) | ||
वर शब्द : प्रणाली। शब्द; पता: सिस्टम.एड्रेस; | वर शब्द : प्रणाली। शब्द; पता: सिस्टम.एड्रेस; | ||
Addr := SYSTEM.ADR(शब्द); | Addr := SYSTEM.ADR(शब्द);''' | ||
(* | '''(* किंतु टाइप कास्ट सिंटैक्स का उपयोग ऐसे आयात के बिना किया जा सकता है *) | ||
वर मैं : पूर्णांक; n : कार्डिनल; | वर मैं : पूर्णांक; n : कार्डिनल; | ||
एन: = कार्डिनल (i); (* या *) मैं := पूर्णांक (एन); | एन: = कार्डिनल (i); (* या *) मैं := पूर्णांक (एन); | ||
</वाक्यविन्यास हाइलाइट> | </वाक्यविन्यास हाइलाइट>''' | ||
आईएसओ मोडुला-2 मानक ने टाइप कास्ट सिंटैक्स को कास्ट नामक कार्य में बदलकर टाइप कास्ट सुविधा के लिए इसे सही किया जिसे स्यूडो-मॉड्यूल सिस्टम से आयात किया जाना है। चूँकि अन्य असुरक्षित सुविधाएं जैसे वेरिएंट रिकॉर्ड छद्म-मॉड्यूल सिस्टम से किसी आयात के बिना उपलब्ध रहीं है।<ref>{{cite web|title=ISO Modula-2 Language Reference|url=http://www.excelsior-usa.com/doc/xds/isom2.html|access-date=24 March 2015}}</ref> | |||
'''<वाक्यविन्यास लैंग = मॉड्यूल 2> | |||
<वाक्यविन्यास लैंग = मॉड्यूल 2> | |||
आयात प्रणाली; | आयात प्रणाली; | ||
वर मैं : पूर्णांक; n : कार्डिनल; | वर मैं : पूर्णांक; n : कार्डिनल; | ||
i := सिस्टम.कास्ट (इंटीजर, एन); (*ISO Modula-2* में टाइप कास्ट) | i := सिस्टम.कास्ट (इंटीजर, एन); (*ISO Modula-2* में टाइप कास्ट) | ||
</वाक्यविन्यास हाइलाइट> | </वाक्यविन्यास हाइलाइट>'''<syntaxhighlight> | ||
IMPORT SYSTEM; | |||
VAR i : INTEGER; n : CARDINAL; | |||
i := SYSTEM.CAST(INTEGER, n); (* Type cast in ISO Modula-2 *) | |||
</syntaxhighlight>भाषा के एक वर्तमान संशोधन ने मूल डिजाइन दर्शन को कठोरता से प्रयुक्त किया। सबसे पहले स्यूडो-मॉड्यूल सिस्टम का नाम बदलकर असुरक्षित कर दिया गया जिससे वहाँ से आयातित सुविधाओं की असुरक्षित प्रकृति को और अधिक स्पष्ट किया जा सकता है। फिर सभी शेष असुरक्षित सुविधाएं जहां या तो पूरी तरह से हटा दी गईं (उदाहरण के लिए संस्करण रिकॉर्ड) या छद्म-मॉड्यूल असुरक्षित में स्थानांतरित कर दी गईं। उन सुविधाओं के लिए जहां कोई पहचानकर्ता नहीं है जिसे आयात किया जा सकता है सक्षम पहचानकर्ता प्रस्तुत किए गए थे। ऐसी सुविधा को सक्षम करने के लिए इसके संबंधित सक्षम करने वाले पहचानकर्ता को छद्म-मॉड्यूल असुरक्षित से आयात किया जाना चाहिए। उस भाषा में कोई भी असुरक्षित सुविधा नहीं रहती जिसे असुरक्षित से आयात करने की आवश्यकता नहीं है।<ref name="knightsoftype.blogspot.com" /> | |||
<syntaxhighlight> | |||
IMPORT UNSAFE; | |||
VAR i : INTEGER; n : CARDINAL; | |||
i := UNSAFE.CAST(INTEGER, n); (* Type cast in Modula-2 Revision 2010 *) | |||
<वाक्यविन्यास लैंग = मॉड्यूल 2> | FROM UNSAFE IMPORT FFI; (* enabling identifier for foreign function interface facility *) | ||
<*FFI="C"*> (* pragma for foreign function interface to C *) | |||
</syntaxhighlight>'''<वाक्यविन्यास लैंग = मॉड्यूल 2> | |||
असुरक्षित आयात करें; | असुरक्षित आयात करें; | ||
वर मैं : पूर्णांक; n : कार्डिनल; | वर मैं : पूर्णांक; n : कार्डिनल; | ||
मैं := असुरक्षित कास्ट (पूर्णांक, एन); (*मोडुला-2 संशोधन 2010 में टाइप कास्ट*) | मैं := असुरक्षित कास्ट (पूर्णांक, एन); (*मोडुला-2 संशोधन 2010 में टाइप कास्ट*)''' | ||
असुरक्षित आयात एफएफआई से; (* विदेशी | '''असुरक्षित आयात एफएफआई से; (* विदेशी कार्य इंटरफ़ेस सुविधा के लिए पहचानकर्ता को सक्षम करना *) | ||
<*FFI= C *> (* विदेशी | <*FFI= C *> (* विदेशी कार्य इंटरफ़ेस के लिए C * के लिए pragma) | ||
</वाक्यविन्यास हाइलाइट> | </वाक्यविन्यास हाइलाइट>''' | ||
=== पास्कल === | === पास्कल === | ||
{{Wikibooks|Pascal Programming}} | {{Wikibooks|Pascal Programming}} | ||
[[ पास्कल (प्रोग्रामिंग भाषा) ]] में कई प्रकार की सुरक्षा आवश्यकताएं होती हैं, जिनमें से कुछ को कुछ कंपाइलरों में रखा जाता है। जहां एक पास्कल कंपाइलर सख्त टाइपिंग को निर्देशित करता है | [[ पास्कल (प्रोग्रामिंग भाषा) ]] में कई प्रकार की सुरक्षा आवश्यकताएं होती हैं, जिनमें से कुछ को कुछ कंपाइलरों में रखा जाता है। जहां एक पास्कल कंपाइलर सख्त टाइपिंग को निर्देशित करता है दो चर एक दूसरे को तब तक नहीं सौंपे जा सकते जब तक कि वे या तो संगत न हों (जैसे कि पूर्णांक को वास्तविक में बदलना) या समान उपप्रकार को सौंपा गया हो। उदाहरण के लिए यदि आपके पास निम्न कोड खंड है: | ||
<syntaxhighlight lang="pascal"> | <syntaxhighlight lang="pascal"> | ||
Line 169: | Line 187: | ||
D1, D2: DualTypes; | D1, D2: DualTypes; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
सख्त टाइपिंग के तहत | |||
सख्त टाइपिंग के तहत {{mono|TwoTypes}} के रूप में परिभाषित एक चर {{mono|DualTypes}} के साथ संगत नहीं है (क्योंकि वे समान नहीं हैं, तथापि उस उपयोगकर्ता परिभाषित प्रकार के घटक समान हों) और<code>T1 := D2;</code> अवैध है। का एक कार्य <code>T1 := T2;</code>नियमबद्ध होगा क्योंकि जिन उपप्रकारों को परिभाषित किया गया है वे समान हैं। चूँकि एक असाइनमेंट जैसे<code>T1.Q := D1.Q;</code> नियमबद्ध होगा। | |||
=== [[सामान्य लिस्प]] === | === [[सामान्य लिस्प]] === | ||
सामान्यतः सामान्य लिस्प एक प्रकार की सुरक्षित भाषा है। एक सामान्य लिस्प संकलक संचालन के लिए गतिशील जांच डालने के लिए उत्तरदाई होता है जिसकी प्रकार की सुरक्षा को स्थिर रूप से सिद्ध नहीं किया जा सकता है। चूँकि एक प्रोग्रामर संकेत दे सकता है कि एक प्रोग्राम को गतिशील टाइप-चेकिंग के निम्न स्तर के साथ संकलित किया जाना चाहिए।<ref>{{cite web|title=सामान्य लिस्प हाइपरस्पेक|url=http://www.lispworks.com/documentation/HyperSpec/Body/d_optimi.htm|access-date=26 May 2013}}</ref> ऐसे मोड में संकलित प्रोग्राम को टाइप-सेफ नहीं माना जा सकता है। | |||
== | == C++उदाहरण == | ||
निम्न उदाहरण दिखाता है कि गलत | निम्न उदाहरण दिखाता है कि गलत विधि से उपयोग किए जाने पर C++ कास्ट ऑपरेटर टाइप सुरक्षा को कैसे तोड़ सकते हैं। पहला उदाहरण दिखाता है कि मूलभूत डेटा प्रकारों को गलत विधि से कैसे डाला जा सकता है: | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
#include <iostream> | #include <iostream> | ||
Line 187: | Line 207: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
इस उदाहरण में, <code>reinterpret_cast</code> स्पष्ट रूप से संकलक को पूर्णांक से फ़्लोटिंग-पॉइंट मान में सुरक्षित रूपांतरण करने से रोकता है।<ref>{{cite web|url=http://en.cppreference.com/w/cpp/language/reinterpret_cast |title=reinterpret_cast conversion - cppreference.com |publisher=En.cppreference.com |date= |accessdate=2022-09-21}}</ref> जब प्रोग्राम चलता है तो यह | |||
अगला उदाहरण दिखाता है कि कैसे वस्तु संदर्भों को गलत | |||
इस उदाहरण में, <code>reinterpret_cast</code>स्पष्ट रूप से संकलक को पूर्णांक से फ़्लोटिंग-पॉइंट मान में सुरक्षित रूपांतरण करने से रोकता है।<ref>{{cite web|url=http://en.cppreference.com/w/cpp/language/reinterpret_cast |title=reinterpret_cast conversion - cppreference.com |publisher=En.cppreference.com |date= |accessdate=2022-09-21}}</ref> जब प्रोग्राम चलता है तो यह गार्बेज फ़्लोटिंग-पॉइंट वैल्यू आउटपुट करेगा। इसके अतिरिक्त <code>float fval = ival;</code> लिखकर समस्या से बचा जा सकता था। | |||
अगला उदाहरण दिखाता है कि कैसे वस्तु संदर्भों को गलत विधि से डाउनकास्ट किया जा सकता है: | |||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
#include <iostream> | #include <iostream> | ||
Line 217: | Line 240: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
दो चाइल्ड वर्गों में विभिन्न प्रकार के सदस्य होते हैं। चाइल्ड क्लास पॉइंटर को पैरेंट क्लास पॉइंटर को डाउनकास्ट करते समय परिणामी पॉइंटर सही प्रकार की वैध वस्तु को इंगित नहीं कर सकता है। उदाहरण में, इससे गारबेज वैल्यू प्रिंट हो जाती है। <code>static_cast</code>को <code>dynamic_cast</code> से बदलकर समस्या से बचा जा सकता था जो अमान्य कास्ट्स पर एक अपवाद फेंकता है।<ref>{{cite web|url=http://en.cppreference.com/w/cpp/language/dynamic_cast |title=dynamic_cast conversion - cppreference.com |publisher=En.cppreference.com |date= |accessdate=2022-09-21}}</ref> | |||
== यह भी देखें == | == यह भी देखें == | ||
* [[ प्रकार सिद्धांत ]] | * [[ प्रकार सिद्धांत ]] |
Revision as of 12:35, 26 May 2023
Type systems |
---|
General concepts |
Major categories |
|
Minor categories |
कंप्यूटर विज्ञान में, प्रकार की सुरक्षा और प्रकार की शक्ति वह सीमा है जिस तक एक प्रोग्रामिंग भाषा प्रकार की त्रुटियों को हतोत्साहित करती है या रोकती है। प्रकार की सुरक्षा को कभी-कभी वैकल्पिक रूप से कंप्यूटर भाषा की सुविधाओं की गुण माना जाता है अर्थात्, कुछ सुविधाएं टाइप-सेफ हैं और उनके उपयोग के परिणामस्वरूप त्रुटि प्रकार नहीं होंगे जबकि उसी भाषा में अन्य सुविधाएं टाइप-असुरक्षित हो सकती हैं और उनका उपयोग करने वाला प्रोग्राम टाइप एरर का सामना कर सकता है। किसी दी गई प्रोग्रामिंग भाषा द्वारा प्रकार की त्रुटियों के रूप में वर्गीकृत व्यवहार सामान्यतः वे होते हैं जो मान (कंप्यूटर विज्ञान) पर संचालन करने के प्रयासों के परिणामस्वरूप होते हैं जो उपयुक्त डेटा प्रकार के नहीं होते हैं उदाहरण के लिए एक स्ट्रिंग को एक पूर्णांक में जोड़ना जब कोई परिभाषा नहीं होती है इस स्थिति को संभालने के लिए यह वर्गीकरण आंशिक रूप से राय पर आधारित है।
प्रकार प्रवर्तन स्थिर हो सकता है संकलन समय पर संभावित त्रुटियों को पकड़ना या गतिशील प्रकार की जानकारी को रन टाइम (प्रोग्राम जीवनचक्र चरण) रन-टाइम पर मानो के साथ जोड़ना और आसन्न त्रुटियों का पता लगाने के लिए आवश्यकतानुसार परामर्श करना या दोनों का संयोजन गतिशील प्रकार प्रवर्तन अधिकांशतः उन प्रोग्रामों को चलाने की अनुमति देता है जो स्थिर प्रवर्तन के तहत अमान्य होंगे।
स्थैतिक (संकलन-समय) प्रकार की प्रणालियों के संदर्भ में प्रकार की सुरक्षा में सामान्यतः (अन्य बातों के अतिरिक्त ) एक आश्वासन सम्मिलित होती है कि किसी भी अभिव्यक्ति (प्रोग्रामिंग) का अंतिम मान उस अभिव्यक्ति के स्थिर प्रकार का एक वैध सदस्य होगा। स्पष्ट आवश्यकता इससे कहीं अधिक सूक्ष्म है - उदाहरण के लिए जटिलताओं के लिए उपप्रकार और बहुरूपता (कंप्यूटर विज्ञान) देखें।
परिभाषाएँ
सहज रूप से टाइप साउंडनेस रॉबिन मिलनर के सारगर्भित कथन द्वारा पकड़ी गई है
- अच्छी तरह से टाइप किए गए प्रोग्राम गलत नहीं हो सकते।[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>
आयात प्रणाली; (* कुछ असुरक्षित सुविधाओं के उपयोग की अनुमति देता है: *) वर शब्द : प्रणाली। शब्द; पता: सिस्टम.एड्रेस; Addr := SYSTEM.ADR(शब्द);
(* किंतु टाइप कास्ट सिंटैक्स का उपयोग ऐसे आयात के बिना किया जा सकता है *) वर मैं : पूर्णांक; n : कार्डिनल; एन: = कार्डिनल (i); (* या *) मैं := पूर्णांक (एन); </वाक्यविन्यास हाइलाइट>
आईएसओ मोडुला-2 मानक ने टाइप कास्ट सिंटैक्स को कास्ट नामक कार्य में बदलकर टाइप कास्ट सुविधा के लिए इसे सही किया जिसे स्यूडो-मॉड्यूल सिस्टम से आयात किया जाना है। चूँकि अन्य असुरक्षित सुविधाएं जैसे वेरिएंट रिकॉर्ड छद्म-मॉड्यूल सिस्टम से किसी आयात के बिना उपलब्ध रहीं है।[17]
<वाक्यविन्यास लैंग = मॉड्यूल 2>
आयात प्रणाली;
वर मैं : पूर्णांक; n : कार्डिनल;
i := सिस्टम.कास्ट (इंटीजर, एन); (*ISO Modula-2* में टाइप कास्ट)
</वाक्यविन्यास हाइलाइट>
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.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.0 2.1 Saraswat, Vijay (1997-08-15). "जावा टाइप-सेफ नहीं है". Retrieved 2008-10-08.
- ↑ 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.
- ↑ 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.
- ↑ Tofte, Mads (1988). परिचालन शब्दार्थ और बहुरूपी प्रकार का अनुमान (Thesis) (in English).
- ↑ 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.
- ↑ Standard ML. Smlnj.org. Retrieved on 2013-11-02.
- ↑ "सिस्टम.आईओ.असुरक्षित". GHC libraries manual: base-3.0.1.0. Archived from the original on 2008-07-05. Retrieved 2008-07-17.
- ↑ Liskov, B; Zilles, S (1974). "अमूर्त डेटा प्रकारों के साथ प्रोग्रामिंग". ACM SIGPLAN Notices. 9 (4): 50–59. CiteSeerX 10.1.1.136.3043. doi:10.1145/942572.807045.
- ↑ 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.
- ↑ "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) - ↑ Pierce, Benjamin C. (2002). प्रकार और प्रोग्रामिंग भाषाएँ. Cambridge, Mass.: MIT Press. p. 158. ISBN 0-262-16209-1.
- ↑ 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
- ↑ Kernighan; Dennis M. Ritchie (March 1988). सी प्रोग्रामिंग लैंग्वेज (2nd ed.). Englewood Cliffs, NJ: Prentice Hall. p. 116. ISBN 978-0-13-110362-7.
सी में, उचित विधि यह घोषित करना है कि मॉलोक एक पॉइंटर को शून्य पर लौटाता है, फिर पॉइंटर को वांछित प्रकार में कास्ट के साथ स्पष्ट रूप से मजबूर करता है।
- ↑ Niklaus Wirth (1985). Programming in Modula-2. Springer Verlag.
- ↑ 16.0 16.1 "सुरक्षित और असुरक्षित सुविधाओं का पृथक्करण". Retrieved 24 March 2015.
- ↑ "ISO Modula-2 Language Reference". Retrieved 24 March 2015.
- ↑ "सामान्य लिस्प हाइपरस्पेक". Retrieved 26 May 2013.
- ↑ "reinterpret_cast conversion - cppreference.com". En.cppreference.com. Retrieved 2022-09-21.
- ↑ "dynamic_cast conversion - cppreference.com". En.cppreference.com. Retrieved 2022-09-21.
संदर्भ
- Pierce, Benjamin C. (2002). Types and Programming Languages. MIT Press. ISBN 978-0-262-16209-8.
- "Type Safe". Portland Pattern Repository Wiki.
- Wright, Andrew K.; Matthias Felleisen (1994). "A Syntactic Approach to Type Soundness". Information and Computation. 115 (1): 38–94. doi:10.1006/inco.1994.1093.
- Macrakis, Stavros (April 1982). "Safety and power". ACM SIGSOFT Software Engineering Notes. 7 (2): 25–26. doi:10.1145/1005937.1005941. S2CID 10426644.