2010-04-18 11 views
15

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

+6

कैसे? दोनों प्रतिमानों की कीमत पर। –

उत्तर

9

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

लेकिन सी भी इस सुविधा प्रदान करता है। यदि आप केवल शून्य * टाइप सी के बारे में सोचते हैं, तो आप देखेंगे कि यह किसी भी प्रकार को इंगित कर सकता है, इसलिए आपको गतिशील रूप से टाइप की गई भाषा (बहुत मोटा) दे रहा है।

उदाहरण के लिए:

int i; 
float f; 
double d; 
void *p = &i; 
p = &f; 
p = &d; 

ऊपर p करने के लिए उन सभी असाइनमेंट पर, यह एक अलग प्रकार को इंगित करने के लिए बनाया गया है। आप चतुराई से पर्याप्त अपने कोड है, तो आप भी सी

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

1

यदि आप दोनों मुहावरे का समर्थन करने की तकनीकी क्षमता के बारे में पूछ रहे हैं, तो यह एक विशेष रूप से दिलचस्प सवाल नहीं है। बस सबसे आधुनिक भाषाओं को देखें और देखें कि वे इसे कैसे करते हैं। आमतौर पर, यह किसी प्रकार के कैच-सभी गतिशील प्रकार (Object वीबी में, dynamic सी #, void* सी में और इसी तरह के माध्यम से है)।

आध्यात्मिक/सत्तामूलक स्तर पर, यह सवाल भी बहुत कुछ दिलचस्प है ...

भौतिकी व्यवहार कि अंतर्ज्ञान खारिज कर देता है सुझाव दे सकता है में एक सिद्धांत है, एक प्रमुख पूछने के लिए, "यह कैसे हो सकता है?" मिसाल के तौर पर, तरंग-कण द्वंद्व वास्तविकता या कैसे होना चाहिए, इस बारे में किसी भी सामंजस्यपूर्ण धारणा से परे है, और इसलिए यह हमें अतुलनीय सोचने के लिए छोड़ देता है।

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

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

+7

यह एसओ पर मैंने कभी देखा है कि सबसे अप्रिय, असहनीय उत्तरों में से एक है। – jpswain

+1

@ नारंगी 80: आपका स्वागत है। –

+0

जो कुछ मैं समझता हूं उससे यह है कि ऐसा इसलिए है क्योंकि लोगों ने इसे इस तरह बनाया है .. बहुत सारे शब्दों में शायद। – madhukar93

0

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

21

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

हालांकि, उद्देश्य-सी विधि कॉल संदेश पारित करने वाले संदेश का उपयोग करती है, जहां संदेश का नाम और लक्ष्य संकलन समय पर एन्कोड किया जाता है, लेकिन निष्पादित करने के लिए कोड का पता रन-टाइम पर ऑब्जेक्टिव-सी रनटाइम लाइब्रेरी द्वारा देखा जाता है।

+0

मैं वास्तव में वही प्रश्न सोच रहा था क्योंकि ऐप्पल ऑब्जेक्टिव-सी प्रलेखन में कहा गया है कि गतिशील विधि संकल्प के कारण उद्देश्य-सी गतिशील रूप से टाइप किया गया है। मैं मानता हूं कि दस्तावेज़ीकरण लोगों को इस कार्यक्षमता के आधार पर गतिशील रूप से टाइप करके यह भ्रमित नहीं करना चाहिए। – Oscar

+1

क्या यह "वैकल्पिक रूप से टाइप नहीं किया गया" है, हालांकि, यदि आप चाहते थे, तो आप सभी ओब्जे-सी ऑब्जेक्ट्स को _id_ टाइप कर सकते हैं और सी प्राइमेटिव्स से अलग प्रकारों को पूरी तरह से उपेक्षा कर सकते हैं, जैसे _int_ अगर आप उनका उपयोग कर रहे हैं? – jpswain

+0

@ orange80, 'id' * * एक प्रकार है। वास्तव में, उद्देश्य-सी में सभी ऑब्जेक्ट उदाहरण संकलक-प्रकार 'आईडी' (एक' struct objc_object * ') के लिए हैं। स्टेटिक टाइपिंग सी में वैकल्पिक नहीं है, न ही उद्देश्य-सी में। –

0

उद्देश्य-सी में स्थैतिक और गतिशील टाइपिंग का मिश्रण है। सादा सी ऑब्जेक्ट्स स्थिर रूप से टाइप किए जाते हैं, लेकिन उद्देश्य-सी ऑब्जेक्ट्स गतिशील रूप से टाइप किए जाते हैं। उद्देश्य-सी रनटाइम परवाह नहीं करता है कि ऑब्जेक्ट द्वारा आपके द्वारा भेजे जाने वाले संदेशों को जब तक ऑब्जेक्ट द्वारा भेजा जाता है तब तक ऑब्जेक्ट का प्रकार किस प्रकार होता है।

-1

स्थैतिक रूप से टाइप की गई भाषाएं और गतिशील रूप से टाइप की गई भाषाएं वास्तव में विरोध करती हैं - कम से कम इन शर्तों का सामान्य रूप से उपयोग किया जाता है।

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

एक गतिशील रूप से टाइप की गई भाषा में ऐसे प्रकार की जांच चरण की कमी है। इसलिए उद्देश्य सी इस परिभाषा द्वारा गतिशील रूप से टाइप नहीं किया गया है - और मुझे लगता है कि यह सबसे मानक परिभाषा है।

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

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

संबंधित मुद्दे