स्थिर रूप से टाइप की गई भाषाओं की तुलना में गतिशील रूप से टाइप की गई भाषाओं को गति देना मुश्किल बनाता है। दूसरे शब्दों में स्थिर रूप से टाइप की गई भाषाओं की अंतर्निहित संपत्ति क्या है जो उन्हें निष्पादन की गति के लिए अनुकूलित करने में आसान बनाती है?डायनामिक रूप से टाइप की गई भाषाएं धीमी क्यों हैं?
उत्तर
स्थिर रूप से टाइप की गई भाषाओं में विशेषताओं/विधियों तक पहुंचने पर, आमतौर पर लुकअप को स्थिर फ़ंक्शन पते पर कम किया जा सकता है। यहां तक कि वर्चुअल विधियों के मामले में, जो धीमे होते हैं, लुकअप सिर्फ एक vtable से ऑफसेट पढ़ रहा है।
गतिशील भाषाओं में, नाम तारों पर आधारित होते हैं। foo.bar
देखना चाहते हैं? स्थानीय चर हैश तालिका में foo
पाएं, फिर foo
की हैश तालिका में bar
खोजें। पाइथन और रूबी जैसी कुछ गतिशील भाषाओं में, गतिशील रूप से जेनरेट किए गए विशेषताओं को लागू करने के लिए अतिरिक्त लुकअप/विधि कॉल हो सकती हैं।
इन सभी लुकअप बहुत तेजी से बनाने के लिए कठिन हैं। पाइथन दुनिया में सबसे अच्छी तरह से ट्यून किए गए हैश टेबल कार्यान्वयन में से एक है, और जावास्क्रिप्ट में इसे तेजी से बनाने में लाखों डॉलर के शोध धन डाले गए हैं। ये रणनीतियां काम करती हैं - आईई 5 के साथ क्रोम की जावास्क्रिप्ट की तुलना करें, यह देखने के लिए कि कितना - लेकिन वे केवल स्थिर रूप से फ़ंक्शन कॉल उत्पन्न करने से कहीं अधिक कठिन हैं।
मुझे यह उल्लेख करना चाहिए कि एक भाषा "गतिशील" कैसे भिन्न हो सकती है। पाइथन में वेरिएबल लुकअप के साथ बातचीत करने के कई अलग-अलग तरीके हैं, जो कुछ परिस्थितियों में अच्छा है, लेकिन ऑप्टिमाइज़ेशन को बहुत कठिन बनाता है। कॉमन लिस्प और स्मॉलटाक जैसी अन्य गतिशील भाषाएं कई उपयोग मामलों में स्थिर भाषाओं के साथ समान रूप से प्रतिस्पर्धा कर सकती हैं क्योंकि गतिशील लुकअप/संशोधन अधिक नियंत्रित होते हैं।
ऐसा इसलिए है क्योंकि स्थैतिक रूप से टाइप की गई भाषाओं को अक्सर मशीन कोड में संकलित किया जाता है जबकि गतिशील रूप से टाइप की जाने वाली भाषाएं ज्यादातर मामलों में एक दुभाषिया द्वारा संचालित होती हैं।
थोड़ा अधिक oversimplifying लगता है। किसी भी स्थिर सीएलआर या जेवीएम भाषा सहित सभी कोडिक रूप से टाइप की गई भाषा मशीन कोड तक संकलित नहीं होती हैं। सभी गतिशील रूप से टाइप की गई भाषाओं का अर्थ नहीं लिया जाता है, उदाहरण के लिए कई लिस्प को बाइटकोड में संकलित किया जा सकता है, और पाइथन और PHP के लिए कई कंपाइलर भी हैं। – Juliet
आम लिस्प वास्तव में मशीन कोड में संकलित किया जा सकता है। –
सबसे अच्छा सामान्य लिस्प कार्यान्वयन मशीन कोड के लिए संकलित। कुछ में एक दुभाषिया नहीं है, वे सिर्फ जेआईटी संकलन करते हैं। –
कुछ प्रकार के संकलन समय अनुकूलन केवल तभी किए जा सकते हैं जब एक चर का सटीक प्रकार ज्ञात हो।
गतिशील रूप से टाइप की गई भाषाओं ने अक्सर प्रकार निर्धारित करने के लिए तर्क जोड़ा है और यह सुनिश्चित करने के लिए कि मान प्रकार के लिए सही है। इस अजगर उदाहरण पर
देखो:
def fact(n):
if n==0:
return n
return n*fact(n-1)
n क्या है? क्या यह एक संख्या है? क्या यह एक स्ट्रिंग है? क्या यह एक वर्ग है जिसे आपने पहले परिभाषित किया था? कंपाइलर को यह जानने का कोई तरीका नहीं है कि यह कौन सा इनपुट प्राप्त करेगा। आपको रन-टाइम पर बहुत सारी जांच करनी है, जिसका मतलब है कि आप सरल संचालन के लिए अधिक निहित काम कर रहे हैं।
वास्तव में ओकैम, एफ #, और हास्केल समर्थन प्रकार-अनुमान (http://en.wikipedia.org/wiki/Type_inference) की तरह कुछ शर्मनाक है, इसलिए संकलक प्रकार के एनोटेशन के बिना इसके उपयोग के आधार पर एक चर के डेटाटाइप को निर्धारित कर सकता है । उदाहरण के लिए, 'n == 0', एक पूर्णांक अक्षर के लिए समानता परीक्षण इंगित करता है कि 'n' एक पूर्णांक है। चूंकि संकलक जानता है कि 'एन' एक पूर्णांक है, तो 'वापसी n' का अर्थ है कि फ़ंक्शन एक पूर्णांक भी देता है। इसलिए, हम यह निर्धारित कर सकते हैं कि फ़ंक्शन एक int लेता है और एक int देता है। – Juliet
@ प्रिंसेस: आह, लेकिन क्या यह मशीन के आकार का इंट या बिग्नम है? आपको अभी भी इसका परीक्षण करना होगा (लेकिन इसे कुशलता से किया जा सकता है) – simon
आप अभी भी बहुत स्थिर सोचते हैं - डायनामिक रीकंपिलेशन और विनिर्देश के बारे में (स्वयं कागजात पढ़ें)। दरअसल, वास्तविक प्रकार की जानकारी के आस-पास, एक गतिशील कंपाइलर एक स्थिर कंपाइलर की तुलना में तेज़ कोड भी उत्पन्न कर सकता है, क्योंकि यह मूल्य सीमा आदि के बारे में भी पता हो सकता है। शायद यह सवाल है कि भाषा बनाने के प्रयास में कितना धन लगाया जाता है तेज़ ... – blabla999
गतिशील रूप से टाइप की गई भाषाओं को अपने सभी चेक रनटाइम पर बनाना चाहिए क्योंकि प्रकार निष्पादन के दौरान बदल सकता है।
स्टेटिक टाइप की गई भाषा संकलन समय के दौरान सभी प्रकारों को हल करती है ताकि लागत एक बार सामने आ जाए।
यह मुख्य कारण है कि डायनामिक टाइप की गई भाषाएं आमतौर पर धीमी होती हैं। लेकिन इसके बारे में सोचने के लिए अन्य चीजें हैं। अन्य अनुकूलन के साथ संकलक या दुभाषिया, जीसी कार्यान्वयन, प्रेषण तालिका लेआउट और लुकअप एल्गोरिदम पर बहुत निर्भर करता है।
यह सब कार्यान्वयन पर निर्भर करता है: एक गतिशील टाइप की गई भाषा एक संकलित भाषा से तेज़ी से हो सकती है जो इसे पूरा करने के लिए और अधिक काम करती है।
गतिशील भाषाओं को संकलित किया जा सकता है ;-) – Ponkadoodle
आपका मतलब है कि गतिशील रूप से टाइप की गई भाषा का एक बहुत अच्छा कार्यान्वयन स्थिर रूप से टाइप की गई भाषा के बहुत खराब कार्यान्वयन से तेज़ हो सकता है। – niagr
आपका प्रश्न थोड़ा सा है क्योंकि गतिशील रूप से टाइप की गई भाषा वास्तव में धीमी नहीं होती है। कई उदाहरण अभ्यास में हो सकते हैं, लेकिन अन्य तेज़ होते हैं (जहां तेज़ अर्थ है "सी के लिए उचित रूप से तुलनीय" या ऐसा कुछ, सीएफ सामान्य लिस्प)।
कई गतिशील भाषाएं वीएम पर चल रही हैं या यहां तक कि व्याख्या की गई हैं, जो मंदी के कारण मंदी पैदा कर सकती हैं। एक निश्चित स्तर पर, ऐसे अनुकूलन हैं जो स्थैतिक भाषा कंपाइलर्स (या गतिशील वाले लोगों के लिए उपलब्ध हैं जो वादे के सही प्रकार को किसी चीज के बारे में गतिशील नहीं होते हैं) जो पूरी तरह गतिशील स्थिति में संभव नहीं हैं।
हालांकि, अगर आप कहें, पायथन और सी ++ के बीच मतभेदों के बारे में सोच रहे हैं, उदाहरण के लिए, यह गतिशील बनाम स्थैतिक नहीं है जो वास्तव में मुद्दा है।
यह भी ध्यान रखना अच्छा लगेगा कि, उदाहरण के लिए, हाल ही में जावास्क्रिप्ट बाइटकोड अनुवादक अक्सर सी ++ के रूप में तेज़ी से प्रदर्शन करते हैं। – eyelidlessness
- 1. मजबूत टाइप की गई क्लाइंट साइड भाषाएं?
- 2. अधिकांश एस-अभिव्यक्ति भाषाएं गतिशील रूप से टाइप क्यों की जाती हैं?
- 3. व्याख्या की गई भाषाएं - दुभाषिया
- 4. एक प्रोग्रामिंग भाषा कैसे सांख्यिकीय रूप से टाइप की गई और गतिशील रूप से टाइप की जा सकती है?
- 5. डायनामिक रूप से टाइप इन सी #
- 6. क्या स्थाई रूप से टाइप की गई प्रोग्रामिंग-भाषाएं विरासत के साथ हैं जहां विधि पैरामीटर contravariant हैं?
- 7. डायनामिक रूप से टाइप की गई भाषाओं में मानचित्र/सूचियों के लिए परिवर्तनीय नामकरण सम्मेलन
- 8. सी # गतिशील रूप से टाइप की गई भाषा
- 9. गतिशील रूप से टाइप की गई भाषा के साथ रिफैक्टरिंग
- 10. डायनामिक रूप से संसाधन स्ट्रिंग्स
- 11. डिफ़ॉल्ट रूप से Windows XP में कौन सी प्रोग्रामिंग भाषाएं स्थापित की गई हैं
- 12. क्या ऐसी कोई भाषाएं हैं जो गतिशील रूप से टाइप की गई हैं लेकिन कमजोर टाइपिंग की अनुमति नहीं देते हैं?
- 13. टाइप की गई कमांड लाइन
- 14. क्या कोई स्थैतिक टाइप, एम्बेड करने योग्य स्क्रिप्टिंग भाषाएं हैं?
- 15. Breeze.js टाइप की गई इकाइयां
- 16. गतिशील/ढीले-टाइप की गई भाषाओं में इंटरफ़ेस क्यों?
- 17. कार्यों की एक टाइप की गई सरणी
- 18. भाषाएं डिफ़ॉल्ट रूप से पूर्णांक ओवरफ़्लो पर त्रुटियां क्यों नहीं उठाती हैं?
- 19. विशेष रूप से स्थिर सत्यापन को बनाने के लिए डिज़ाइन की गई भाषाएं
- 20. कुछ प्रोग्रामिंग भाषाएं दूसरों की तुलना में तेज़ी से क्यों हैं?
- 21. इतनी सारी प्रोग्रामिंग भाषाएं क्यों हैं?
- 22. वेब प्रोग्रामिंग के लिए मजबूत टाइप की गई भाषाओं
- 23. क्या सीएसएस स्टाइलशीट्स असीमित रूप से लोड की गई हैं
- 24. iframes इतनी धीमी क्यों हैं?
- 25. गतिशील रूप से लोड की गई लाइब्रेरी
- 26. टैब के डायनामिक रूप से
- 27. क्या PowerShell एक दृढ़ता से टाइप की गई भाषा है?
- 28. मूल सी/सी ++ की तुलना में जेआईटी-एड भाषाएं अभी भी धीमी और कम मेमोरी कुशल क्यों हैं?
- 29. एप्लिकेशन की संसाधन भाषाएं
- 30. डायनामिक रूप से तैयार सामग्री
जब आप आवश्यकता महसूस करते हैं, तो सामान्य लिस्प में स्थाई रूप से टाइप करना संभव है। गति के लिए बनाया गया एक कार्यान्वयन बहुत तेज़ कोड उत्पन्न कर सकता है। –