एक प्रोग्राम को प्री-एक्सीक्यूशन कंपाइलेशन से अलग विधि का उपयोग करके रनटाइम पर कंपाइल किया जाता है। इस प्रक्रिया को जस्ट-इन-टाइम कंपाइलेशन या डायनामिक ट्रांसलेशन के रूप में जाना जाता है।
इस पोस्ट में, हम देखेंगे कि JIT कंपाइलेशन आपके रूबी ऑन रेल्स ऐप के लिए एक अच्छा विकल्प क्यों हो सकता है, इससे पहले कि हम उपलब्ध कुछ विकल्पों (YJIT, MJIT, और TenderJIT) को देखें और उन्हें कैसे इंस्टॉल करें।
लेकिन पहले: JIT कंपाइलर कैसे काम करता है?
JIT कंपाइलर कैसे काम करता है
जस्ट-इन-टाइम कंपाइलेशन कंप्यूटर कोड चलाने की एक विधि है जिसमें प्रोग्राम चलाते समय कंपाइलेशन की आवश्यकता होती है।
इसमें सोर्स कोड का अनुवाद शामिल हो सकता है, लेकिन यह सबसे अधिक बार बाइटकोड को मशीन कोड में परिवर्तित करके किया जाता है, जिसे तब सीधे चलाया जाता है।
एक सिस्टम द्वारा JIT कंपाइलर का उपयोग करके निष्पादित किए जा रहे कोड का अक्सर लगातार विश्लेषण किया जाता है। यह कोड के उन अनुभागों की पहचान करता है जहां कंपाइलेशन या रीकंपाइलेशन का लाभ (गति के मामले में) लागत से अधिक होता है।
रूबी के लिए JIT कंपाइलेशन के लाभ
JIT कंपाइलेशन पारंपरिक दो विधियों के कुछ लाभों (और कमियों) को जोड़ता है जिनसे प्रोग्राम्स को मशीन कोड में परिवर्तित किया जाता है: इंटरप्रिटेशन और अहेड-ऑफ-टाइम कंपाइलेशन (AOT)।
मोटे तौर पर बोलते हुए, यह इंटरप्रिटेशन की लचीलापन को जनरेटेड कोड की गति के साथ जोड़ता है, और कंपाइलिंग और लिंकिंग का अतिरिक्त ओवरहेड (सिर्फ इंटरप्रेट करने के बजाय)।
JIT कंपाइलेशन डायनामिक कंपाइलेशन का एक प्रकार है जो अनुकूली अनुकूलन तकनीकों को सक्षम बनाता है, जिसमें डायनामिक रीकंपाइलेशन और कुछ माइक्रोआर्किटेक्चर के लिए अनुकूलित स्पीड-अप शामिल हैं। रनटाइम सिस्टम की देर से बंधे डेटा प्रकारों को संभालने और सुरक्षा गारंटी लगाने की क्षमता के कारण, रूबी जैसी डायनामिक प्रोग्रामिंग भाषाएं इंटरप्रिटेशन और JIT कंपाइलेशन के लिए विशेष रूप से उपयुक्त हैं।
GCC जैसा एक ऑप्टिमाइज़िंग कंपाइलर निर्देशों को अधिक कुशलता से अनुकूलित कर सकता है — रजिस्टर-ओरिएंटेड आर्किटेक्चर को अपनाने का एक महत्वपूर्ण लाभ। कंपाइलर्स रजिस्टर-आधारित आर्किटेक्चर के साथ इंटरमीडिएट रिप्रेजेंटेशन पर काम करते हैं।
एक बार जब आपके निर्देश कंपाइलेशन के दौरान इंटरमीडिएट रिप्रेजेंटेशन तक पहुंच जाते हैं, तो GCC आपके निर्देशों के CPU निष्पादन को गति देने के लिए अतिरिक्त पास करता है।
रूबी के लिए JIT कंपाइलर: YJIT, MJIT, और TenderJIT
अब आइए रूबी के लिए उपलब्ध विभिन्न JIT कंपाइलर्स — YJIT, MJIT, और TenderJIT — और उन्हें कैसे सेट करें, का पता लगाएं।
रूबी के लिए MJIT (मेथड-बेस्ड जस्ट-इन-टाइम कंपाइलर)
व्लादिमीर मकारोव द्वारा MJIT लागू किया गया था, और यह C भाषा पर आधारित रूबी में कार्यान्वित पहला कंपाइलर मेथडोलॉजी था। यह रूबी 2.6 के साथ काम करता है, YARV निर्देशों का उपयोग करता है, और बाइनरी कोड में अक्सर उपयोग किए जाने वाले निर्देशों को कंपाइल करता है।
उन प्रोग्राम्स के लिए जो इनपुट/आउटपुट-बाउंड नहीं हैं, MJIT प्रदर्शन को बढ़ाता है।
YJIT प्रदर्शन के मामले में इस मूल C-आधारित कंपाइलर से बेहतर है। रूबी 3 का JIT अब तक का सबसे तेज़ JIT है जो MRI के पास है, जो MJIT के उत्कृष्ट कार्य द्वारा संभव हुआ।
MJIT का उपयोग कैसे करें
MJIT का उपयोग करने के लिए, आप रूबी 2.6 में --jit विकल्प के साथ JIT को सक्षम कर सकते हैं।
यदि आप इस भाग को छोड़ देते हैं, तो MJIT एक एरर दिखाएगा।
रूबी 2.6 में शामिल JIT-विशिष्ट सेटिंग्स का एक संग्रह हमें यह समझने में मदद करता है कि यह कैसे कार्य करता है। इन विकल्पों को देखने के लिए ruby --help चलाएं।
संक्षेप में, MJIT एक अलग थ्रेड में निष्पादित होता है और एसिंक्रोनस है। यह पहली पांच रन के बाद जस्ट-इन-टाइम कंपाइलेशन शुरू करेगा।
रूबी ऑन रेल्स के लिए YJIT
रूबी 3.1 के साथ जारी एक हालिया JIT कंपाइलर YJIT बहुत सुधार और बेहतर प्रदर्शन का वादा करता है। अभी भी Shopify द्वारा डिज़ाइन किया गया एक वर्क-इन-प्रोग्रेस प्रोजेक्ट जिसमें प्रयोगात्मक परिणाम हैं, इसका उपयोग सावधानी से किया जाना चाहिए, विशेष रूप से बड़े एप्लिकेशन पर।
इस बात को ध्यान में रखते हुए, YJIT रूबी ऑन रेल्स एप्लिकेशन के प्रदर्शन को बढ़ाता है। अधिकांश वास्तविक-विश्व सॉफ्टवेयर YJIT बेसिक ब्लॉक वर्जनिंग JIT कंपाइलर द्वारा प्रदान किए गए तेज़ वार्म-अप और प्रदर्शन सुधारों से लाभान्वित होता है।
YJIT प्रोजेक्ट के हिस्से के रूप में एक JIT कंपाइलर धीरे-धीरे CRuby में बनाया जाएगा, अंततः अधिकांश कोड निष्पादन के लिए इंटरप्रेटर को प्रतिस्थापित करेगा।
आधिकारिक बेंचमार्क — 'YJIT: Building a New JIT Compiler for CRuby' देखें — दिखाते हैं कि YJIT ने डिफ़ॉल्ट CRuby इंटरप्रेटर पर प्रदर्शन में सुधार किया:
- railsbench पर 20%
- लिक्विड टेम्पलेट रेंडरिंग पर 39%
- activerecord पर 37%
हालांकि:
railsbench में केवल लगभग 79% निर्देश YJIT द्वारा निष्पादित किए जाते हैं, और बाकी डिफ़ॉल्ट इंटरप्रेटर में चलते हैं।
स्रोत: YJIT: Building a New JIT Compiler for CRuby
इसका मतलब है कि YJIT के वर्तमान परिणामों को बेहतर बनाने के लिए अभी भी बहुत कुछ किया जाना बाकी है।
फिर भी, YJIT हर बेंचमार्क पर कम से कम इंटरप्रेटर जितना अच्छा प्रदर्शन करता है, यहां तक कि सबसे कठिन लोगों पर भी, और प्रत्येक बेंचमार्क के केवल एक पुनरावृत्ति के बाद निकट-चरम प्रदर्शन तक पहुंचता है।
YJIT का उपयोग कैसे करें
नोट: YJIT वर्तमान में macOS और Linux पर x86-64 प्लेटफॉर्म तक सीमित है। इसके अलावा, जैसा कि उल्लेख किया गया है, YJIT की सिफारिश बड़े एप्लिकेशन के लिए नहीं की जाती है (अभी तक)।
YJIT डिफ़ॉल्ट रूप से अक्षम है। यदि आप इसे सक्षम करना चाहते हैं, तो पहले --yjit कमांड-लाइन विकल्प निर्दिष्ट करें।
आपको जांचना होगा कि यह इंस्टॉल है, इसलिए ruby --enable-yjit -v चलाएं। यदि warning: unknown argument for --enable: yjit'` दिखाई देता है, तो आपको इसे इंस्टॉल करना होगा।
फिर irb खोलें और RUBY_YJIT_ENABLE=1 सेट करें। आप बाहर निकल सकते हैं और अब, आप YJIT का उपयोग करने के लिए तैयार हैं। कमांड ruby --enable-yjit -v को ruby 3.1.0p0 (2021-12-25 revision fb4df44d16) [arm64-darwin21] जैसा कुछ वापस करना चाहिए।
TenderJIT
YJIT पर काफी हद तक आधारित डिज़ाइन के साथ, TenderJIT रूबी के लिए एक प्रयोगात्मक JIT कंपाइलर है। TenderJIT के बारे में अलग बात यह है कि यह शुद्ध रूबी में लिखा गया है।
यह एक डेमो प्रोजेक्ट है और इसका लक्ष्य इसे एक जेम के रूप में शिप करना है। इस बीच, आप इसके साथ प्रयोग कर सकते हैं, लेकिन ध्यान रखें कि यह अभी भी प्रगति पर है। TenderJIT के लिए रूबी 3.0.2 या बाद का संस्करण आवश्यक है।
TenderJIT का उपयोग कैसे करें
TenderJIT वर्तमान में स्वचालित रूप से मेथड कंपाइलेशन नहीं करता है। एक मेथड को कंपाइल करने के लिए, आपको मैन्युअली TenderJIT को कॉन्फ़िगर करना होगा।
रिपॉजिटरी को क्लोन करें और निम्नलिखित कमांड चलाएं:
आपको इसे अपने कोड पर मैन्युअली सेट करना होगा:
टारगेट मेथड में प्रत्येक YARV निर्देश को TenderJIT द्वारा पढ़ा जाता है, जो फिर इसे मशीन कोड में बदल देता है।
TenderJIT के साथ अधिक उदाहरणों के लिए, इन वीडियो में से एक देखें: A JIT compiler for Ruby with Aaron Patterson and Hacking on TenderJIT!
समापन
इस पोस्ट में, हमने रूबी के लिए तीन JIT कंपाइलर्स — MJIT, YJIT, और TenderJIT — और उन्हें कैसे सेट करें, पर एक त्वरित नज़र डाली। प्रत्येक विकल्प प्रयोगात्मक है और अपनी सीमाओं के साथ आता है।
हालांकि, YJIT फिलहाल सबसे परिपक्व है, और इसमें बढ़ने और स्केल करने की सबसे बड़ी क्षमता है। यह अन्य रूबी JITs पर बेहतर प्रदर्शन दर्शाता है, रूबी 3.1.0 के साथ विकसित किया गया था, और तेजी से CRuby का एक महत्वपूर्ण हिस्सा बन रहा है।
यदि आप रूबी के लिए अपना खुद का कंपाइलर बनाना चाहते हैं तो इस पोस्ट को देखें।
हैप्पी कोडिंग!
P.S. यदि आप रूबी मैजिक पोस्ट को प्रेस से बाहर आते ही पढ़ना चाहते हैं, तो हमारे रूबी मैजिक न्यूज़लेटर की सदस्यता लें और कभी भी एक भी पोस्ट मिस न करें!

रेनाटा मार्केस
हमारी अतिथि लेखक रेनाटा एक सॉफ्टवेयर इंजीनियर और कंप्यूटर वैज्ञानिक हैं जो रूबी और जावास्क्रिप्ट पर केंद्रित हैं। वे ओपन सोर्स प्रोजेक्ट्स में योगदान देकर डेवलपर समुदाय की मदद करना पसंद करती हैं। अपने खाली समय में, उन्हें फिल्में और टीवी शो देखना और चर्चा करना, किताबें पढ़ना, संगीत सुनना, फोटोग्राफी, और वीडियो बनाना पसंद है।
रेनाटा मार्केस के सभी लेख