स्थिर प्रकार की भाषाओं की तुलना में गतिशील प्रकार की भाषाओं के फायदे और सीमाएं क्या हैं?
इसे भी देखें : व्हाट्सएप विथ डायनमिक लैंग्वेजेज (एक कहीं अधिक तर्कशील सूत्र ...)
स्थिर प्रकार की भाषाओं की तुलना में गतिशील प्रकार की भाषाओं के फायदे और सीमाएं क्या हैं?
इसे भी देखें : व्हाट्सएप विथ डायनमिक लैंग्वेजेज (एक कहीं अधिक तर्कशील सूत्र ...)
जवाबों:
टाइप और टाइप रूपांतरणों को कम करने के लिए दुभाषिया की क्षमता विकास के समय को तेजी से बढ़ाती है, लेकिन यह रनटाइम विफलताओं को भी भड़का सकती है, जो कि आप एक संकलित भाषा में नहीं प्राप्त कर सकते हैं जहां आप उन्हें संकलन समय पर पकड़ते हैं। लेकिन जो इन दिनों (और लंबे समय से) समुदाय में बेहतर है (या यहां तक कि अगर यह हमेशा सच है) की चर्चा गर्म है।
इस मुद्दे पर एक अच्छी बात यह है कि स्टेटिक टाइपिंग से जहां संभव हो, गतिशील टाइपिंग की आवश्यकता है: माइक्रोसॉफ्ट पर एरिक मीजर और पीटर ड्रेटन द्वारा प्रोग्रामिंग भाषाओं के बीच शीत युद्ध की समाप्ति :
स्टैटिक टाइपिंग के पैरोकारों का तर्क है कि स्टैटिक टाइपिंग के फायदों में प्रोग्रामिंग गलतियों का पहले पता लगाना शामिल है (जैसे कि बूलियन में पूर्णांक जोड़ने से रोकना), प्रकार के हस्ताक्षर के रूप में बेहतर प्रलेखन (जैसे नाम बदलने पर संख्या और प्रकार के तर्क शामिल करना), अधिक कंपाइलर ऑप्टिमाइज़ेशन के अवसर (उदाहरण के लिए रिसीवर के सटीक प्रकार को स्टेटिक रूप से ज्ञात करने पर वर्चुअल कॉल की जगह), रनटाइम दक्षता में वृद्धि (उदाहरण के लिए सभी मानों को एक गतिशील प्रकार को ले जाने की आवश्यकता नहीं है), और एक बेहतर डिज़ाइन टाइम डेवलपर अनुभव (जैसे कि जानना) रिसीवर का प्रकार, आईडीई सभी लागू सदस्यों के ड्रॉप-डाउन मेनू को प्रस्तुत कर सकता है)। स्टेटिक टाइपिंग कट्टरपंथी हमें यह विश्वास दिलाने की कोशिश करते हैं कि "अच्छी तरह से टाइप किए गए प्रोग्राम गलत नहीं हो सकते"। हालांकि यह निश्चित रूप से प्रभावशाली लगता है, यह एक जगह खाली बयान है। स्टेटिक टाइप चेकिंग आपके प्रोग्राम के रनटाइम बिहेवियर का एक कंपाइल-टाइम एब्स्ट्रैक्शन है, और इसलिए यह केवल आंशिक रूप से ध्वनि और अपूर्ण है। इसका मतलब यह है कि प्रोग्राम्स अभी भी गलत हो सकते हैं क्योंकि ऐसे गुण जो टाइप-चेकर द्वारा ट्रैक नहीं किए जाते हैं, और यह भी कि ऐसे प्रोग्राम हैं जो गलत नहीं हो सकते, उन्हें टाइप-चेक नहीं किया जा सकता है। स्टैटिक टाइपिंग को आंशिक और अधिक पूर्ण बनाने के लिए आवेग "फैंटम टाइप" [11] और "वॉबल्ली टाइप्स" [10] जैसी अवधारणाओं के गवाह के रूप में सिस्टम को अत्यधिक जटिल और विदेशी बनाने का कारण बनता है। यह एक बॉल और चेन के साथ एक मैराथन दौड़ने की कोशिश करने जैसा है, जो आपके पैर में बंधी हुई है और विजयी रूप से चिल्लाते हुए कि आपने लगभग इसे बनाया है, भले ही आप पहले मील के बाद बाहर निकल गए हों। स्टेटिक टाइप चेकिंग आपके प्रोग्राम के रनटाइम बिहेवियर का एक कंपाइल-टाइम एब्स्ट्रैक्शन है, और इसलिए यह केवल आंशिक रूप से ध्वनि और अपूर्ण है। इसका मतलब यह है कि प्रोग्राम्स अभी भी गलत हो सकते हैं क्योंकि ऐसे गुण जो टाइप-चेकर द्वारा ट्रैक नहीं किए जाते हैं, और यह भी कि ऐसे प्रोग्राम हैं जो गलत नहीं हो सकते, उन्हें टाइप-चेक नहीं किया जा सकता है। स्टैटिक टाइपिंग को आंशिक और अधिक पूर्ण बनाने के लिए आवेग "फैंटम टाइप" [11] और "वॉबल्ली टाइप्स" [10] जैसी अवधारणाओं के गवाह के रूप में सिस्टम को अत्यधिक जटिल और विदेशी बनाने का कारण बनता है। यह एक बॉल और चेन के साथ एक मैराथन दौड़ने की कोशिश करने जैसा है, जो आपके पैर में बंधी हुई है और विजयी रूप से चिल्लाते हुए कि आपने लगभग इसे बनाया है, भले ही आप पहले मील के बाद बाहर निकल गए हों। स्टेटिक टाइप चेकिंग आपके प्रोग्राम के रनटाइम बिहेवियर का एक कंपाइल-टाइम एब्स्ट्रैक्शन है, और इसलिए यह केवल आंशिक रूप से ध्वनि और अपूर्ण है। इसका मतलब यह है कि प्रोग्राम्स अभी भी गलत हो सकते हैं क्योंकि ऐसे गुण जो टाइप-चेकर द्वारा ट्रैक नहीं किए जाते हैं, और यह भी कि ऐसे प्रोग्राम हैं जो गलत नहीं हो सकते, उन्हें टाइप-चेक नहीं किया जा सकता है। स्टैटिक टाइपिंग को आंशिक और अधिक पूर्ण बनाने के लिए आवेग "फैंटम टाइप" [11] और "वॉबल्ली टाइप्स" [10] जैसी अवधारणाओं के गवाह के रूप में सिस्टम को अत्यधिक जटिल और विदेशी बनाने का कारण बनता है। यह एक बॉल और चेन के साथ एक मैराथन दौड़ने की कोशिश करने जैसा है, जो आपके पैर में बंधी हुई है और विजयी रूप से चिल्लाते हुए कि आपने लगभग इसे बनाया है, भले ही आप पहले मील के बाद बाहर निकल गए हों। और इसलिए यह आवश्यक रूप से केवल आंशिक रूप से ध्वनि और अपूर्ण है। इसका मतलब यह है कि प्रोग्राम्स अभी भी गलत हो सकते हैं क्योंकि ऐसे गुण जो टाइप-चेकर द्वारा ट्रैक नहीं किए जाते हैं, और यह भी कि ऐसे प्रोग्राम हैं जो गलत नहीं हो सकते, उन्हें टाइप-चेक नहीं किया जा सकता है। स्टैटिक टाइपिंग को आंशिक और अधिक पूर्ण बनाने के लिए आवेग "फैंटम टाइप" [11] और "वॉबल्ली टाइप्स" [10] जैसी अवधारणाओं के गवाह के रूप में सिस्टम को अत्यधिक जटिल और विदेशी बनाने का कारण बनता है। यह एक बॉल और चेन के साथ एक मैराथन दौड़ने की कोशिश करने जैसा है, जो आपके पैर में बंधी हुई है और विजयी रूप से चिल्लाते हुए कि आपने लगभग इसे बनाया है, भले ही आप पहले मील के बाद बाहर निकल गए हों। और इसलिए यह आवश्यक रूप से केवल आंशिक रूप से ध्वनि और अपूर्ण है। इसका मतलब यह है कि प्रोग्राम्स अभी भी गलत हो सकते हैं क्योंकि ऐसे गुण जो टाइप-चेकर द्वारा ट्रैक नहीं किए जाते हैं, और यह भी कि ऐसे प्रोग्राम हैं जो गलत नहीं हो सकते, उन्हें टाइप-चेक नहीं किया जा सकता है। स्टैटिक टाइपिंग को आंशिक और अधिक पूर्ण बनाने के लिए आवेग "फैंटम टाइप" [11] और "वॉबल्ली टाइप्स" [10] जैसी अवधारणाओं के गवाह के रूप में सिस्टम को अत्यधिक जटिल और विदेशी बनाने का कारण बनता है। यह एक बॉल और चेन के साथ एक मैराथन दौड़ने की कोशिश करने जैसा है, जो आपके पैर में बंधी हुई है और विजयी रूप से चिल्लाते हुए कि आपने लगभग इसे बनाया है, भले ही आप पहले मील के बाद बाहर निकल गए हों। और यह कि ऐसे कार्यक्रम हैं जो गलत नहीं हो सकते, उन्हें टाइप-चेक नहीं किया जा सकता है। स्टैटिक टाइपिंग को आंशिक और अधिक पूर्ण बनाने के लिए आवेग "फैंटम टाइप" [11] और "वॉबल्ली टाइप्स" [10] जैसी अवधारणाओं के गवाह के रूप में सिस्टम को अत्यधिक जटिल और विदेशी बनाने का कारण बनता है। यह एक बॉल और चेन के साथ एक मैराथन दौड़ने की कोशिश करने जैसा है, जो आपके पैर में बंधी हुई है और विजयी रूप से चिल्लाते हुए कि आपने लगभग इसे बनाया है, भले ही आप पहले मील के बाद बाहर निकल गए हों। और यह कि ऐसे कार्यक्रम हैं जो गलत नहीं हो सकते, उन्हें टाइप-चेक नहीं किया जा सकता है। स्टैटिक टाइपिंग को आंशिक और अधिक पूर्ण बनाने के लिए आवेग "फैंटम टाइप" [11] और "वॉबल्ली टाइप्स" [10] जैसी अवधारणाओं के गवाह के रूप में सिस्टम को अत्यधिक जटिल और विदेशी बनाने का कारण बनता है। यह एक बॉल और चेन के साथ एक मैराथन दौड़ने की कोशिश करने जैसा है, जो आपके पैर में बंधी हुई है और विजयी रूप से चिल्लाते हुए कि आपने लगभग इसे बनाया है, भले ही आप पहले मील के बाद बाहर निकल गए हों।
गतिशील रूप से टाइप की जाने वाली भाषाओं के अधिवक्ताओं का तर्क है कि स्थैतिक टाइपिंग बहुत कठोर है, और डायनामिक भाषाओं की कोमलता उन्हें आदर्श रूप से बदलती या अज्ञात आवश्यकताओं के साथ प्रोटोटाइप सिस्टम के लिए अनुकूल बनाती है, या जो अन्य प्रणालियों के साथ बातचीत करती है जो अप्रत्याशित रूप से बदलते हैं (डेटा और एप्लिकेशन एकीकरण)। बेशक, डायनेमिक रूप से टाइप की गई भाषाएं वास्तव में डायनेमिक प्रोग्राम व्यवहार से निपटने के लिए अपरिहार्य हैं जैसे कि विधि अवरोधन, डायनेमिक लोडिंग, मोबाइल कोड, रनटाइम रिफ्लेक्शन आदि। स्क्रिप्टिंग पर सभी पत्रों की मां में [16], जॉन ऑस्टरहॉट ने कहा कि स्टेटिकली टाइप सिस्टम प्रोग्रामिंग भाषाएं कोड को पुन: प्रयोज्य, अधिक क्रियाशील, अधिक सुरक्षित नहीं, और गतिशील रूप से टाइप की गई स्क्रिप्टिंग भाषाओं की तुलना में कम अभिव्यंजक बनाती हैं। इस तर्क का शाब्दिक रूप से टाइप किए गए स्क्रिप्टिंग भाषाओं के कई समर्थकों द्वारा तोता है। हम तर्क देते हैं कि यह एक गिरावट है और एक ही श्रेणी में आता है यह तर्क देते हुए कि घोषणात्मक प्रोग्रामिंग का सार असाइनमेंट को समाप्त कर रहा है। या जैसा कि जॉन ह्यूजेस कहते हैं [8], सुविधाओं को छोड़ कर किसी भाषा को अधिक शक्तिशाली बनाना एक तार्किक अक्षमता है। इस तथ्य का बचाव करते हुए कि रन-टाइम में सभी प्रकार की जाँच में देरी करना एक अच्छी बात है, इस तथ्य के साथ शुतुरमुर्ग रणनीति खेल रहा है कि त्रुटियों को जल्द से जल्द विकास प्रक्रिया में पकड़ा जाना चाहिए। सुविधाओं को छोड़ कर किसी भाषा को अधिक शक्तिशाली बनाना एक तार्किक अक्षमता है। इस तथ्य का बचाव करते हुए कि रन-टाइम में सभी प्रकार की जाँच में देरी करना एक अच्छी बात है, इस तथ्य के साथ शुतुरमुर्ग रणनीति खेल रहा है कि त्रुटियों को जल्द से जल्द विकास प्रक्रिया में पकड़ा जाना चाहिए। सुविधाओं को छोड़ कर किसी भाषा को अधिक शक्तिशाली बनाना एक तार्किक अक्षमता है। इस तथ्य का बचाव करते हुए कि रन-टाइम में सभी प्रकार की जाँच में देरी करना एक अच्छी बात है, इस तथ्य के साथ शुतुरमुर्ग रणनीति खेल रहा है कि त्रुटियों को विकास प्रक्रिया में जल्द से जल्द पकड़ा जाना चाहिए।
स्टेटिक टाइप सिस्टम कुछ त्रुटियों को सांख्यिकीय रूप से समाप्त करना चाहते हैं, कार्यक्रम को चलाने के बिना निरीक्षण करते हैं और कुछ मामलों में ध्वनि को साबित करने का प्रयास करते हैं। कुछ प्रकार के सिस्टम दूसरों की तुलना में अधिक त्रुटियों को पकड़ने में सक्षम हैं। उदाहरण के लिए, C # ठीक से उपयोग किए जाने पर अशक्त सूचक अपवादों को समाप्त कर सकता है, जबकि जावा में ऐसी कोई शक्ति नहीं है। ट्वेल्फ़ के पास एक प्रकार की प्रणाली है जो वास्तव में गारंटी देती है कि सबूत ख़त्म होने वाली समस्या को "हल" कर देंगे ।
हालांकि, कोई भी प्रकार प्रणाली सही नहीं है। त्रुटियों के एक विशेष वर्ग को खत्म करने के लिए, उन्हें कुछ पूरी तरह से मान्य कार्यक्रमों को भी अस्वीकार करना चाहिए जो नियमों का उल्लंघन करते हैं। यही कारण है कि ट्वेल वास्तव में हॉल्टिंग समस्या को हल नहीं करता है, यह सिर्फ बड़ी संख्या में पूरी तरह से वैध सबूतों को फेंकने से बचता है जो विषम तरीकों से समाप्त करने के लिए होता है। इसी तरह, जावा का प्रकार प्रणाली PersistentVector
विषम सरणियों के उपयोग के कारण क्लीजुर के कार्यान्वयन को अस्वीकार करता है । यह रनटाइम पर काम करता है, लेकिन टाइप सिस्टम इसे सत्यापित नहीं कर सकता है।
उस कारण से, अधिकांश प्रकार के सिस्टम "एस्केप" प्रदान करते हैं, स्टैटिक चेकर को ओवरराइड करने के तरीके। अधिकांश भाषाओं के लिए, ये कास्टिंग का रूप लेते हैं, हालांकि कुछ (जैसे सी # और हास्केल) में पूरे मोड होते हैं जिन्हें "कैफे" के रूप में चिह्नित किया जाता है।
विशेष रूप से, मुझे स्थिर टाइपिंग पसंद है। ठीक से लागू किया गया (संकेत: जावा नहीं ), उत्पादन प्रणाली को क्रैश करने से पहले एक स्थिर प्रकार की प्रणाली त्रुटियों को बाहर निकालने में एक बड़ी मदद हो सकती है। डायनामिक रूप से टाइप की जाने वाली भाषाओं में अधिक इकाई परीक्षण की आवश्यकता होती है, जो सबसे अच्छे समय में थकाऊ होती है। इसके अलावा, सांख्यिकीय रूप से टाइप की गई भाषाओं में कुछ विशेषताएं हो सकती हैं जो गतिशील प्रकार की प्रणालियों में असंभव या असुरक्षित हैं ( मन में आने वाले रूपांतरण वसंत)। यह सभी आवश्यकताओं और व्यक्तिपरक स्वाद का सवाल है। मैं रूबी में अगले ग्रहण का निर्माण नहीं करूंगा क्योंकि मैं विधानसभा में बैकअप स्क्रिप्ट लिखने या जावा का उपयोग करके कर्नेल पैच करने का प्रयास करूंगा।
ओह, और जो लोग कहते हैं कि " x टाइपिंग y टाइपिंग से 10 गुना अधिक उत्पादक है " बस धुआं उड़ा रहे हैं। डायनामिक टाइपिंग कई मामलों में तेजी से "महसूस" कर सकती है, लेकिन यह एक बार हार जाती है जब आप वास्तव में अपने फैंसी एप्लिकेशन को बनाने की कोशिश करते हैं चलाने हैं । इसी तरह, स्थैतिक टाइपिंग ऐसा लग सकता है कि यह सही सुरक्षा जाल है, लेकिन जावा में अधिक जटिल जेनेरिक प्रकार की परिभाषाओं में से कुछ पर नजर डालते हैं, जो अधिकांश डेवलपर्स को आंखों की रोशनी के लिए परेशान करते हैं। टाइप सिस्टम और उत्पादकता के साथ भी, कोई चांदी की गोली नहीं है।
अंतिम नोट: गतिशील टाइपिंग के साथ स्थिर तुलना करते समय प्रदर्शन के बारे में चिंता न करें। V8 और TraceMonkey जैसे आधुनिक जेआईटी खतरनाक भाषा प्रदर्शन के करीब आ रहे हैं। इसके अलावा, यह तथ्य कि जावा वास्तव में एक गतिशील गतिशील मध्यवर्ती भाषा को संकलित करता है, यह संकेत होना चाहिए कि ज्यादातर मामलों के लिए, डायनेमिक टाइपिंग बहुत बड़ा प्रदर्शन-हत्यारा नहीं है जो कि कुछ लोग इसे बाहर करने के लिए बनाते हैं।
dadd
क्योंकि वह पहले से जानता है कि ऑपरेंड double
एस हैं।
खैर, दोनों बहुत, बहुत बहुत गलत समझे हैं और दो पूरी तरह से अलग चीजें भी हैं। यह परस्पर अनन्य नहीं हैं ।
स्थैतिक प्रकार भाषा के व्याकरण का प्रतिबंध है। वैधानिक रूप से टाइप किए गए लैंगग्यूज को कड़ाई से संदर्भ मुक्त नहीं कहा जा सकता है। सरल सत्य यह है कि किसी भाषा को संदर्भ मुक्त व्याकरण में स्पष्ट रूप से व्यक्त करना असुविधाजनक हो जाता है जो अपने सभी डेटा को केवल बिट वैक्टर के रूप में नहीं मानता है। स्टेटिक टाइप सिस्टम भाषा के व्याकरण का हिस्सा हैं यदि कोई हो, तो वे इसे केवल एक संदर्भ मुक्त व्याकरण की तुलना में अधिक प्रतिबंधित कर सकते हैं, व्याकरणिक जांच इस प्रकार वास्तव में स्रोत पर दो पास में होती हैं। स्टैटिक प्रकार, प्रकार के सिद्धांत की गणितीय धारणा के अनुरूप होते हैं, गणित में टाइप थ्योरी कुछ अभिव्यक्तियों की वैधता को सीमित करती है। जैसे, मैं 3 + [4,7]
गणित में नहीं कह सकता , यह इस प्रकार के सिद्धांत के कारण है।
इस प्रकार स्थैतिक प्रकार एक सैद्धांतिक दृष्टिकोण से 'त्रुटियों को रोकने' का तरीका नहीं है, वे व्याकरण की एक सीमा है। वास्तव में, बशर्ते कि +, 3 और अंतराल में सामान्य रूप से निर्धारित सैद्धांतिक परिभाषाएं हों, अगर हम टाइप प्रणाली 3 + [4,7]
को हटाते हैं तो एक बहुत अच्छी तरह से परिभाषित परिणाम होता है जो एक सेट है। 'रनटाइम टाइप एरर' सैद्धांतिक रूप से मौजूद नहीं है, जिस प्रकार की प्रणाली का व्यावहारिक उपयोग मानव को होने वाले संचालन को रोकने के लिए है को कोई मतलब नहीं होगा। संचालन अभी भी केवल बिट्स के स्थानांतरण और हेरफेर हैं।
इसके लिए पकड़ यह है कि एक प्रकार की प्रणाली यह तय नहीं कर सकती है कि इस तरह के ऑपरेशन होने वाले हैं या नहीं अगर इसे चलाने की अनुमति दी जाएगी। जैसा कि, उन सभी संभावित कार्यक्रमों के सेट को विभाजित करता है जो एक 'प्रकार की त्रुटि' होने वाले हैं, और जो नहीं हैं। यह केवल दो काम कर सकता है:
1: साबित करें कि प्रोग्राम में टाइप एरर होने वाली हैं
2: यह साबित करें कि वे किसी प्रोग्राम में नहीं जा रहे हैं
ऐसा लग सकता है कि मैं खुद का विरोध कर रहा हूं। लेकिन C या Java टाइप चेकर क्या करता है, क्या यह किसी प्रोग्राम को 'ungrammatical' के रूप में अस्वीकार करता है, या जैसा कि इसे 'टाइप एरर' कहता है, यदि यह 2 पर सफल नहीं हो सकता। यह साबित नहीं कर सकता कि वे होने वाले नहीं हैं, इसका मतलब यह नहीं है कि वे होने वाले नहीं हैं, इसका मतलब यह है कि यह साबित नहीं कर सकता है। यह बहुत अच्छी तरह से हो सकता है कि एक प्रोग्राम जिसमें एक प्रकार की त्रुटि नहीं होगी, केवल इसलिए खारिज कर दिया जाता है क्योंकि यह संकलक द्वारा सिद्ध नहीं किया जा सकता है। एक सरल उदाहरण हैif(1) a = 3; else a = "string";
, निश्चित रूप से यह हमेशा सच है, अन्य-शाखा को कभी भी कार्यक्रम में निष्पादित नहीं किया जाएगा, और किसी भी प्रकार की त्रुटि नहीं होगी। लेकिन यह इन मामलों को सामान्य तरीके से साबित नहीं कर सकता है, इसलिए इसे खारिज कर दिया गया है। यह कई प्रकार की वैधानिक रूप से टाइप की जाने वाली भाषाओं की प्रमुख कमजोरी है, जो आपको अपने आप को बचाने में, आप जरूरी नहीं कि ऐसे मामलों में भी सुरक्षित हैं।
लेकिन, लोकप्रिय धारणा के विपरीत, वहाँ भी सांख्यिकीय रूप से टाइप की जाने वाली भाषाएं हैं जो सिद्धांत 1 से काम करती हैं। वे बस उन सभी कार्यक्रमों को अस्वीकार कर देती हैं, जिनमें वे साबित कर सकती हैं कि यह एक प्रकार की त्रुटि पैदा करने वाला है, और उन सभी कार्यक्रमों को पारित करें, जिनमें वे नहीं कर सकते। इसलिए यह संभव है कि वे उन कार्यक्रमों की अनुमति दें जिनमें उनके प्रकार की त्रुटियां हैं, एक अच्छा उदाहरण टाइप्ड रैकेट है, यह गतिशील और स्थिर टाइपिंग के बीच हाइब्रिड है। और कुछ का तर्क होगा कि आप इस प्रणाली में दोनों दुनियाओं में सर्वश्रेष्ठ हैं।
स्टैटिक टाइपिंग का एक और फायदा यह है कि कंपाइल समय पर प्रकारों को जाना जाता है, और इस प्रकार कंपाइलर इसका उपयोग कर सकते हैं। यदि हम जावा में करते हैं "string" + "string"
या 3 + 3
, +
अंत में पाठ में दोनों टोकन पूरी तरह से अलग ऑपरेशन और डेटम का प्रतिनिधित्व करते हैं, तो संकलक जानता है कि अकेले किस प्रकार से चुनना है।
अब, मैं यहाँ एक बहुत ही विवादास्पद बयान देने जा रहा हूँ लेकिन मेरे साथ है: 'डायनेमिक टाइपिंग' मौजूद नहीं है ।
बहुत विवादास्पद लगता है, लेकिन यह सच है, गतिशील रूप से टाइप की गई भाषाएं सैद्धांतिक दृष्टिकोण से अनछुई हैं । वे केवल एक प्रकार के साथ केवल सांख्यिकीय रूप से टाइप की जाने वाली भाषाएं हैं। या सीधे शब्दों में कहें, तो वे ऐसी भाषाएं हैं जो वास्तव में व्यवहार में एक संदर्भ मुक्त व्याकरण द्वारा उत्पन्न होती हैं।
उनके पास प्रकार क्यों नहीं हैं? क्योंकि हर ऑपरेशन को परिभाषित किया गया है और हर ऑपरेटर पर अनुमति दी गई है, वास्तव में 'रनटाइम टाइप त्रुटि' क्या है? यह एक सैद्धांतिक उदाहरण से विशुद्ध रूप से एक साइड-इफेक्ट है । यदि ऐसा करना print("string")
जो एक स्ट्रिंग को प्रिंट करता है एक ऑपरेशन है, तो ऐसा है length(3)
, पूर्व में string
मानक आउटपुट पर लिखने का दुष्प्रभाव है , बाद में बस error: function 'length' expects array as argument.
, यही है। एक सैद्धांतिक दृष्टिकोण से गतिशील रूप से टाइप की गई भाषा जैसी कोई चीज नहीं है। वे अनछुए हैं
ठीक है, 'डायनामिकली टाइप्ड' भाषा का स्पष्ट लाभ अभिव्यंजक शक्ति है, एक प्रकार की प्रणाली और कुछ नहीं बल्कि अभिव्यंजक शक्ति की एक सीमा है। और सामान्य तौर पर, एक प्रकार की प्रणाली वाली भाषाएं वास्तव में उन सभी परिचालनों के लिए एक परिभाषित परिणाम होती हैं जिनकी अनुमति नहीं होती है यदि प्रकार प्रणाली को केवल अनदेखा किया जाता है, तो परिणाम केवल मनुष्यों के लिए समझ में नहीं आएंगे। कई भाषाएं एक प्रकार की प्रणाली लागू करने के बाद अपनी ट्यूरिंग पूर्णता खो देती हैं।
स्पष्ट नुकसान तथ्य यह है कि संचालन हो सकता है जो ऐसे परिणाम उत्पन्न करेगा जो मानव के लिए निरर्थक हैं। इसके विरुद्ध रक्षा के लिए, डायनामिक रूप से टाइप की गई भाषाएं आमतौर पर उन परिचालनों को पुनर्परिभाषित करती हैं, बजाय इसके कि निरर्थक परिणाम उत्पन्न करने के बजाय वे इसे फिर से लिखने के दुष्परिणाम होने के लिए इसे फिर से परिभाषित करें, और संभवतः कार्यक्रम को पूरी तरह से रोक दें। यह बिल्कुल भी 'त्रुटि' नहीं है, वास्तव में, भाषा विनिर्देश आमतौर पर इसका तात्पर्य है, यह भाषा का उतना ही व्यवहार है जितना कि एक सैद्धांतिक दृष्टिकोण से एक स्ट्रिंग को प्रिंट करना। टाइप सिस्टम इस प्रकार प्रोग्रामर को यह सुनिश्चित करने के लिए कोड के प्रवाह के बारे में तर्क करने के लिए मजबूर करते हैं कि ऐसा नहीं होता है। या वास्तव में, इसका कारण यह है कि यह करता हैडिबगिंग के लिए कुछ बिंदुओं में भी काम हो सकता है, यह दर्शाता है कि यह 'त्रुटि' नहीं है, लेकिन भाषा की अच्छी तरह से परिभाषित संपत्ति है। वास्तव में, 'डायनेमिक टाइपिंग' का एकमात्र अवशेष जो अधिकांश भाषाओं में शून्य के द्वारा विभाजन के विरुद्ध रखवाली करता है। यह वह है जो डायनेमिक टाइपिंग है, कोई प्रकार नहीं हैं, कोई अन्य प्रकार नहीं हैं, जो शून्य अन्य सभी संख्याओं की तुलना में एक अलग प्रकार है। जिसे लोग 'टाइप' कहते हैं, वह एक डेटम की दूसरी प्रॉपर्टी है, जैसे एरे की लंबाई या स्ट्रिंग का पहला कैरेक्टर। और कई गतिशील रूप से टाइप की गई भाषाएं भी आपको बाहर की चीजें लिखने देती हैं "error: the first character of this string should be a 'z'"
।
एक और बात यह है कि गतिशील रूप से टाइप की गई भाषाओं में रनटाइम के प्रकार उपलब्ध होते हैं और आमतौर पर इसे जांच सकते हैं और इससे निपट सकते हैं और इससे निर्णय ले सकते हैं। बेशक, सिद्धांत रूप में यह किसी सरणी के पहले चार्ट तक पहुँचने और यह क्या है, इसे देखने से अलग नहीं है। वास्तव में, आप अपना स्वयं का डायनामिक सी बना सकते हैं, बस एक प्रकार का उपयोग करें जैसे लंबे लंबे इंट और इसके पहले 8 बिट्स का उपयोग करके अपने 'टाइप' को स्टोर करें और उसी के अनुसार फ़ंक्शन लिखें और इसके लिए फ़्लोट या पूर्णांक जोड़ दें। आपके पास एक प्रकार, या एक गतिशील भाषा के साथ एक सांख्यिकीय रूप से टाइप की गई भाषा है।
व्यवहार में, यह सभी दिखाता है, आमतौर पर टाइप की जाने वाली भाषाओं का उपयोग आमतौर पर व्यावसायिक सॉफ़्टवेयर लिखने के संदर्भ में किया जाता है, जबकि गतिशील रूप से टाइप की जाने वाली भाषाओं का उपयोग कुछ समस्याओं को हल करने और कुछ कार्यों को स्वचालित करने के संदर्भ में किया जाता है। सांख्यिकीय रूप से टाइप की गई भाषाओं में कोड लिखना केवल लंबा लगता है और बोझिल होता है क्योंकि आप उन चीजों को नहीं कर सकते हैं जिन्हें आप जानते हैं कि आप ठीक करने जा रहे हैं, लेकिन टाइप सिस्टम अभी भी आपके द्वारा त्रुटियों के लिए आपके विरुद्ध सुरक्षा नहीं करता है। कई कोडर्स को यह भी एहसास नहीं होता है कि वे ऐसा इसलिए करते हैं क्योंकि यह उनके सिस्टम में है, लेकिन जब आप स्थिर भाषाओं में कोड करते हैं, तो आप अक्सर इस तथ्य के इर्द-गिर्द काम करते हैं कि टाइप सिस्टम आपको ऐसे काम नहीं करने देगा, जो गलत नहीं हो सकते, क्योंकि यह यह साबित नहीं होगा कि यह गलत नहीं होगा।
जैसा कि मैंने उल्लेख किया, सामान्य रूप से केस 2 में 'स्टेटिकली टाइप्ड', निर्दोष साबित होने तक दोषी। लेकिन कुछ भाषाएं, जो सभी प्रकार के नियम 1: निर्दोष साबित होने तक निर्दोष प्रकार के सिद्धांत से अपने प्रकार प्रणाली को प्राप्त नहीं करती हैं, जो आदर्श संकर हो सकती हैं। तो, शायद टाइप्ड रैकेट आपके लिए है।
इसके अलावा, अच्छी तरह से, एक और बेतुका और चरम उदाहरण के लिए, मैं वर्तमान में एक भाषा लागू कर रहा हूं जहां 'प्रकार' वास्तव में एक सरणी का पहला चरित्र है, वे डेटा हैं, 'प्रकार', 'प्रकार' का डेटा, जो स्वयं है एक प्रकार और डेटम, एकमात्र डेटम जो स्वयं एक प्रकार के रूप में है। प्रकार सांख्यिकीय रूप से परिमित या बाध्य नहीं हैं, लेकिन रनटाइम जानकारी के आधार पर नए प्रकार उत्पन्न हो सकते हैं।
गतिशील टाइपिंग का शायद सबसे बड़ा "लाभ" उथले सीखने की अवस्था है। सीखने के लिए कोई प्रकार की प्रणाली नहीं है और न ही गैर-तुच्छ वाक्यविन्यास जैसे कोने की कमी के लिए। यह गतिशील टाइपिंग को बहुत अधिक लोगों के लिए सुलभ बनाता है और कई लोगों के लिए संभव है जिनके लिए परिष्कृत स्थिर प्रकार सिस्टम पहुंच से बाहर हैं। नतीजतन, गतिशील टाइपिंग ने शिक्षा के संदर्भों (जैसे एमआईटी में योजना / पायथन) और गैर-प्रोग्रामर (उदाहरण के लिए गणितज्ञ ) के लिए डोमेन-विशिष्ट भाषाओं को पकड़ा है । डायनेमिक भाषाओं ने उन निशानों पर भी पकड़ बना ली है जहाँ उनकी प्रतिस्पर्धा बहुत कम है या नहीं (जैसे जावास्क्रिप्ट)।
सबसे संक्षिप्त गतिशील रूप से टाइप की जाने वाली भाषाएं (जैसे पर्ल, एपीएल, जे, के, मैथेमेटिका ) डोमेन विशिष्ट हैं और सबसे संक्षिप्त सामान्य प्रयोजन के सांख्यिकीय रूप से टाइप की गई भाषाओं (जैसे ओकेएमएल ) की तुलना में अधिक संक्षिप्त हो सकती हैं , जिन्हें वे डिजाइन किए गए थे। ।
डायनामिक टाइपिंग के मुख्य नुकसान हैं:
रन-टाइम टाइप त्रुटियां।
शुद्धता के समान स्तर को प्राप्त करने के लिए बहुत कठिन या व्यावहारिक रूप से असंभव हो सकता है और इसके लिए अत्यधिक परीक्षण की आवश्यकता होती है।
संकलक-सत्यापित दस्तावेज़ नहीं।
खराब प्रदर्शन (आमतौर पर रन-टाइम पर लेकिन कभी-कभी संकलन समय के बजाय, उदाहरण के लिए स्टालिन स्कीम) और परिष्कृत अनुकूलन पर निर्भरता के कारण अप्रत्याशित प्रदर्शन।
व्यक्तिगत रूप से, मैं गतिशील भाषाओं पर बड़ा हुआ, लेकिन उन्हें एक पेशेवर के रूप में 40 के पोल के साथ नहीं छूता जब तक कि कोई अन्य व्यवहार्य विकल्प नहीं थे।
आर्टिमा के टाइपिंग से: मजबूत बनाम कमजोर, स्थिर बनाम गतिशील लेख:
मजबूत टाइपिंग बेमेल प्रकारों के बीच संचालन को रोकती है। प्रकारों को मिलाने के लिए, आपको एक स्पष्ट रूपांतरण का उपयोग करना चाहिए
कमजोर टाइपिंग का मतलब है कि आप स्पष्ट रूपांतरण के बिना प्रकार मिला सकते हैं
पास्कल कोस्टानज़ा के पेपर में, डायनेमिक बनाम स्टेटिक टाइपिंग - एक पैटर्न-आधारित विश्लेषण (पीडीएफ), उनका दावा है कि कुछ मामलों में, डायनेमिक टाइपिंग की तुलना में स्टेटिक टाइपिंग अधिक त्रुटि-प्रवण है। कुछ सांख्यिकीय रूप से टाइप की गई भाषाएं आपको "द राइट थिंग" करने के लिए मैन्युअल रूप से डायनामिक टाइपिंग का अनुकरण करने के लिए मजबूर करती हैं। लैंबडा द अल्टीमेट में इसकी चर्चा है ।
यह संदर्भ पर निर्भर करता है। बहुत सारे लाभ जो गतिशील टाइप किए गए सिस्टम के साथ-साथ मजबूत टाइप के लिए भी उपयुक्त हैं। मेरा विचार है कि गतिशील प्रकार की भाषा का प्रवाह तेज है। कोड में क्या चल रहा है, यह सोचकर गतिशील भाषाओं को वर्ग की विशेषताओं और संकलक के साथ विवश नहीं किया जाता है। आपको थोड़े आजादी है। इसके अलावा, गतिशील भाषा आमतौर पर अधिक अभिव्यंजक होती है और परिणाम कम कोड में होता है जो अच्छा है। इसके बावजूद, यह अधिक त्रुटि प्रवण है जो संदिग्ध भी है और इकाई परीक्षण कवर पर अधिक निर्भर करता है। यह डायनामिक लैंग के साथ आसान प्रोटोटाइप है लेकिन रखरखाव दुःस्वप्न बन सकता है।
स्थिर टाइप सिस्टम पर मुख्य लाभ आईडीई समर्थन और कोड का निश्चित रूप से स्थिर विश्लेषक है। आप प्रत्येक कोड परिवर्तन के बाद कोड के प्रति अधिक आश्वस्त हो जाते हैं। ऐसे उपकरणों के साथ रखरखाव केक की शांति है।
स्थिर और गतिशील भाषाओं के बारे में बहुत सारी चीजें हैं। मेरे लिए, मुख्य अंतर यह है कि गतिशील भाषाओं में चर निश्चित प्रकार नहीं होते हैं; इसके बजाय, प्रकार मूल्यों से बंधे हैं। इस वजह से, सटीक कोड जो निष्पादित हो जाता है वह रनटाइम तक अनिर्धारित है।
शुरुआती या भोले-भाले कार्यान्वयनों में यह एक बहुत बड़ा प्रदर्शन खींचता है, लेकिन आधुनिक जेआईटी टैंटलाइज़िंगली सर्वश्रेष्ठ के करीब पहुंचते हैं जो आपको स्थिर संकलक के अनुकूलन के साथ मिल सकते हैं। (कुछ फ्रिंज मामलों में, इससे भी बेहतर)।
यह नौकरी के लिए सही उपकरण के बारे में है। न तो समय का 100% बेहतर है। दोनों प्रणालियों को मनुष्य द्वारा बनाया गया था और इसमें खामियां थीं। क्षमा करें, लेकिन हम चूसना और सही सामान बनाना।
मुझे डायनेमिक टाइपिंग पसंद है क्योंकि यह मेरे रास्ते से हट जाता है, लेकिन हां रनटाइम एरर इस बात से कम हो सकता है कि मैंने इसकी योजना नहीं बनाई थी। जहाँ पर स्थैतिक टाइपिंग उपरोक्त त्रुटियों को ठीक कर सकती है, लेकिन एक नौसिखिए (टाइप की गई भाषाओं में) प्रोग्रामर पागल को लगातार चार और एक स्ट्रिंग के बीच डालने की कोशिश कर रहा है।
स्टैटिक टाइपिंग: जावा और स्काला जैसी भाषाएँ स्टैटिक टाइप की जाती हैं।
किसी कोड में उपयोग किए जाने से पहले चर को परिभाषित और आरंभ करना होता है।
पूर्व के लिए। इंट x; x = 10;
Println (x);
गतिशील टाइपिंग: पर्ल एक डायनेमिक टाइप की गई भाषा है।
कोड में उपयोग किए जाने से पहले चर को आरंभ करने की आवश्यकता नहीं है।
y = 10; कोड के बाद के भाग में इस चर का उपयोग करें