वाक्यांश "स्टैटिक टाइपिंग" और "डायनेमिक टाइपिंग" जैसे शब्द बहुत अधिक हैं, और लोग आसानी से अलग-अलग परिभाषाओं का उपयोग करते हैं, तो चलिए स्पष्ट करते हैं कि हमारा क्या मतलब है।
उस भाषा पर विचार करें जिसमें स्थिर प्रकार हैं जिन्हें संकलन-समय पर जांचा जाता है। लेकिन कहते हैं कि एक प्रकार की त्रुटि केवल एक गैर-घातक चेतावनी उत्पन्न करती है, और रनटाइम में, सब कुछ डक-टाइप किया जाता है। ये स्थैतिक प्रकार केवल प्रोग्रामर की सुविधा के लिए हैं, और कोडेन को प्रभावित नहीं करते हैं। इससे पता चलता है कि स्थैतिक टाइपिंग स्वयं किसी सीमा को नहीं लगाती है, और गतिशील टाइपिंग के साथ पारस्परिक रूप से अनन्य नहीं है। (ऑब्जेक्टिव-सी इस तरह से बहुत कुछ है।)
लेकिन अधिकांश स्टैटिक टाइप सिस्टम इस तरह का व्यवहार नहीं करते हैं। स्थैतिक प्रकार प्रणालियों के दो सामान्य गुण हैं जो सीमाएं लगा सकते हैं:
कंपाइलर एक प्रोग्राम को अस्वीकार कर सकता है जिसमें एक स्थिर प्रकार की त्रुटि होती है।
यह एक सीमा है क्योंकि कई प्रकार के सुरक्षित कार्यक्रमों में आवश्यक रूप से एक स्थिर प्रकार की त्रुटि होती है।
उदाहरण के लिए, मेरे पास एक पायथन स्क्रिप्ट है जिसे पायथन 2 और पायथन 3 दोनों के रूप में चलाने की आवश्यकता है। कुछ कार्यों ने पायथन 2 और 3 के बीच अपने पैरामीटर प्रकार बदल दिए हैं, इसलिए मेरे पास इस तरह का कोड है:
if sys.version_info[0] == 2:
wfile.write(txt)
else:
wfile.write(bytes(txt, 'utf-8'))
एक पायथन 2 स्टैटिक टाइप चेकर पायथन 3 कोड (और इसके विपरीत) को अस्वीकार कर देगा, भले ही इसे कभी भी निष्पादित नहीं किया जाएगा। मेरे प्रकार के सुरक्षित कार्यक्रम में एक स्थिर प्रकार की त्रुटि है।
एक अन्य उदाहरण के रूप में, एक मैक प्रोग्राम पर विचार करें जो ओएस एक्स 10.6 पर चलना चाहता है, लेकिन 10.7 में नई सुविधाओं का लाभ उठाएं। 10.7 विधियाँ रनटाइम पर मौजूद हो सकती हैं या नहीं भी हो सकती हैं, और यह मुझे, प्रोग्रामर पर है, उनका पता लगाने के लिए। एक स्थिर प्रकार चेकर को या तो सुरक्षा सुनिश्चित करने के लिए मेरे कार्यक्रम को अस्वीकार करने के लिए मजबूर किया जाता है, या रनटाइम में एक प्रकार की त्रुटि (फ़ंक्शन लापता) के उत्पादन की संभावना के साथ-साथ कार्यक्रम को स्वीकार करना चाहिए।
स्टेटिक प्रकार की जाँच यह मानती है कि संकलित समय सूचना द्वारा रनटाइम वातावरण को पर्याप्त रूप से वर्णित किया गया है। लेकिन भविष्य की भविष्यवाणी खतरनाक है!
यहाँ एक और सीमा है:
संकलक कोड उत्पन्न कर सकता है जो मानता है कि रनटाइम प्रकार स्थिर प्रकार है।
स्थैतिक प्रकारों को "सही" मान लेने से अनुकूलन के कई अवसर मिलते हैं, लेकिन ये अनुकूलन सीमित हो सकते हैं। एक अच्छा उदाहरण प्रॉक्सी ऑब्जेक्ट्स हैं, जैसे कि रीमोट करना। मान लें कि आपके पास एक स्थानीय प्रॉक्सी वस्तु है जो किसी अन्य प्रक्रिया में वास्तविक वस्तु के लिए आगे की विधि का उपयोग करती है। यह अच्छा होगा यदि प्रॉक्सी जेनेरिक था (इसलिए यह किसी भी वस्तु के रूप में बहक सकता है) और पारदर्शी (ताकि मौजूदा कोड को यह जानने की आवश्यकता न हो कि यह प्रॉक्सी से बात कर रहा है)। लेकिन ऐसा करने के लिए, संकलक कोड उत्पन्न नहीं कर सकता है जो मानता है कि स्थिर प्रकार सही हैं, उदाहरण के लिए वैधानिक रूप से इनलाइन विधि द्वारा, क्योंकि वह विफल हो जाएगा यदि ऑब्जेक्ट वास्तव में एक प्रॉक्सी है।
एक्शन में इस तरह के रीमोटिंग के उदाहरणों में ओबीजीसी के एनएसएक्सपीसीसीऑक्शन या सी # ट्रांसपेरेंटप्रॉक्सी शामिल हैं (जिनके कार्यान्वयन के लिए रनटाइम में कुछ निराशा की आवश्यकता होती है - एक चर्चा के लिए यहां देखें )।
जब कोडजन स्थिर प्रकारों पर निर्भर नहीं होता है, और आपके पास संदेश अग्रेषण जैसी सुविधाएं होती हैं, तो आप प्रॉक्सी वस्तुओं, डिबगिंग, आदि के साथ बहुत सारे शांत सामान कर सकते हैं।
तो अगर आप एक प्रकार के चेकर को संतुष्ट करने के लिए आवश्यक नहीं हैं, तो आप कुछ सामानों का नमूना ले सकते हैं। सीमाएं स्थैतिक प्रकारों द्वारा नहीं लगाई जाती हैं, लेकिन लागू स्थैतिक प्रकार की जाँच द्वारा।