2009-04-17 18 views
13

स्थिर रूप से टाइप की गई भाषाओं की तुलना में गतिशील रूप से टाइप की गई भाषाओं को गति देना मुश्किल बनाता है। दूसरे शब्दों में स्थिर रूप से टाइप की गई भाषाओं की अंतर्निहित संपत्ति क्या है जो उन्हें निष्पादन की गति के लिए अनुकूलित करने में आसान बनाती है?डायनामिक रूप से टाइप की गई भाषाएं धीमी क्यों हैं?

उत्तर

20

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

गतिशील भाषाओं में, नाम तारों पर आधारित होते हैं। foo.bar देखना चाहते हैं? स्थानीय चर हैश तालिका में foo पाएं, फिर foo की हैश तालिका में bar खोजें। पाइथन और रूबी जैसी कुछ गतिशील भाषाओं में, गतिशील रूप से जेनरेट किए गए विशेषताओं को लागू करने के लिए अतिरिक्त लुकअप/विधि कॉल हो सकती हैं।

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


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

+0

जब आप आवश्यकता महसूस करते हैं, तो सामान्य लिस्प में स्थाई रूप से टाइप करना संभव है। गति के लिए बनाया गया एक कार्यान्वयन बहुत तेज़ कोड उत्पन्न कर सकता है। –

0

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

+1

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

+0

आम लिस्प वास्तव में मशीन कोड में संकलित किया जा सकता है। –

+0

सबसे अच्छा सामान्य लिस्प कार्यान्वयन मशीन कोड के लिए संकलित। कुछ में एक दुभाषिया नहीं है, वे सिर्फ जेआईटी संकलन करते हैं। –

10

कुछ प्रकार के संकलन समय अनुकूलन केवल तभी किए जा सकते हैं जब एक चर का सटीक प्रकार ज्ञात हो।

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

10

देखो:

def fact(n): 
    if n==0: 
     return n 
    return n*fact(n-1) 

n क्या है? क्या यह एक संख्या है? क्या यह एक स्ट्रिंग है? क्या यह एक वर्ग है जिसे आपने पहले परिभाषित किया था? कंपाइलर को यह जानने का कोई तरीका नहीं है कि यह कौन सा इनपुट प्राप्त करेगा। आपको रन-टाइम पर बहुत सारी जांच करनी है, जिसका मतलब है कि आप सरल संचालन के लिए अधिक निहित काम कर रहे हैं।

+2

वास्तव में ओकैम, एफ #, और हास्केल समर्थन प्रकार-अनुमान (http://en.wikipedia.org/wiki/Type_inference) की तरह कुछ शर्मनाक है, इसलिए संकलक प्रकार के एनोटेशन के बिना इसके उपयोग के आधार पर एक चर के डेटाटाइप को निर्धारित कर सकता है । उदाहरण के लिए, 'n == 0', एक पूर्णांक अक्षर के लिए समानता परीक्षण इंगित करता है कि 'n' एक पूर्णांक है। चूंकि संकलक जानता है कि 'एन' एक पूर्णांक है, तो 'वापसी n' का अर्थ है कि फ़ंक्शन एक पूर्णांक भी देता है। इसलिए, हम यह निर्धारित कर सकते हैं कि फ़ंक्शन एक int लेता है और एक int देता है। – Juliet

+2

@ प्रिंसेस: आह, लेकिन क्या यह मशीन के आकार का इंट या बिग्नम है? आपको अभी भी इसका परीक्षण करना होगा (लेकिन इसे कुशलता से किया जा सकता है) – simon

+0

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

4

गतिशील रूप से टाइप की गई भाषाओं को अपने सभी चेक रनटाइम पर बनाना चाहिए क्योंकि प्रकार निष्पादन के दौरान बदल सकता है।

स्टेटिक टाइप की गई भाषा संकलन समय के दौरान सभी प्रकारों को हल करती है ताकि लागत एक बार सामने आ जाए।

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

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

+0

गतिशील भाषाओं को संकलित किया जा सकता है ;-) – Ponkadoodle

+0

आपका मतलब है कि गतिशील रूप से टाइप की गई भाषा का एक बहुत अच्छा कार्यान्वयन स्थिर रूप से टाइप की गई भाषा के बहुत खराब कार्यान्वयन से तेज़ हो सकता है। – niagr

1

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

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

हालांकि, अगर आप कहें, पायथन और सी ++ के बीच मतभेदों के बारे में सोच रहे हैं, उदाहरण के लिए, यह गतिशील बनाम स्थैतिक नहीं है जो वास्तव में मुद्दा है।

+0

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

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

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