एक प्रकार की प्रणाली क्या है?


50

पृष्ठभूमि

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

मैंने अपनी बात के दौरान यह उल्लेख किया कि VM एक प्रकार की प्रणाली प्रदान करता है, यह पूछा गया कि " आपके लिए किस प्रकार की प्रणाली है? "। जवाब देने के बाद सवाल पूछने वाले से मुझे हंसी आ गई।

इस प्रकार, भले ही मैं लगभग निश्चित रूप से इस सवाल को पूछने के लिए प्रतिष्ठा खोने जा रहा हूं, मैं प्रोग्रामर्स की ओर मुड़ता हूं।

मेरी समझ

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

प्रकारों का उपयोग उन मानव प्रोग्रामर को जानकारी प्रदान करने के लिए भी किया जा सकता है। उदाहरण के लिए, मुझे यह घोषणा मिलती है:

function sqrt(double n) -> double;

इस एक से अधिक उपयोगी है

sqrt(n)

पूर्व बहुत सारी जानकारी देता है: कि sqrtपहचानकर्ता एक फ़ंक्शन है, doubleइनपुट के रूप में एकल लेता है , और doubleआउटपुट के रूप में एक और उत्पादन करता है । उत्तरार्द्ध आपको बताता है कि यह एक एकल पैरामीटर लेने वाला फ़ंक्शन है।

मेरा जवाब

इसलिए, यह पूछे जाने के बाद कि "आपके लिए किस प्रकार की प्रणाली है?" मैंने उत्तर दिया:

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

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

अनुवर्ती प्रश्न था "और प्रकार को एक मान कैसे सौंपा जाता है?"। इसलिए मैंने समझाया कि सभी मान बॉक्सिंग हैं, और एक पॉइंटर है जो एक प्रकार की परिभाषा संरचना की ओर इशारा करता है जो टाइप के नाम के बारे में जानकारी प्रदान करता है कि यह किस संदेश का जवाब देता है, और यह किस प्रकार से विरासत में मिला है।

उसके बाद, मुझे हंसी आई, और मेरा जवाब टिप्पणी के साथ खारिज कर दिया गया "यह वास्तविक प्रकार नहीं है।"

इसलिए - अगर मैंने जो वर्णन किया है वह "वास्तविक प्रकार" के रूप में योग्य नहीं है, तो क्या होगा? क्या वह व्यक्ति सही था कि मैं जो प्रदान करता हूं उसे एक प्रकार का सिस्टम नहीं माना जा सकता है?


19
जब लोग टाइप सिस्टम के बारे में बात करते हैं तो वे आमतौर पर स्टेटिक टाइपिंग के बारे में बात करते हैं। डायनामिक टाइपिंग उस तरह के लोगों के लिए बहुत दिलचस्प नहीं है जो टाइप सिस्टम की परवाह करते हैं क्योंकि यह लगभग कुछ भी गारंटी नहीं देता है। उदा। चर x किस प्रकार का मान रख सकता है? कुछ भी।
डोभाल

7
मैं यह सुनने के लिए उत्सुक हूं कि उन्हें अपनी प्रतिक्रिया की रक्षा करने / समझाने के लिए क्या कहना था।
न्यूटोपियन

18
@ डोवल डायनामिक टाइपिंग यह गारंटी दे सकती है कि आप अपनी बिल्ली में 5 जोड़कर कुछ निरर्थक स्थिति में प्रवेश नहीं कर सकते। निश्चित रूप से, यह आपको प्रयास करने से नहीं रोकेगा , लेकिन यह कम से कम इसे वास्तव में होने से रोक सकता है और आपको यह पता लगाने का मौका दे सकता है कि क्या गलत हुआ और सुधारात्मक कार्रवाइयां करें, ऐसी चीजें जो वास्तव में टाइपलेस भाषा नहीं हो सकती हैं।
8bittree

10
व्यक्ति ने आपके उत्तर के साथ "और एक मान कैसे सौंपा है?" वे टाइपिंग रूल्स के बारे में सुनना चाहते थे, न कि बॉक्स-एंड-पॉइंटर डायग्राम। हँसना बिलकुल असभ्य था, हालाँकि।
गार्डेनहेड

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

जवाबों:


30

यह सब एक ठीक विवरण की तरह लगता है जो सिस्टम प्रदान करता है। और आपका कार्यान्वयन एक उचित पर्याप्त की तरह लगता है कि यह क्या कर रहा है।

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

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

यदि आपके पास और प्रश्न थे, तो टाइप और प्रोग्रामिंग लैंग्वेज विषय पर विहित पुस्तक है और आपको शिक्षाविदों द्वारा आवश्यक कठोरता के साथ-साथ कुछ शब्दावली सीखने में मदद कर सकती है।


3
"आपके वातावरण के आधार पर, व्यक्ति आपके प्रकार के सिस्टम में अधिक औपचारिकता चाहता है।" शायद यही है। मैंने इस पर ध्यान केंद्रित नहीं किया कि मैं किस प्रकार की प्रणाली के साथ साबित हो सकता हूं , बल्कि एक उपकरण के रूप में इसके बारे में सोचा। पुस्तक सिफारिश के लिए धन्यवाद!
Mael

1
@Mael कुछ प्रकार की प्रणालियों का उपयोग लॉजिक्स के रूप में किया जाता है ( तार्किक रूपरेखा देखें )। इसलिए मूल रूप से प्रकार सूत्र देता है और कार्यक्रम उन सूत्रों के प्रमाण हैं (जैसे कि फ़ंक्शन प्रकार a -> bको एक b के रूप में देखा जा सकता है , अर्थात यदि आप मुझे एक प्रकार का मान देते हैं तो aमैं प्रकार का मान प्राप्त कर सकता हूं b)। हालाँकि इसके लिए भाषा का निरंतर होना और कुल मिलाकर गैर-ट्यूरिंग होना आवश्यक है। इसलिए सभी वास्तविक जीवन प्रकार की प्रणालियां वास्तव में एक असंगत तर्क को परिभाषित करती हैं।
बकुरीउ

20

मुझे औपचारिक रूप से अकादमिक रुचि के संदर्भ के कारण @ तेलस्तीन का उत्तर पसंद है।

मुझे चर्चा में जोड़ने की अनुमति दें।

एक प्रकार की प्रणाली क्या है?

एक प्रकार की प्रणाली अवैध कार्यक्रम राज्यों को परिभाषित करने, पता लगाने और रोकने के लिए एक तंत्र है। यह बाधाओं को परिभाषित और लागू करके काम करता है। बाधा परिभाषाएं प्रकार हैं , और, बाधा अनुप्रयोग प्रकार के usages हैं , जैसे चर घोषणा में।

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

बाधाओं, प्रकारों के उपयोग, कभी-कभी रचना संचालकों को भी अनुमति देते हैं (उदाहरण के लिए, कम से कम यह, यह या तो यह या यह, यह प्रदान करता है कि कुछ और रखता है)।

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

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

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

स्थिर और गतिशील दोनों सुविधाएँ प्रदान करने के लिए एक काफी सामान्य प्रकार की प्रणाली की पेशकश है।


मुझे नहीं लगता कि तथाकथित हाइब्रिड टाइप सिस्टम बहुत आम हैं। आपके मन में कौन सी भाषाएं हैं?
गार्डेनहेड

2
@gardenhead, डाउनकास्ट करने की क्षमता एक स्थिर प्रकार की प्रणाली विशेषता नहीं है, इसलिए इसे आमतौर पर गतिशील रूप से रनटाइम पर चेक किया जाता है।
एरिक इद्दत

1
@gardenhead: सबसे स्थिर टाइप किया भाषाओं आप क्रम को टाइपिंग स्थगित करने, यह बस सी के साथ हो सकता है की अनुमति देने के void *संकेत दिए गए (बहुत कमजोर), सी # के गतिशील वस्तुओं, या हास्केल के existentially मात्रा निर्धारित GADTs (जो आप सबसे अन्य में स्थिर टाइप किया मानों के बजाय मजबूत गारंटी देने के भाषाओं)।
२-३३:

सच है, मैं "कास्टिंग" के बारे में भूल गया। लेकिन कास्टिंग एक कमजोर प्रकार की प्रणाली के लिए एक बैसाखी है।
गार्डेनहेड

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

14

अरे यार, मैं इस सवाल का जवाब देने के लिए उत्साहित हूं कि मैं सबसे अच्छा कर सकता हूं। मुझे उम्मीद है कि मैं अपने विचारों को सही तरीके से प्राप्त कर सकता हूं।

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

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

अवलोकन

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

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

चर्चा को आधार बनाने के लिए, मान लीजिए कि हमारे पास शाब्दिक अभिव्यक्ति के साथ एक भाषा है num[n]और str[s]यह अंक n और स्ट्रिंग s, क्रमशः और आदिम कार्यों का प्रतिनिधित्व करता है plusऔर concat, इच्छित अर्थ के साथ। स्पष्ट रूप से, आप ऐसा कुछ लिखने में सक्षम नहीं होना चाहते plus "hello" "world"या concat 2 4। लेकिन हम इसे कैसे रोक सकते हैं? एक प्राथमिकता , स्ट्रिंग शाब्दिक "दुनिया" से अंक 2 को अलग करने की कोई विधि नहीं है। हम जो कहना चाहते हैं वह यह है कि इन भावों को विभिन्न संदर्भों में उपयोग किया जाना चाहिए; उनके पास विभिन्न प्रकार हैं।

भाषाएँ और प्रकार

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

वाक्य - विन्यास

एक कार्यक्रम एक पेड़ है। कंप्यूटर पर आपके द्वारा लिखे गए पाठों की तर्ज पर मूर्ख मत बनो; ये केवल एक कार्यक्रम के मानव-पठनीय प्रतिनिधित्व हैं । कार्यक्रम ही एक सार सिंटेक्स ट्री है । उदाहरण के लिए, C में हम लिख सकते हैं:

int square(int x) { 
    return x * x;
 }

यह प्रोग्राम (खंड) के लिए ठोस सिंटैक्स है। पेड़ का प्रतिनिधित्व है:

     function square
     /     |       \
   int   int x    return
                     |
                   times
                  /    \
                 x      x

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

शब्दार्थ

ठीक है, हम जानते हैं कि एक कार्यक्रम क्या है, लेकिन यह सिर्फ एक स्थिर पेड़ संरचना है। संभवतः, हम चाहते हैं कि हमारा कार्यक्रम वास्तव में कुछ गणना करे । हमें शब्दार्थ चाहिए।

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

मैं औपचारिक परिचालन शब्दार्थ को परिभाषित करने के तरीके के माध्यम से नहीं जाऊंगा (विवरण थोड़ा सा शामिल हैं), लेकिन मूल रूप से, हम निम्नलिखित जैसे नियम चाहते हैं:

  1. num[n] एक मूल्य है
  2. str[s] एक मूल्य है
  3. यदि num[n1]और num[n2]पूर्णांक n_1$ and $n_2$, thenप्लस (संख्या [n1], num [n2]) का मूल्यांकन करते हैं तो `पूर्णांक $ n_1 + n_2 $ का मूल्यांकन करता है।
  4. यदि str[s1]और str[s2]स्ट्रिंग्स s1 और s2 का concat(str[s1], str[s2])मूल्यांकन करता है , तो स्ट्रिंग s1s2 का मूल्यांकन करता है।

आदि नियम बहुत अधिक औपचारिक व्यवहार में हैं, लेकिन आप समझ पाते हैं। हालांकि, हम जल्द ही एक समस्या में चले जाते हैं। जब हम निम्नलिखित लिखते हैं तो क्या होता है:

concat(num[5], str[hello])

हम्म। यह काफी एक पहेली है। हमने किसी नियम को कहीं से परिभाषित नहीं किया है कि किसी संख्या को स्ट्रिंग के साथ कैसे जोड़ा जाए। हम ऐसा नियम बनाने का प्रयास कर सकते हैं, लेकिन हम सहज रूप से जानते हैं कि यह ऑपरेशन निरर्थक है। हम नहीं चाहते कि यह कार्यक्रम मान्य हो। और इस प्रकार हम अक्षमतापूर्वक प्रकारों की ओर ले जाते हैं।

प्रकार

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

आइए कुछ उदाहरण देते हैं। फिर से, मूल्यांकन नियमों के साथ, मैं अनौपचारिक रूप से टाइपिंग नियम प्रस्तुत करूंगा, लेकिन उन्हें कठोर बनाया जा सकता है। यहाँ कुछ नियम दिए गए हैं:

  1. फॉर्म के एक टोकन num[n]में टाइप होता है nat
  2. फॉर्म के एक टोकन str[s]में टाइप होता है str
  3. अगर अभिव्यक्ति e1के प्रकार हैं natऔर अभिव्यक्ति e2के प्रकार हैं nat, तो अभिव्यक्ति plus(e1, e2)के प्रकार हैं nat
  4. अगर अभिव्यक्ति e1के प्रकार हैं strऔर अभिव्यक्ति e2के प्रकार हैं str, तो अभिव्यक्ति concat(e1, e2)के प्रकार हैं str

इस प्रकार, इन नियमों के अनुसार, plus(num[5], num[2])एक प्रकार है nat, लेकिन हम एक प्रकार को असाइन नहीं कर सकते हैं plus(num[5], str["hello"])। हम कहते हैं कि अगर हम इसे किसी भी प्रकार का असाइन कर सकते हैं, तो यह एक प्रोग्राम (या अभिव्यक्ति) अच्छी तरह से टाइप किया गया है, और यह अन्यथा टाइप किया हुआ है। एक प्रकार की प्रणाली ध्वनि है अगर सभी अच्छी तरह से टाइप किए गए कार्यक्रमों को निष्पादित किया जा सकता है। हास्केल ध्वनि है; सी नहीं है।

निष्कर्ष

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


4
+1। डायनेमिक टाइपिंग के शौकीनों की सबसे बड़ी ट्रिक यह बताती है कि आप दुनिया को बिना टाइप सिस्टम के "टाइप" कर सकते हैं। :-)
बरसा

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

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

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

5
@IMSoP: किसी पुस्तक से कम समय के लिए, क्रिस स्मिथ का निबंध, डिबेटिंग टाइप सिस्टम से पहले क्या जानना चाहिए महान है, यह निर्धारित करना कि डायनामिक टाइपिंग वास्तव में स्थैतिक टाइपिंग से काफी अलग चीज क्यों है।
पीटर LeFanu Lumsdaine
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.