Tracing just-in-time compilation
जस्ट-इन-टाइम संकलन का पता लगाना एक तकनीक है जिसका उपयोग आभासी मशीनों द्वारा रनटाइम पर एक प्रोग्राम के निष्पादन को अनुकूलित करने के लिए किया जाता है। यह अक्सर निष्पादित संचालन के एक रैखिक अनुक्रम को रिकॉर्ड करके, उन्हें मूल मशीन कोड में संकलित करके और उन्हें निष्पादित करके किया जाता है। यह पारंपरिक जस्ट-इन-टाइम (जे. आई. टी.) संकलकों के विपरीत है जो प्रति-विधि आधार पर काम करते हैं। जस्ट-इन-टाइम संकलन रनटाइम में मशीन कोड के लिए एक कार्यक्रम के हिस्सों को संकलित करके कार्यक्रमों की निष्पादन गति को बढ़ाने की एक तकनीक है। विभिन्न जे. आई. टी. संकलकों को वर्गीकृत करने का एक तरीका उनके संकलन दायरे द्वारा है। जबकि विधि-आधारित जे. आई. टी. संकलक एक समय में एक विधि को मशीन कोड में अनुवादित करते हैं, जे. आई. टी. का पता लगाने के लिए संकलन की अपनी इकाई के रूप में अक्सर निष्पादित लूप का उपयोग किया जाता है। जेआईटी का पता लगाना इस धारणा पर आधारित है कि प्रोग्राम अपना अधिकांश समय प्रोग्राम के कुछ लूपों ("हॉट लूप") में बिताते हैं और बाद के लूप पुनरावृत्तियाँ अक्सर समान रास्ते लेती हैं। वर्चुअल मशीन जिनमें ट्रेसिंग जेआईटी होता है, वे अक्सर मिश्रित-मोड निष्पादन वातावरण होते हैं, जिसका अर्थ है कि उनके पास ट्रेसिंग जेआईटी के अलावा या तो एक दुभाषिया या एक विधि संकलक होता है। तकनीकी विवरण एक अनुरेखण जे. आई. टी. संकलक रनटाइम पर विभिन्न चरणों से गुजरता है। सबसे पहले, लूप के लिए प्रोफाइलिंग जानकारी एकत्र की जाती है। एक हॉट लूप की पहचान के बाद, एक विशेष अनुरेखण चरण दर्ज किया जाता है, जो उस लूप के सभी निष्पादित कार्यों को रिकॉर्ड करता है। संचालन के इस अनुक्रम को ट्रेस कहा जाता है। ट्रेस को तब अनुकूलित किया जाता है और मशीन कोड (ट्रेस) में संकलित किया जाता है। जब इस लूप को फिर से निष्पादित किया जाता है, तो संकलित ट्रेस को प्रोग्राम समकक्ष के बजाय बुलाया जाता है। इन चरणों को निम्नलिखित में विस्तार से समझाया गया हैः प्रोफाइलिंग चरण प्रोफाइलिंग का लक्ष्य गर्म लूप की पहचान करना है। यह अक्सर प्रत्येक लूप के लिए पुनरावृत्तियों की संख्या की गिनती करके किया जाता है। लूप की गिनती एक निश्चित सीमा को पार करने के बाद, लूप को गर्म माना जाता है, और अनुरेखण चरण में प्रवेश किया जाता है। अनुरेखण चरण अनुरेखण चरण में लूप का निष्पादन सामान्य रूप से आगे बढ़ता है, लेकिन इसके अलावा प्रत्येक निष्पादित ऑपरेशन को एक निशान में दर्ज किया जाता है। अभिलिखित क्रियाओं को आम तौर पर ट्रेस ट्री में संग्रहीत किया जाता है, अक्सर एक मध्यवर्ती प्रतिनिधित्व (आई. आर.) में। अनुरेखण कार्य कॉल का अनुसरण करता है, जिससे उन्हें अनुरेखण में शामिल किया जाता है। अनुरेखण तब तक जारी रहता है जब तक कि लूप अपने अंत तक नहीं पहुंच जाता है और शुरुआत में वापस कूद जाता है। चूँकि निशान को लूप के एक ठोस निष्पादन पथ का पालन करके दर्ज किया जाता है, उस निशान के बाद के निष्पादन उस मार्ग से अलग हो सकते हैं। उन स्थानों की पहचान करने के लिए जहां ऐसा हो सकता है, विशेष सुरक्षा निर्देश निशान में डाले जाते हैं। इस तरह के स्थान के लिए एक उदाहरण है यदि कथन। गार्ड यह निर्धारित करने के लिए एक त्वरित जाँच है कि क्या मूल स्थिति अभी भी सही है। यदि कोई गार्ड विफल हो जाता है, तो निशान का निष्पादन निरस्त कर दिया जाता है। चूँकि अनुरेखण निष्पादन के दौरान किया जाता है, इसलिए अनुरेखण को रनटाइम जानकारी रखने के लिए बनाया जा सकता है (जैसे। जानकारी टाइप करें)। इस जानकारी का उपयोग बाद में अनुकूलन चरण में कोड दक्षता बढ़ाने के लिए किया जा सकता है। अनुकूलन और कोड-पीढ़ी चरण निशान को अनुकूलित करना आसान है, क्योंकि वे केवल एक निष्पादन पथ का प्रतिनिधित्व करते हैं, जिसका अर्थ है कि कोई नियंत्रण प्रवाह मौजूद नहीं है और उन्हें संभालने की आवश्यकता नहीं है। विशिष्ट अनुकूलन में निरंतर-उप-अभिव्यक्ति उन्मूलन, मृत कोड उन्मूलन, रजिस्टर आवंटन, अपरिवर्तनीय-कोड गति, निरंतर तह और पलायन विश्लेषण शामिल हैं। अनुकूलन के बाद, निशान को मशीन कोड में बदल दिया जाता है। इसी तरह अनुकूलन के लिए, निशान की रैखिक प्रकृति के कारण यह आसान है। निष्पादन ट्रेस को मशीन कोड में संकलित करने के बाद, इसे लूप के बाद के पुनरावृत्तियों में निष्पादित किया जा सकता है। ट्रेस निष्पादन तब तक जारी रहता है जब तक कि एक गार्ड विफल नहीं हो जाता। जहां जे. आई. टी. का विचार 1960 के दशक तक वापस पहुँचता है, वहीं जे. आई. टी. का पता लगाने का उपयोग हाल ही में अधिक बार किया गया है। जेआईटी का पता लगाने के आज के विचार के समान एक विचार का पहला उल्लेख 1970 में हुआ था। यह देखा गया कि संकलित कोड को केवल व्याख्या के दौरान किए गए कार्यों को संग्रहीत करके रन-टाइम पर एक दुभाषिया से प्राप्त किया जा सकता है। अनुरेखण का पहला कार्यान्वयन डायनेमो है, "एक सॉफ्टवेयर गतिशील अनुकूलन प्रणाली जो प्रोसेसर पर निष्पादित होने पर एक देशी निर्देश धारा के प्रदर्शन में पारदर्शी रूप से सुधार करने में सक्षम है।" ऐसा करने के लिए, देशी निर्देश धारा की व्याख्या तब तक की जाती है जब तक कि एक "गर्म" निर्देश अनुक्रम नहीं मिल जाता। इस अनुक्रम के लिए एक अनुकूलित संस्करण उत्पन्न किया जाता है, कैश किया जाता है और निष्पादित किया जाता है। डायनेमो को बाद में डायनेमोरियो तक बढ़ा दिया गया। एक डायनामोरियो-आधारित परियोजना दुभाषिया निर्माण के लिए एक रूपरेखा थी जो अनुरेखण और आंशिक मूल्यांकन को जोड़ती है। इसका उपयोग "भाषा कार्यान्वयन से इंटरप्रेटर ओवरहेड को गतिशील रूप से हटाने" के लिए किया जाता था। 2006 में, हॉटपाथ वी. एम., एक उच्च-स्तरीय भाषा के लिए पहला अनुरेखण जे. आई. टी. संकलक विकसित किया गया था। यह वी. एम. गतिशील रूप से अक्सर निष्पादित किए जाने वाले बाइटकोड निर्देशों की पहचान करने में सक्षम था, जिनका पता लगाया जाता है और फिर स्टैटिक सिंगल असाइनमेंट (एस. एस. ए.) निर्माण का उपयोग करके मशीन कोड में संकलित किया जाता है। हॉटपाथ वी. एम. के लिए प्रेरणा संसाधन बाधित मोबाइल उपकरणों के लिए एक कुशल जे. वी. एम. होना था। ट्रेसिंग जे. आई. टी. का एक और उदाहरण ट्रेसमंकी है, जो फ़ायरफ़ॉक्स (2009) के लिए मोज़िला के जावास्क्रिप्ट कार्यान्वयनों में से एक है। ट्रेसमंकी रन-टाइम पर गतिशील भाषा जावास्क्रिप्ट में अक्सर निष्पादित लूप निशान संकलित करता है और प्रत्येक पथ पर होने वाले वास्तविक गतिशील प्रकारों के लिए उत्पन्न कोड में विशेषज्ञता रखता है। एक अन्य परियोजना जो जे. आई. टी. का पता लगाने का उपयोग करती है, वह है पी. आई. पी.। यह भाषा कार्यान्वयन के लिए जे. आई. टी. का पता लगाने के उपयोग को सक्षम बनाता है जो पी. आई. पी. के अनुवाद उपकरण श्रृंखला के साथ लिखे गए थे, इस प्रकार उस दुभाषिया का उपयोग करके निष्पादित किए गए किसी भी कार्यक्रम के प्रदर्शन में सुधार होता है। यह दुभाषिया द्वारा निष्पादित कार्यक्रम के बजाय दुभाषिया का स्वयं पता लगाने से संभव है। माइक्रोसॉफ्ट द्वारा अपनी कॉमन इंटरमीडिएट लैंग्वेज (सी. आई. एल.) के लिए एस. पी. यू. आर. परियोजना में ट्रेसिंग जे. आई. टी. का भी पता लगाया गया है। एस. पी. यू. आर. सी. आई. एल. के लिए एक सामान्य अनुरेखक है, जिसका उपयोग जावास्क्रिप्ट कार्यान्वयन के माध्यम से भी किया जा सकता है। एक ट्रेस का उदाहरण निम्नलिखित पायथन प्रोग्राम पर विचार करें जो क्रमिक पूर्ण संख्याओं के वर्गों के योग की गणना करता है जब तक कि वह योग 100000 से अधिक न हो जाएः डेफ वर्ग (x): रिटर्न x * x i = 0 y = 0 जबकि सहीः y + = वर्ग (i) यदि y> 100000: ब्रेक i = i + 1 इस प्रोग्राम के लिए एक ट्रेस कुछ इस तरह दिख सकता हैः लूपस्टार्ट (i1, y1) i2 = int _ mul (i1, i1) #x * x y2 = int _ add (y1, i2) #y + = i * i b1 = int _ gt (y2,100000) गार्ड _ फाल्स (b1) i3 = int _ add (i1 कोड पीढ़ी डाल्विक हॉटस्पॉट इंटरप्रेटर प्रोफ़ाइल-निर्देशित अनुकूलन आरपीयथन शब्दार्थ शब्दकोश एन्कोडिंग संदर्भ बाहरी लिंक लुएजेआईटी की आधिकारिक वेबसाइट संकलक निर्माण सॉफ्टवेयर अनुकूलन लेख उदाहरण के लिए पायथन (प्रोग्रामिंग भाषा) कोड के साथ देखें।