प्रोग्रामिंग भाषा की "गति" को क्या नियंत्रित करता है?
प्रोग्रामिंग भाषा की "गति" जैसी कोई चीज नहीं है। एक विशेष वातावरण में चलने वाले विशेष निष्पादन इंजन के किसी विशेष संस्करण के एक विशेष संस्करण द्वारा निष्पादित एक विशेष प्रोग्रामर द्वारा लिखे गए एक विशेष कार्यक्रम की गति है।
विभिन्न कार्यान्वयनों का उपयोग करके एक ही मशीन पर एक ही भाषा में लिखे गए समान कोड को चलाने में भारी प्रदर्शन अंतर हो सकते हैं। या यहां तक कि एक ही कार्यान्वयन के विभिन्न संस्करणों का उपयोग करना। उदाहरण के लिए, एक ही मशीन पर स्पाइडरमोंकी के 10 साल पहले के संस्करण का उपयोग करके सटीक एक ही ईसीएमएस्क्रिप्ट बेंचमार्क चलाना, इस वर्ष के एक संस्करण बनाम संभवतः 2 × -5 ×, शायद 10 × के बीच कहीं भी प्रदर्शन में वृद्धि होगी। क्या इसका मतलब यह है कि ECMAScript ECMAScript की तुलना में 2 × अधिक तेज है, क्योंकि एक ही मशीन पर एक ही प्रोग्राम चलाने से नए कार्यान्वयन के साथ 2 × अधिक तेज है? इसका कोई मतलब नहीं है।
यह स्मृति प्रबंधन के साथ कुछ भी करना है?
ज़रुरी नहीं।
ऐसा क्यों होता है?
संसाधन। पैसे। Microsoft शायद अपने कंपाइलर प्रोग्रामर के लिए पूरे PHP, Ruby, और Python समुदाय की तुलना में कॉफी बनाने वाले अधिक लोगों को नियुक्त करता है, जिसमें संयुक्त रूप से अपने VMs पर काम करने वाले लोग होते हैं।
प्रोग्रामिंग भाषा की कमोबेश किसी भी सुविधा के लिए जो किसी तरह से प्रदर्शन को प्रभावित करती है, एक समाधान भी है। उदाहरण के लिए, C (मैं यहाँ समान भाषाओं की श्रेणी के लिए स्टैंड-इन के रूप में C का उपयोग कर रहा हूँ, जिनमें से कुछ C के पहले भी मौजूद हैं) मेमोरी-सुरक्षित नहीं है, ताकि एक ही समय में चलने वाले कई C प्रोग्राम्स को रौंद सकें एक दूसरे की स्मृति। इसलिए, हम वर्चुअल मेमोरी का आविष्कार करते हैं, और सभी सी प्रोग्राम्स को अप्रत्यक्ष की एक परत के माध्यम से चलते हैं ताकि वे दिखावा कर सकें कि वे मशीन पर चलने वाले एकमात्र हैं। हालाँकि, यह धीमा है, और इसलिए, हम MMU का आविष्कार करते हैं, और इसे तेज करने के लिए हार्डवेयर में वर्चुअल मेमोरी को लागू करते हैं।
परंतु! मेमोरी-सुरक्षित भाषाओं को वह सब नहीं चाहिए! वर्चुअल मेमोरी होने से उन्हें एक बिट की मदद नहीं मिलती है। वास्तव में, यह बदतर है: न केवल आभासी मेमोरी मेमोरी-सुरक्षित भाषाओं, वर्चुअल मेमोरी की मदद करती है, बल्कि हार्डवेयर में लागू होने पर भी, प्रदर्शन को प्रभावित करती है। यह कचरा संग्राहकों के प्रदर्शन के लिए विशेष रूप से हानिकारक हो सकता है (जो कि स्मृति-सुरक्षित भाषाओं के कार्यान्वयन की एक महत्वपूर्ण संख्या है)।
एक अन्य उदाहरण: आधुनिक मुख्यधारा के सामान्य उद्देश्य सीपीयू कैश मिस की आवृत्ति को कम करने के लिए परिष्कृत ट्रिक का उपयोग करते हैं। उन चालों में से बहुत से यह अनुमान लगाने की कोशिश कर रहे हैं कि किस कोड को निष्पादित किया जा रहा है और भविष्य में किस मेमोरी की आवश्यकता है। हालाँकि, उच्च स्तर की रनटाइम बहुरूपता वाली भाषाओं (उदाहरण के लिए OO भाषाएँ) के लिए, वास्तव में, उनके पहुँच पैटर्न की भविष्यवाणी करना वास्तव में कठिन है।
लेकिन, एक और तरीका है: कैश मिस की कुल लागत एक व्यक्ति कैश मिस की लागत से कैश मिस की संख्या को गुणा करना है। मुख्यधारा के सीपीयू मिसेस की संख्या को कम करने की कोशिश करते हैं, लेकिन क्या होगा अगर आप किसी व्यक्ति की मिस की लागत को कम कर सकते हैं?
अज़ुल वेगा -3 सीपीयू को विशेष रूप से वर्चुअलाइज्ड जेवीएम को चलाने के लिए डिज़ाइन किया गया था, और इसमें कचरा संग्रह और भागने का पता लगाने में मदद करने के लिए कुछ विशेष निर्देशों के साथ एक बहुत शक्तिशाली MMU था (स्थैतिक भागने विश्लेषण के बराबर गतिशील) और शक्तिशाली मेमोरी कंट्रोलर, और पूरी प्रणाली। अभी भी उड़ान में 20000 से अधिक बकाया कैश मिसेज के साथ प्रगति कर सकता है। दुर्भाग्य से, अधिकांश भाषा-विशिष्ट सीपीयू की तरह, इसका डिज़ाइन "दिग्गज" इंटेल, एएमडी, आईबीएम और पसंद द्वारा केवल बाहर-खर्च किया गया था और बाहर-जानवर-मजबूर था।
सीपीयू आर्किटेक्चर सिर्फ एक उदाहरण है जिसका प्रभाव किसी भाषा के उच्च निष्पादन कार्यान्वयन के लिए कितना आसान है या कितना कठिन है। C, C ++, D, Rust जैसी भाषा जो आधुनिक मुख्यधारा सीपीयू प्रोग्रामिंग मॉडल के लिए एक अच्छी फिट है, जावा, ECMAScript, पायथन, रूबी जैसी सीपीयू को "लड़ना" और उसे दरकिनार करने वाली भाषा की तुलना में तेज़ बनाना आसान होगा। , PHP।
वास्तव में, यह सब पैसे का सवाल है। यदि आप ECMAScript में उच्च-प्रदर्शन एल्गोरिदम को विकसित करने के लिए समान मात्रा में खर्च करते हैं, तो ECMAScript का उच्च-प्रदर्शन कार्यान्वयन, ECMAScript के लिए डिज़ाइन किया गया उच्च-प्रदर्शन ऑपरेटिंग सिस्टम, ECMAScript के लिए डिज़ाइन किया गया उच्च-प्रदर्शन CPU जैसा कि पिछले खर्च किया गया है C जैसी भाषाओं को बनाने में दशकों का समय तेजी से आगे बढ़ता है, तो आप संभवतः समान प्रदर्शन देखेंगे। यह सिर्फ इतना है कि, इस समय, ECMAScript जैसी भाषाओं को तेजी से बनाने की तुलना में सी-जैसी भाषाओं को बनाने में बहुत अधिक पैसा खर्च किया गया है, और सी-जैसी भाषाओं की मान्यताओं को एमएमयू और सीपीयू से लेकर ऑपरेटिंग सिस्टम तक पूरे स्टैक में बेक किया गया है। लाइब्रेरी और फ्रेमवर्क तक वर्चुअल मेमोरी सिस्टम।
व्यक्तिगत रूप से, मैं रूबी से सबसे अधिक परिचित हूं (जिसे आम तौर पर "धीमी भाषा" माना जाता है), इसलिए मैं दो उदाहरण दूंगा: रूबिनियस में Hash
वर्ग (रूबी में एक केंद्रीय डेटा संरचना, एक प्रमुख मूल्य शब्दकोश) रूबी कार्यान्वयन 100% शुद्ध रूबी में लिखा गया है, और इसमें लगभग उसी तरह का प्रदर्शन हैHash
YARV में कक्षा (सबसे व्यापक रूप से उपयोग किया जाने वाला कार्यान्वयन), जो C. में लिखा गया है और YARV के लिए C एक्सटेंशन के रूप में लिखा गया एक छवि हेरफेर लाइब्रेरी है, जिसमें कार्यान्वयन के लिए एक (धीमी) शुद्ध रूबी "फॉलबैक संस्करण" भी है। 'टी सपोर्ट सी' जो अत्यधिक गतिशील और चिंतनशील रूबी ट्रिक की एक टन का उपयोग करता है; JRuby की एक प्रायोगिक शाखा, Oracle लैब्स द्वारा Truffle AST इंटरप्रेटर फ्रेमवर्क और ग्रेगल JIT संकलन फ्रेमवर्क का उपयोग करते हुए, उस शुद्ध रूबी "फॉलबैक संस्करण" को निष्पादित कर सकती है, जितना कि YARV मूल उच्च-अनुकूलित C संस्करण को निष्पादित कर सकता है। यह वास्तव में गतिशील रनटाइम ऑप्टिमाइजेशन, जेआईटी संकलन, और आंशिक मूल्यांकन के साथ वास्तव में चतुर सामान बनाने वाले कुछ चतुर लोगों द्वारा प्राप्त किया गया है (ठीक है, कुछ भी लेकिन)।