स्थैतिक प्रकार की जाँच का गैर-वंचित उदाहरण बहुत रूढ़िवादी है।


9

प्रोग्रामिंग भाषाओं में अवधारणाओं में , जॉन मिशेल लिखते हैं कि हालैंड समस्या के कारण स्थैतिक प्रकार की जांच आवश्यक रूप से रूढ़िवादी (अत्यधिक सख्त) है। वह एक उदाहरण के रूप में देता है:

if (complicated-expression-that-could-run-forever)
   then (expression-with-type-error)
   else (expression-with-type-error)

क्या कोई गैर-वंचित उत्तर प्रदान कर सकता है जो वास्तव में एक व्यावहारिक चिंता होगी?

मैं समझता हूं कि जावा इस तरह के मामलों के लिए गतिशील रूप से जाँच की जाती है:

if (foo instanceof Person) {
    Person p = (Person) foo;
    :
}

लेकिन मैं क्रॉस-भाषा के मुद्दे से अधिक जावा भाषा / संकलक की कमी की आवश्यकता पर विचार करता हूं।


2
जावा उदाहरण आपके द्वारा दिया गया है की एक गैर काल्पनिक उदाहरण स्थिर प्रकार की जाँच भी रूढ़िवादी जा रहा है। दूसरा तरीका रखें: जवाब इस बात पर निर्भर करता है कि आपके पास किस प्रकार की प्रणाली है। किसी भी उदाहरण के लिए हम आते हैं, हमेशा एक प्रकार की प्रणाली होगी जो उस उदाहरण को संभाल सकती है (उस उदाहरण पर टाइप सिस्टम बहुत रूढ़िवादी नहीं है)। किसी भी प्रकार की प्रणाली के लिए, हम हमेशा एक उदाहरण पा सकते हैं जहां यह बहुत रूढ़िवादी है। इसलिए, मुझे लगता है कि आपको टाइप सिस्टम को निर्दिष्ट करने की आवश्यकता है। यदि जावा प्रकार प्रणाली वह नहीं है जो आपके मन में थी, तो क्या कुछ और विशिष्ट है जिसके बारे में आप सोच रहे थे? एमएल-शैली प्रकार इंजेक्शन?
DW

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

जवाबों:


7

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

स्थैतिक प्रकार प्रणाली के साथ चाल सिर्फ उन मामलों के लिए सही प्रकार के लचीलेपन की पेशकश करने के लिए है जहां लचीलापन आपको कोड लिखने की अनुमति देता है जो अधिक आसानी से संभव है।

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

जेनरिक और कंटेनर

एमएल (सी। 1973) और सीएलयू (सी। 1974) से पहले सांख्यिकीय रूप से टाइप की गई भाषाओं में , स्ट्रिंग्स का लाल-काला पेड़, पूर्णांक का लाल-काला पेड़, तैरने का लाल-काला पेड़, या विशिष्ट प्रकार के तत्वों का लाल-काला पेड़ Foo। हालाँकि, यह मुश्किल था (शायद असंभव) कि लाल-काले पेड़ का एक भी क्रियान्वयन बनाया जा सके, जो कि सांख्यिकीय रूप से जाँच किया गया था और जो इन डेटा प्रकारों में से किसी एक को संभाल सकता था। समस्या के आसपास के तरीके (1) प्रकार की प्रणाली से पूरी तरह से बाहर निकलने के लिए थे (उदाहरण के लिए: उपयोग करकेvoid * सी में), (2) अपने आप को किसी प्रकार के मैक्रो प्रीप्रोसेसर लिखने के लिए और फिर मैक्रोज़ लिखें जो आपके द्वारा वांछित प्रत्येक विशिष्ट प्रकार के लिए कोड का उत्पादन करता है या (3) निकाले गए प्रकार की जांच के लिए लिस्प / स्मॉलटाक (और जावा) दृष्टिकोण का उपयोग करता है। गतिशील रूप से वस्तु।

ML और CLU ने क्रमशः, अनुमानित और स्पष्ट रूप से घोषित (स्थिर) पैरामीटर प्रकारों की धारणा पेश की, जो आपको सामान्य, स्टेटिक रूप से टाइप किए गए, कंटेनर प्रकार लिखने की अनुमति देते हैं।

उप-प्रकार बहुरूपता

Simula67 (c। 1967) और होप (c। 1977) से पहले सांख्यिकीय रूप से टाइप की गई भाषाओं में, यह संभव नहीं है कि दोनों डायनामिक प्रेषण करें और स्टेटिकली चेक करें कि आपने हर उपप्रकार के लिए केस कवर किया था। कई भाषाओं में टैग की गई यूनियनों के कुछ रूप थे , लेकिन यह प्रोग्रामर की जिम्मेदारी थी कि वे यह सुनिश्चित करें कि उनके caseया switchबयानों, या उनके जंप टेबल, हर संभव टैग को कवर करें।

सिमूला मॉडल (C ++, जावा, C #, एफिल) के बाद की भाषाएं उपवर्ग के साथ सार कक्षाएं प्रदान करती हैं, जहां कंपाइलर यह जांच सकता है कि प्रत्येक उपवर्ग ने मूल वर्ग द्वारा घोषित सभी विधियों को लागू किया है। होप मॉडल (सभी एमएल वेरिएंट, एसएमएल / एनजे से हास्केल के माध्यम से) के बाद की भाषाओं में बीजीय उपप्रकार हैं, जहां कंपाइलर जांच कर सकता है कि हर typecaseबयान में सभी उपप्रकार शामिल हैं।

बंदर पैचिंग और पहलू ओरिएंटेड प्रोग्रामिंग

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

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

1970 के दशक में जेनेरिक और सबटाइप पॉलीमॉर्फिज्म के विपरीत, जहाँ प्रमुख स्थैतिक जाँच विचार उपलब्ध थे, पहलू उन्मुख प्रोग्रामिंग के लिए स्थैतिक जाँच एक सक्रिय शोध क्षेत्र है। मैं इसके बारे में ज्यादा नहीं जानता, सिवाय इसके कि 2001 के बाद से एस्पेक्टज नामक एक भाषा है ।

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