अरे यार, मैं इस सवाल का जवाब देने के लिए उत्साहित हूं कि मैं सबसे अच्छा कर सकता हूं। मुझे उम्मीद है कि मैं अपने विचारों को सही तरीके से प्राप्त कर सकता हूं।
जैसा कि @ डोभाल ने उल्लेख किया है और प्रश्नकर्ता ने कहा है (यद्यपि), आपके पास वास्तव में एक प्रकार की प्रणाली नहीं है। आपके पास टैग्स का उपयोग करके गतिशील जांच की एक प्रणाली है, जो सामान्य रूप से बहुत कमजोर है, और बहुत कम दिलचस्प भी है।
"एक प्रकार की प्रणाली क्या है" का प्रश्न काफी दार्शनिक हो सकता है, और हम इस मामले पर विभिन्न दृष्टिकोणों के साथ एक पुस्तक भर सकते हैं। हालाँकि, जैसा कि यह प्रोग्रामर के लिए एक साइट है, मैं अपने उत्तर को यथासंभव व्यावहारिक रखने की कोशिश करूँगा (और वास्तव में, टाइपिंग प्रोग्रामिंग में बेहद व्यावहारिक है, इसके बावजूद कुछ क्या सोच सकते हैं)।
अवलोकन
आइए सीट-ऑफ़-द-पैंट से समझें कि अधिक औपचारिक अंडरपिनिंग में गोता लगाने से पहले एक प्रकार का सिस्टम क्या अच्छा है। एक प्रकार की प्रणाली हमारे कार्यक्रमों पर संरचना लागू करती है । वे हमें बताते हैं कि हम विभिन्न कार्यों और अभिव्यक्ति को एक साथ कैसे जोड़ सकते हैं। संरचना के बिना, प्रोग्राम अस्थिर और बेतहाशा जटिल हैं, जो प्रोग्रामर की थोड़ी सी भी गलती पर नुकसान पहुंचाने के लिए तैयार हैं।
एक प्रकार की प्रणाली के साथ प्रोग्राम लिखना पुदीने की स्थिति में देखभाल करने के समान है - ब्रेक काम करते हैं, दरवाजे सुरक्षित रूप से बंद होते हैं, इंजन को तेल लगाया जाता है, आदि। बिना किसी टाइप सिस्टम के प्रोग्राम लिखना बिना हेलमेट के मोटर साइकिल चलाना और पहियों के साथ बनाया गया है। स्पेगेटी से बाहर। आपका अपने ऊपर पूर्ण नियंत्रण नहीं है।
चर्चा को आधार बनाने के लिए, मान लीजिए कि हमारे पास शाब्दिक अभिव्यक्ति के साथ एक भाषा है 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
एक प्रोग्रामिंग भाषा उस भाषा के वैध पेड़ों को परिभाषित करने वाला एक व्याकरण प्रदान करती है (या तो कंक्रीट या अमूर्त वाक्यविन्यास का उपयोग किया जा सकता है)। यह आमतौर पर बीएनएफ नोटेशन जैसी किसी चीज का उपयोग करके किया जाता है। मैं मान लूंगा कि आपने जो भाषा बनाई है, उसके लिए आपने ऐसा किया है।
शब्दार्थ
ठीक है, हम जानते हैं कि एक कार्यक्रम क्या है, लेकिन यह सिर्फ एक स्थिर पेड़ संरचना है। संभवतः, हम चाहते हैं कि हमारा कार्यक्रम वास्तव में कुछ गणना करे । हमें शब्दार्थ चाहिए।
प्रोग्रामिंग भाषाओं का शब्दार्थ अध्ययन का एक समृद्ध क्षेत्र है। मोटे तौर पर, दो दृष्टिकोण हैं: डीनोटेशनल शब्दार्थ और परिचालन शब्दार्थ । नकारत्मक शब्दार्थ एक प्रोग्राम को कुछ अंतर्निहित गणितीय संरचना (जैसे प्राकृतिक संख्या, निरंतर कार्य आदि) में मैप करके बताता है। यह हमारे कार्यक्रम को अर्थ प्रदान करता है। संचालन शब्दार्थ, इसके विपरीत, एक कार्यक्रम को परिभाषित करता है कि यह कैसे निष्पादित होता है। मेरी राय में, प्रोग्रामर (स्वयं सहित) के लिए ऑपरेशनल शब्दार्थ अधिक सहज हैं, तो चलिए उसी से चिपके रहते हैं।
मैं औपचारिक परिचालन शब्दार्थ को परिभाषित करने के तरीके के माध्यम से नहीं जाऊंगा (विवरण थोड़ा सा शामिल हैं), लेकिन मूल रूप से, हम निम्नलिखित जैसे नियम चाहते हैं:
num[n]
एक मूल्य है
str[s]
एक मूल्य है
- यदि
num[n1]
और num[n2]
पूर्णांक n_1$ and $n_2$, then
प्लस (संख्या [n1], num [n2]) का मूल्यांकन करते हैं तो `पूर्णांक $ n_1 + n_2 $ का मूल्यांकन करता है।
- यदि
str[s1]
और str[s2]
स्ट्रिंग्स s1 और s2 का concat(str[s1], str[s2])
मूल्यांकन करता है , तो स्ट्रिंग s1s2 का मूल्यांकन करता है।
आदि नियम बहुत अधिक औपचारिक व्यवहार में हैं, लेकिन आप समझ पाते हैं। हालांकि, हम जल्द ही एक समस्या में चले जाते हैं। जब हम निम्नलिखित लिखते हैं तो क्या होता है:
concat(num[5], str[hello])
हम्म। यह काफी एक पहेली है। हमने किसी नियम को कहीं से परिभाषित नहीं किया है कि किसी संख्या को स्ट्रिंग के साथ कैसे जोड़ा जाए। हम ऐसा नियम बनाने का प्रयास कर सकते हैं, लेकिन हम सहज रूप से जानते हैं कि यह ऑपरेशन निरर्थक है। हम नहीं चाहते कि यह कार्यक्रम मान्य हो। और इस प्रकार हम अक्षमतापूर्वक प्रकारों की ओर ले जाते हैं।
प्रकार
एक कार्यक्रम एक पेड़ है जैसा कि भाषा के व्याकरण द्वारा परिभाषित किया गया है। कार्यक्रमों को निष्पादन नियमों द्वारा अर्थ दिया जाता है। लेकिन कुछ कार्यक्रमों को निष्पादित करने में असमर्थ हैं; अर्थात् , कुछ कार्यक्रम निरर्थक हैं । ये प्रोग्राम बीमार टाइप के हैं। इस प्रकार, टाइपिंग एक भाषा में सार्थक कार्यक्रमों की विशेषता है। यदि कोई कार्यक्रम अच्छी तरह से टाइप किया गया है, तो हम उसे निष्पादित कर सकते हैं।
आइए कुछ उदाहरण देते हैं। फिर से, मूल्यांकन नियमों के साथ, मैं अनौपचारिक रूप से टाइपिंग नियम प्रस्तुत करूंगा, लेकिन उन्हें कठोर बनाया जा सकता है। यहाँ कुछ नियम दिए गए हैं:
- फॉर्म के एक टोकन
num[n]
में टाइप होता है nat
।
- फॉर्म के एक टोकन
str[s]
में टाइप होता है str
।
- अगर अभिव्यक्ति
e1
के प्रकार हैं nat
और अभिव्यक्ति e2
के प्रकार हैं nat
, तो अभिव्यक्ति plus(e1, e2)
के प्रकार हैं nat
।
- अगर अभिव्यक्ति
e1
के प्रकार हैं str
और अभिव्यक्ति e2
के प्रकार हैं str
, तो अभिव्यक्ति concat(e1, e2)
के प्रकार हैं str
।
इस प्रकार, इन नियमों के अनुसार, plus(num[5], num[2])
एक प्रकार है nat
, लेकिन हम एक प्रकार को असाइन नहीं कर सकते हैं plus(num[5], str["hello"])
। हम कहते हैं कि अगर हम इसे किसी भी प्रकार का असाइन कर सकते हैं, तो यह एक प्रोग्राम (या अभिव्यक्ति) अच्छी तरह से टाइप किया गया है, और यह अन्यथा टाइप किया हुआ है। एक प्रकार की प्रणाली ध्वनि है अगर सभी अच्छी तरह से टाइप किए गए कार्यक्रमों को निष्पादित किया जा सकता है। हास्केल ध्वनि है; सी नहीं है।
निष्कर्ष
प्रकारों पर अन्य विचार हैं। कुछ अर्थों में टाइप अंतर्ज्ञानवादी तर्क के अनुरूप होते हैं, और उन्हें श्रेणी सिद्धांत में वस्तुओं के रूप में भी देखा जा सकता है। इन कनेक्शनों को समझना आकर्षक है, लेकिन यह जरूरी नहीं है कि कोई केवल एक प्रोग्रामिंग भाषा लिखना या डिजाइन करना चाहता है। हालांकि, प्रोग्राम संरचनाओं को नियंत्रित करने के लिए एक उपकरण के रूप में समझ प्रोग्रामिंग भाषा डिजाइन, और विकास के लिए आवश्यक है। मैंने केवल सतह को खरोंच किया है कि किस प्रकार व्यक्त कर सकते हैं। मुझे आशा है कि आपको लगता है कि वे आपकी भाषा में शामिल करने के लिए पर्याप्त सार्थक हैं।