क्या "अप्रतिबंधित" का अर्थ शैक्षणिक सीएस दुनिया में "गतिशील रूप से टाइप किया गया" भी है?


166

मैं एक स्लाइड डेक पढ़ रहा हूं जिसमें कहा गया है कि "जावास्क्रिप्ट अप्रकाशित है।" यह विरोधाभास था कि मुझे क्या सच लगता है इसलिए मैंने कोशिश करने और अधिक जानने के लिए खुदाई करना शुरू कर दिया।

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

इसलिए मैंने ब्रेंडन आइच, जावास्क्रिप्ट के निर्माता से पूछा, और उन्होंने कहा:

अकादमिक प्रकार "बिना किसी स्थिर प्रकार" का अर्थ करने के लिए "अप्रकाशित" का उपयोग करते हैं। वे देखने में काफी स्मार्ट हैं कि मानों के प्रकार (डुह!) हैं। संदर्भ मायने रखता है।

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

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

(मैंने एक शीर्ष स्माल्टकर को यह भी कहा है कि स्मॉलटाक "अप्रतिष्ठित" भी है, इसलिए यह एक-बंद नहीं है जो मुझे इस खोज पर सेट करता है! :-)


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

2
मैंने हमेशा इसे लिया, चर इस बात से अप्रभावित हैं कि कोई भी चर किसी भी प्रकार के डेटा को धारण कर सकता है। चर में जो है उसका प्रकार गतिशील रूप से बदल सकता है ।
इज़्काता


1
इसके अलावा (फिर से कंप्यूटर भाषाओं की तुलना में प्राकृतिक भाषा के बारे में अधिक) "अनकैप्ड" = "एकल-टाइप्ड" (सभी मूल्यों के लिए एक प्रकार)।
फिलीपिक्सी

जवाबों:


148

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

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

उदाहरण के लिए, यहाँ "प्रकार प्रणाली" की परिभाषा है जो बेंजामिन पियर्स अपनी मानक पाठ पुस्तक प्रकारों और प्रोग्रामिंग भाषाओं में उपयोग करता है :

एक प्रकार की प्रणाली उन वाक्यांशों के प्रकारों के अनुसार वाक्यांशों को वर्गीकृत करके कुछ प्रोग्राम व्यवहारों की अनुपस्थिति को साबित करने के लिए एक ट्रैक्टेबल सिंटैक्टिक विधि है।

उन्होंने यह भी टिप्पणी की:

शब्द "स्थिर" कभी-कभी स्पष्ट रूप से जोड़ा जाता है - हम एक "सांख्यिकीय रूप से टाइप की गई प्रोग्रामिंग भाषा" की बात करते हैं, उदाहरण के लिए - संकलन-समय विश्लेषण के प्रकारों को अलग करने के लिए जो हम भाषाओं में पाए जाने वाले गतिशील या अव्यक्त टाइपिंग से यहां पर विचार कर रहे हैं। स्कीम (सूसमैन एंड स्टील, 1975; केल्सी, क्लिंजर, और रीस, 1998; डायबविग, 1996), जहां रन-टाइम टाइप टैग्स का उपयोग। Erent प्रकार की संरचनाओं को ढेर में भेद करने के लिए किया जाता है। "डायनेमिक रूप से टाइप किए गए" जैसे शब्द यकीनन गलत हैं और इन्हें संभवतः "डायनामिकली चेक किया गया", लेकिन उपयोग मानक है।

इस क्षेत्र में काम करने वाले अधिकांश लोग इस दृष्टिकोण को साझा करते हैं।

ध्यान दें कि इसका मतलब यह नहीं है कि "अप्रकाशित" और "गतिशील रूप से टाइप किए गए" समानार्थक शब्द हैं। बल्कि, यह कि पूर्व के किसी विशेष मामले के लिए उत्तरार्द्ध एक (तकनीकी रूप से भ्रामक) नाम है।

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


5
यह है बहुत ही उपयोगी और यहां तक कि यह करने के लिए कुछ इतिहास उपलब्ध कराने के मामले में मेरी पसंदीदा जवाब हो सकता है।
पीटर कूपर

2
@PeterCooper btw आपको यह जानने में दिलचस्पी हो सकती है कि औपचारिक शब्दार्थ की एक प्रमुख शाखा टाइप किए गए लंबोदी गणना पर विधेय (एक वाक्य) है; जैसे कि मोंटेग शब्दार्थ। लेकिन एक घोषणात्मक, गैर-जनन प्रणाली के रूप में मैंने व्यक्तिगत रूप से हमेशा मोंटागे सेमेंटिक्स जैसे सिस्टम में टाइपिंग को प्रोग्रामिंग भाषाओं में टाइप करने से दूर रखा है।
पता है कि

+1। "[dynamically typed] is a (technically misleading) name for a particular case of [untyped]"
स्टीव

1
यह "प्रकार" के इतिहास के बारे में बिल्कुल सही नहीं है। वे लांबा-कैलकुलस पर चर्च के काम से भी पुराने हैं। रसेल ने सेट सिद्धांत के निर्माण में विरोधाभासों से बचने के लिए प्रकारों का उपयोग किया।
सैम टोबिन-होचस्टाट

1
@ सैमटोबिन-होचस्टाट, हाँ, सही है। मैंने केवल इतिहास के उस हिस्से के बारे में बात की है जो सीधे पीएल की नींव की चिंता करता है। मैं स्पष्ट कर दूंगा।
एंड्रियास रॉसबर्ग

68

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

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

PS शुद्ध लैम्ब्डा कैलकुलस में, केवल "मान" सामान्य रूप में शब्द हैं, और सामान्य रूप में एकमात्र बंद शब्द फ़ंक्शन हैं। लेकिन ज्यादातर वैज्ञानिक जो लैम्ब्डा कैलकुलस का उपयोग करते हैं, वे आधार प्रकार और स्थिरांक जोड़ते हैं, और फिर आप या तो लैम्बडा के लिए एक स्थिर प्रकार की प्रणाली को शामिल करते हैं या आप डायनामिक टाइप टैग में वापस आ जाते हैं।

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


12
मुझे लगता है कि सीएस (शिक्षाविदों सहित) में एक व्यापक मुद्दा है कि नामों का उपयोग बिना कठोर परिभाषा के किया जाता है। यह गणित के विपरीत है और (सबसे?) विज्ञान। उचित परिभाषाओं के इस अभाव से बड़ी संख्या में विवाद (जैसे OOP के बारे में) लगता है। बहुत कष्टप्रद।
कोनराड रुडोल्फ

2
@KonradRudolph: मुझे आश्चर्य है कि, उचित परिभाषाओं की कमी से उत्पन्न विवादों के बजाय, उचित परिभाषाओं की कमी विवादों से भाग में उत्पन्न हो सकती है। कुछ शब्द एक भावनात्मक वैल्यू प्राप्त करते हैं (यह सकारात्मक या नकारात्मक हो), और विशिष्ट भाषाओं के समर्थक फिर उन शब्दों को उन तरीकों से परिभाषित करते हैं जो उनकी भाषाओं को शामिल या बाहर करते हैं (और अपनी पसंदीदा "दुश्मन" भाषाओं को शामिल करते हैं)। एक गणित उदाहरण के लिए - यदि अभी भी लोग स्वयंसिद्ध सेट सिद्धांत पर भोले सेट सिद्धांत का समर्थन कर रहे थे, तो आप यह सुनिश्चित कर सकते हैं कि वे अपने स्वयं के विचारों को "स्वयंसिद्ध सेट सिद्धांत"
कहेंगे

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

5
@ नोर्मन: जब प्रोग्रामिंग भाषाओं और विशेष रूप से टाइप सिस्टम की बात आती है, तो आपको लगता है कि विकिपीडिया पर जानकारी खराब गुणवत्ता की है, इसे अकेले न छोड़ें और इसमें सुधार करें। (सिर्फ ट्रोलिंग)
गोमो

3
@ गयूम ने विकिपीडिया को सुधारने के दिन मुझे अहसास दिलाया कि विकिपीडिया की प्रक्रिया में बदलाव आता है , विशेषज्ञता नहीं । मेरा समय एसओ :-) को बेहतर बनाने में बिताया जाता है
नॉर्मन रैमसे

43

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

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

[ लिंक ] (ध्यान दें: मूल में बोल्डिंग) और इस तरह से "अनकैप्ड" का उपयोग करने के लिए जाता है।

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


जोड़ने के लिए संपादित: आप "untyped languages"Google पुस्तक खोज में प्लग इन करके अधिक उदाहरण पा सकते हैं । उदाहरण के लिए:

[...] यह प्राथमिक सूचना-छुपा तंत्र है जो कई अप्राप्त भाषाएं हैं। उदाहरण के लिए PLT योजना [4] जेनेरिक structs का उपयोग करती है , […]

- जैकब मैथ्यूज और अमल अहमद, 2008 [ लिंक ]

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

- चार्ल्स कॉंसेल, 1990 [ लिंक ]

वैसे, इन खोज परिणामों को देखने के बाद, मेरी धारणा यह है कि यदि कोई शोधकर्ता "अनकैप्ड" कार्यात्मक भाषा के बारे में लिखता है, तो वह बहुत ही संभावित रूप से इसे "अनकैप्ड" मानता है, जैसे कि अनकैप्ड लैम्ब्डा कैलकुलस कि एडम Mihalcin का उल्लेख है। कम से कम, कई शोधकर्ताओं ने एक ही सांस में योजना और लैम्ब्डा पथरी का उल्लेख किया।

निश्चित रूप से खोज यह नहीं कहती है कि क्या ऐसे शोधकर्ता हैं जो इस पहचान को अस्वीकार करते हैं, और इन भाषाओं को "अप्राप्त" नहीं मानते हैं। खैर, मुझे यह पता चला:

मैंने तब महसूस किया कि वास्तव में कोई परिपत्रता नहीं है, क्योंकि गतिशील रूप से टाइप की गई भाषाएं अनकैप्ड भाषा नहीं हैं - यह सिर्फ इतना है कि प्रोग्राम पाठ से प्रकार आमतौर पर तुरंत स्पष्ट नहीं होते हैं।

- कोई (मैं नहीं बता सकता), 1998 [ लिंक ]

लेकिन जाहिर है कि इस पहचान को अस्वीकार करने वाले अधिकांश लोगों को स्पष्ट रूप से ऐसा कहने की आवश्यकता महसूस नहीं होगी।


2
वाह। चौंका देने वाला। जानकारी के लिए धन्यवाद।
दोपहर

बिल्कुल प्रशस्ति पत्र की तरह मैं देख रहा था, धन्यवाद! किंडा मुझे डराता है कि पुस्तक में अमेज़ॅन पर औसतन 2 स्टार हैं, हालांकि इतने अधिक उद्धरणों का स्वागत किया गया है, लेकिन यह एक शानदार शुरुआत है।
पीटर कूपर

@PeterCooper: मैंने और उद्धरण जोड़ने के लिए अपना उत्तर संपादित किया है। वे प्रकाशित कागजात से अमेज़ॅन-रेटिंग की समस्या को दरकिनार करते हैं: सभी के लिए मैं जानता हूं, वे अभी भी कचरा हो सकते हैं, लेकिन कम से कम हमें अमेज़न को ऐसा बताने के बारे में चिंता करने की ज़रूरत नहीं है। :-P
बर्बाद करें

"डायनामिक टाइप" के साथ "अनपेड" ​​को भ्रमित करना अतार्किक है। डेवलपर्स को अतार्किक नहीं होना चाहिए।
रोटमैन

10

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

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


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

5
@ कचरा बाहर कचरा डालना किसी भी प्रोग्रामिंग भाषा के लिए मामला है, और प्रकार की धारणा से संबंधित नहीं है। यहां तक ​​कि ओमेक्एल या एसएमएल जैसी जोरदार टाइप की गई भाषा में भी मैं उत्तरी ध्रुव को एक ऐसे फंक्शन में पास कर सकता हूं, जो "मेरे लक्ष्य से दूरी" की गणना करता है (और नहीं, मेरी वर्तमान स्थिति उत्तरी ध्रुव नहीं है)।
एडम मिहलसिन

शिक्षाविदों से बाहर के लोगों के लिए बस जोड़ना चाहते थे: असेंबली जैसे सामान को भी अनपेड के रूप में गिना जाएगा।
CoffeeTableEspresso

6

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

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

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


5
मुझे लगता है कि मुख्य अंतर मूल्यों और चर के बीच नहीं है , बल्कि मूल्यों और अभिव्यक्तियों के बीच है : एक सांख्यिकीय रूप से टाइप की गई भाषा में, भावों के प्रकार होते हैं, जबकि एक गतिशील रूप से टाइप की गई भाषा में, केवल मान होता है। (चर-नाम एक प्रकार की अभिव्यक्ति है, निश्चित रूप से।)
खंड

4

यह प्रश्न सभी शब्दार्थों के बारे में है

अगर मैं आपको यह डेटा देता हूं: 12यह किस प्रकार का है? आपके पास निश्चित रूप से जानने का कोई तरीका नहीं है। एक पूर्णांक हो सकता है - एक फ्लोट हो सकता है - एक स्ट्रिंग हो सकता है। इस अर्थ में यह बहुत "अनकैप्ड" डेटा है।

अगर मैं आपको एक काल्पनिक भाषा देता हूं, जो आपको इस डेटा पर "ऐड", "सबट्रेक्ट", और "कॉन्कैटनेट" जैसे ऑपरेटरों का उपयोग करने देता है और डेटा का कुछ अन्य मनमाना टुकड़ा "प्रकार" कुछ हद तक अप्रासंगिक है (मेरी काल्पनिक भाषा के लिए (उदाहरण) : शायद add(12, a)पैदावार 109जो 12की ascii मूल्य से अधिक है a)।

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

हालाँकि - और ब्रेंडन की बात पर - अगर मैंने आपको बताया कि "मेरी उम्र है 12" - तो 12एक प्रकार है - कम से कम हम जानते हैं कि मैं संख्यात्मक है। संदर्भ के साथ सब कुछ एक प्रकार का है - भाषा की परवाह किए बिना।

यही कारण है कि मैंने शुरुआत में कहा - आपका प्रश्न शब्दार्थ में से एक है। "अनकैप्ड" का अर्थ क्या है? मुझे लगता है कि जब ब्रेंडन ने "कोई स्थिर प्रकार नहीं" कहा तो सिर पर कील ठोक दी - क्योंकि यह सब संभवतः इसका मतलब हो सकता है। मनुष्य स्वाभाविक रूप से चीजों को प्रकारों में वर्गीकृत करता है। हम सहज रूप से जानते हैं कि एक कार और एक बंदर के बीच मौलिक रूप से कुछ अलग है - उन भेदों को बनाने के लिए कभी भी सिखाया नहीं जाता है।

शुरुआत में मेरे उदाहरण पर वापस लौटते हुए - एक ऐसी भाषा जो "प्रकारों की परवाह नहीं करती" (प्रति-से) आपको वाक्यविन्यास त्रुटि पैदा किए बिना "उम्र" और "नाम" जोड़ सकती है ... लेकिन इसका मतलब यह नहीं है कि यह एक तार्किक रूप से ध्वनि संचालन है।

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

एक प्रणाली / भाषा है जो संकलन / निर्माण / व्याख्या समय "अनकैप्ड" या "डायनामिक टाइप" पर प्रकार की सुरक्षा को लागू नहीं करती है?

शब्दार्थ।

संपादित करें

मैं यहां कुछ जोड़ना चाहता था क्योंकि कुछ लोगों को "हाँ, पर पकड़ा जा रहा है, लेकिन जावास्क्रिप्ट में कुछ" प्रकार "हैं।"

किसी और के उत्तर पर मेरी टिप्पणी में मैंने कहा:

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

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

उदाहरण के लिए, C # के साथ एक ही ऑपरेशन करने के लिए, मुझे एक इंटरफ़ेस की आवश्यकता होगी जिसे ICreatureWithArmsकुछ कहा जाए । जावास्क्रिप्ट में ऐसा नहीं है - सी या एएसएम में ऐसा नहीं है।

स्पष्ट रूप से, जावास्क्रिप्ट को किसी भी प्रकार की "समझ" है या नहीं यह बिल्कुल अप्रासंगिक है।


4
-1। सवाल पूछता है कि क्या एक निश्चित शब्द का उपयोग, कुछ हलकों में, एक निश्चित अर्थ के साथ किया जाता है, और आपकी प्रतिक्रिया यह समझाने के लिए है कि यह सवाल है कि क्या शब्द का अर्थ है? वास्तव में, मुझे लगता है कि आपने एक सराहनीय काम किया है जिसमें वह सब कुछ बताया गया है जो ओपी को पहले से ही पता है, बिना कुछ नया जोड़े। । ।
बजे

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

@ruakh - मैं आपके परिप्रेक्ष्य को समझ सकता हूं। हालांकि, ओपी ने पूछा: is there something deeper to this that I am missingऔर, मुझे लगता है, यह समझने में असफलता कि यह एक अर्थपूर्ण मुद्दा है गहरी बात है - इसलिए मैंने जो भी संभव था, उसमें चिप लगाने की पूरी कोशिश की।
स्टीव

@PeterCooper - मेरा संपादन देखें और मुझे बताएं कि क्या आपके लिए कुछ भी जोड़ता है (जब से आपने JavaScript has typesअपने उत्तर में कहा था)।
स्टीव

2
'जाहिर है, जावास्क्रिप्ट में किसी भी प्रकार की "समझ" है या नहीं, यह बिल्कुल अप्रासंगिक है।' सच नहीं। जैसा कि मैंने अपने जवाब में संकेत दिया है, चाहे कोई भी संदर्भ हो, आप 12 को एक फ़ंक्शन के रूप में नहीं मान सकते। चूंकि जावास्क्रिप्ट में एक फ़ंक्शन प्रकार है (या, आपके दृष्टिकोण, कई फ़ंक्शन प्रकारों के आधार पर), यह एक महत्वपूर्ण अंतर है।
एडम मिहलसिन

4

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

मुझे लगता है कि भाषाओं के 3 प्रकार [SIC] हैं:

अनुपयोगी - केवल ऑपरेटर मूल्य की व्याख्या निर्धारित करता है - और यह आमतौर पर किसी भी चीज पर काम करता है। उदाहरण: असेम्बलर, बीसीपीएल

सांख्यिकीय रूप से टाइप किए गए - भाव / चर उनके साथ जुड़े प्रकार हैं, और यह प्रकार संकलक समय में ऑपरेटर की व्याख्या / वैधता को निर्धारित करता है। उदाहरण: C, Java, C ++, ML, Haskell

डायनामिक रूप से टाइप किए गए - मान उनके साथ जुड़े प्रकार हैं, और यह प्रकार रन-टाइम पर ऑपरेटर की व्याख्या / वैधता को निर्धारित करता है। उदाहरण: LISP, स्कीम, स्मॉलटॉक, रूबी, पायथन, जावास्क्रिप्ट

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

यह सब बेतुके दावों की ओर ले जाता है, जैसे कि C ++ पायथन की तुलना में अधिक सुरक्षित है क्योंकि यह (स्टेटिक रूप से टाइप किया गया) है, जबकि सच्चाई यह है कि पायथन आंतरिक रूप से सुरक्षित है जबकि आप C ++ के साथ अपने पैर को शूट कर सकते हैं।


Upvoted। यह जानकर खुशी हुई कि "सभी गतिशील रूप से टाइप की जाने वाली भाषाएं सुरक्षित हैं"। "लेकिन यह वैधानिक रूप से टाइप की गई भाषा के लिए सही नहीं है", क्या आपका मतलब यह है कि सभी या अधिकांश सांख्यिकीय-टाइप भाषाएं असुरक्षित हैं?
टिम

Upvoted। (1) यह जानकर खुशी हुई कि "सभी डायनामिक-टाइप की गई भाषाएं टाइप-सेफ हैं", लेकिन जावास्क्रिप्ट डायनामिक टाइप्ड और कमजोर टाइप है, स्टैकओवरफ्लो को देखें /questions/ 964910/… । (२) "लेकिन वैसा ही वैधानिक रूप से टाइप की गई भाषा के लिए सही नहीं है", तो क्या आपका मतलब यह है कि सभी या अधिकांश सांख्यिकीय-टाइप भाषाएं असुरक्षित हैं?
टिम

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

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

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

2

मैं एक कंप्यूटर वैज्ञानिक नहीं हूं, लेकिन मुझे आश्चर्य होगा कि अगर "अनकैप्ड" को सीएस समुदाय में "डायनामिक रूप से टाइप किया गया" (कम से कम वैज्ञानिक प्रकाशनों में) के पर्याय के रूप में उपयोग किया जाता है, तो उन दो शब्दों के रूप में जो विभिन्न अवधारणाओं का वर्णन करते हैं। एक गतिशील रूप से टाइप की गई भाषा में प्रकारों की एक धारणा होती है और यह रनटाइम के प्रकार की बाधाओं को लागू करती है (उदाहरण के लिए आप लिस्प में एक स्ट्रिंग द्वारा पूर्णांक को एक त्रुटि प्राप्त किए बिना विभाजित नहीं कर सकते हैं) जबकि एक अनचाहे भाषा में किसी प्रकार की कोई धारणा नहीं होती है सभी (जैसे कोडांतरक)। यहां तक ​​कि प्रोग्रामिंग भाषाओं (http://en.m.wikipedia.org/wiki/Programming_language#Typed_versus_untyped_languages) के बारे में विकिपीडिया लेख यह अंतर बताता है।

अद्यतन: शायद भ्रम इस तथ्य से आता है कि कुछ पाठ इस बात को कुछ हद तक कहते हैं कि जावास्क्रिप्ट में "चर नहीं टाइप किए गए हैं" (जो सच है)। लेकिन इसका मतलब यह नहीं है कि भाषा अप्रतिभाषित है (जो झूठी होगी)।


1
कोडांतरक के पास कुछ बहुत कमजोर धारणा है। कम से कम x86 में, सब कुछ एक पूर्णांक है, लेकिन कुछ पूर्णांक दूसरों से भिन्न आकार हैं। मूल x86 युक्ति में MMX, x87, और अन्य एक्सटेंशन में जाने से पहले ही।
एडम मिहलसिन

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

@ अदम मिहलसीन सच [मैक्रो] असेंबली भाषाओं में निश्चित रूप से विभिन्न डिग्री के लिए कुछ प्रकार की धारणा हो सकती है। (उदाहरण के लिए "टाइप असेंबली लैंग्वेज" देखें।) मुझे अभी भी लगता है कि मेरी बात हालांकि सही है।
afrischke

3
@ मुझे यकीन नहीं है कि मैं आपका अनुसरण कर सकता हूं। ओपी ने पूछा कि क्या सीएस सर्किल में "डायनामिक टाइप" और "अनइप्ड" के बीच कोई अंतर नहीं है। इसका इस बात से कोई लेना-देना नहीं है कि आप मानते हैं कि जावास्क्रिप्ट बनाम असेंबली स्मृति में बिट्स का इलाज कैसे करते हैं, के बीच व्यावहारिक रूप से कोई अंतर नहीं है। जो मैंने पढ़ा है, उसके अनुसार (और मुझे इसे विशेष रूप से देखना चाहिए क्योंकि मैं कोई जावास्क्रिप्ट प्रोग्रामर नहीं हूं): ECMAScript / जावास्क्रिप्ट मानक 6 डेटा प्रकार (बूलियन, स्ट्रिंग, अनिर्धारित, संख्या, अशक्त, और ऑब्जेक्ट) और किसी भी बिंदु पर परिभाषित करता है समय में एक मूल्य एक ठोस प्रकार का होता है ...
हटाएं

1
... अब यह एक अवधारणा है (अधिकांश) विधानसभा भाषाओं में नहीं है (सभी बिट्स और बाइट्स हैं), इसलिए यह जावास्क्रिप्ट और विधानसभा के बीच एक स्पष्ट अंतर को चिह्नित करता है।
afrischke

1

ब्रेंडन के साथ सहमत - संदर्भ सब कुछ है।

मेरा स्वीकार कर लेना:

मुझे याद है कि भ्रमित होना, सर्का 2004, क्योंकि रूबी के अनपेड होने या गतिशील रूप से टाइप किए जाने के बारे में बहस चल रही थी। पुराने स्कूल C / C ++ के लोग (जिनमें से मैं एक था) कंपाइलर के बारे में सोच रहा था और कह रहा था कि रूबी अनपेड है।

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

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

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

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

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