2010-09-24 12 views
12

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

+0

एक स्थिर टाइप की गई भाषा के उदाहरण के लिए * * * में इस तरह के कुछ अंतर्निहित हैं, [opDispatch in D] (http://www.digitalmars.com/d/2.0/operatoroverloading.html पर एक नज़र डालें #Dispatch)। 'opDispatch' एक टेम्पलेट विधि है जो संकलन समय पर विधि का नाम और पैरामीटर प्रकार पारित किया जाता है, ताकि आप लापता विधि को "चलाने" के तरीके को निर्धारित करने के लिए मेटाप्रोग्रामिंग का उपयोग कर सकें। बेशक, संकलक द्वारा अभी भी सब कुछ स्थिर रूप से हल किया गया है। [संबंधित SO प्रश्न] (http://stackoverflow.com/questions/3098242/fast-vector-struct-that-allows-i-and-xyz-operations-in-d)। – shambulator

उत्तर

21

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

परिशिष्ट

स्काला 2.9 तरीके कि अन्यथा स्थिर प्रकार की जाँच विफल हो जाएगा में प्रकार के लिए पहुंच के गतिशील हैंडलिंग की इस तरह सक्रिय करने के एक प्रयोगात्मक विकल्प पेश किया। इसे परिष्कृत किया गया था और 2.10 में गैर-प्रयोगात्मक बना दिया गया था, हालांकि यह अभी भी एक डिफ़ॉल्ट-अक्षम सुविधा ध्वज द्वारा नियंत्रित है। आप इसके बारे में SIP 17 दस्तावेज़ में पढ़ सकते हैं। स्कैला 2.10 के "मॉड्यूलरलाइजेशन" और फीचर झंडे के स्पष्टीकरण के लिए SIP 18 देखें।

+5

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

+0

जो रैंडल ने कहा वह सही है। "ऐतिहासिक रूप से" बेहतर या बदतर के लिए यह बनाम "संकलन समय" के लिए एक बड़ा विभाजन रहा है। ऐसा कहा जा रहा है कि कुछ नई भाषाएं अंतर को ब्रिज करने के करीब आती हैं (स्केल दिमाग में आता है, जो मुझे लगता है कि एक आरईपीएल है)। – rogerdpack

+0

@rogerdpack: स्कैला में निश्चित रूप से एक आरईपीएल है, हालांकि मैं इसे "गतिशील" होने का एक पहलू नहीं मानता, "भाषा के साथ काम करते समय बस एक बड़ी सुविधा। –

1

सांख्यिकीय रूप से टाइप की गई भाषाओं में, सदस्य फ़ंक्शंस सीधे आवेदक किए जाते हैं। यदि संकलक यह पता नहीं लगा सकता कि कौन सा सदस्य कार्य करने के लिए कार्य करता है, तो प्रोग्राम संकलित नहीं होगा। विधि आवेदक, इस अर्थ में, स्थैतिक है।

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

सी # 4 डायनामिक टाइपिंग के साथ स्थिर टाइपिंग को जोड़ता है। एक चर में संकलन-समय का प्रकार dynamic हो सकता है। इस चर पर किसी भी विधि के आमंत्रण को गतिशील रूप से टाइप की गई भाषाओं में संभाला जाएगा। स्थैतिक प्रकार वाले चर पर किसी भी विधि के आमंत्रण को स्थाई रूप से टाइप की गई भाषाओं में संभाला जाएगा।

# static invocation, bound at compile time by the compiler 
var s = 6; 
s.ToString(); 

# dynamic invocation, handled at runtime by the CLR 
dynamic d = 6; 
d.ToString(); 
+2

आप सामान मिला रहे हैं। प्रत्येक स्थिर रूप से टाइप की गई ओओ भाषा में गतिशील प्रेषण मौजूद है। और केवल कुछ गतिशील रूप से टाइप की गई भाषाएं टेक्स्टटाउन मॉडल का उपयोग स्मॉलटाक द्वारा अग्रणी के रूप में करती हैं। उदाहरण के लिए पाइथन संदेश पासिंग का उपयोग नहीं करता है (इसके बजाय, 'obj.method (args)' अनुवाद करता है "उस कार्य को प्राप्त करें जो' obj' बिंदुओं के 'विधि' सदस्य को प्राप्त करें, फिर इसे 'obj' के साथ पहले तर्क के रूप में कॉल करें और 'args'")। – delnan

+0

'var' के पास गतिशील टाइपिंग से कोई लेना देना नहीं है। यह संकलक को वैरिएबल के स्थैतिक प्रकार को उस मान से मूल्य का अनुमान लगाने का कारण बनता है। –

+0

सुधार के लिए धन्यवाद, तय। – yfeldblum

1

बस रंडाल्स पद आगे बढ़ाने के लिए, यह संभव है, लेकिन कारण यह स्थिर प्रतिमान के खिलाफ जाता है कि यह "गतिशील प्रेषण" से परे है है। गतिशील प्रेषण खुशी से आपको ऐसे फ़ंक्शन पर प्रेषित करने देता है जो गतिशील रूप से कोड के ज्ञात स्थिर टुकड़े से बंधे होते हैं। यानी कंपाइलर प्रेषण को सेट करता है जिसे दृढ़ता से रनटाइम पर निष्पादित किया जाता है, इसके परिप्रेक्ष्य से।

method_missing कॉल क्या करता है, अनिवार्य रूप से "सभी को पकड़ें" जहां आप तय करते हैं कि स्विच स्टेटमेंट का उपयोग करके विधि नाम के आधार पर क्या करना है, या कुछ समकक्ष (जो मुझे यकीन है कि आप जानते हैं)। इस प्रकार, संकलक को पता नहीं है कि यहां क्या होने जा रहा है।

if (function is known at compile time) 
{ 
    provide static call or dynamic call to "some" derivation 
} 
else 
{ 
    bind the function call to obj.method_missing(...) and pass in the "details" 
} 

तो फिर तुम method_missing इस तरह प्रदान करने के लिए:

def method_missing(intendedFunctionName, arguments) 
{ 
    if (intendedFunctionName is "X") 
    { 
    X may not need arguments, so just do something 
    } 
    else if (intendedFunctionName is "Y") 
    { 
    Y expects 5 arguments of varying types 
    Throw exception if there isn't the right number or types 
    } 
    ... etc ... 
} 

संकलक पूछ आप भेजने के लिए "मनमाना" (यानी संकलन समय पर नहीं जाना जाता है) के तर्कों मान लीजिए कि संकलक की तरह कुछ किया करते हैं मनमानी प्रकार, intendedFunctionName के साथ कि आप इसके लिए लेखांकन नहीं कर रहे हैं ... अच्छा, यह बहुत सुरक्षित नहीं है, और स्कैला का एक स्थिर रूप से सुरक्षित भाषा होना है।

हां, यह एक स्थिर भाषा की भावना में काम करने योग्य नहीं है। यदि आप वास्तव में उस प्रकार की लचीलापन चाहते हैं, तो पॉलीग्लोट प्रोग्रामिंग शायद आपका मित्र है।

नोट: उद्देश्य-सी सख्ती से स्थाई रूप से टाइप नहीं किया गया है। एक रनटाइम इंजन है जिस पर कोड निष्पादित होता है और गतिशील टाइपिंग सिस्टम कोड को छीनने या सी/सी ++ की तरह रेखांकित करने की अनुमति नहीं देता है।

+0

"कंपाइलर को आपको" मनमाने ढंग से "भेजने के लिए पूछना (यानी संकलन समय पर ज्ञात नहीं) मनमानी प्रकार के तर्क" और "बहुत सुरक्षित नहीं" ध्वनि जैसे सी varargs। :) – bk1e

0

उद्देश्य-सी में "method_missing" है (विशेष रूप से, forwardInvocation और methodSignatureForSelector) और यह तर्कसंगत रूप से टाइप किया गया है। यह काम करता है क्योंकि यह स्थिर प्रकार त्रुटियों को संकलन समय में त्रुटियों की बजाय चेतावनियों के रूप में मानता है, क्योंकि विधि प्रेषण रनटाइम पर C++ में वर्चुअल विधियों की तुलना में बहुत अधिक हद तक होता है (और यही कारण है कि आप "method_missing" कर सकते हैं)।

2

स्कैला संस्करण 2.9 Dynamic विशेषता (scaladoc) के माध्यम से इस कार्यक्षमता को प्रस्तुत करता है। Dynamic का विस्तार करने वाली कक्षाएं जादुई विधि applyDynamic(methodName, args) प्राप्त करती हैं, जो रूबी के method_missing के समान है। स्कैला 2.9 के रूप में, -Xexperimental विकल्प Dynamic का उपयोग करने के लिए सक्षम होना चाहिए।

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