समय से पहले संकलन

कंप्यूटर विज्ञान में, समय से पहले संकलन (एओटी संकलन) एक कार्यक्रम के निष्पादन से पहले एक (अक्सर) उच्च-स्तरीय प्रोग्रामिंग भाषा में (अक्सर) निम्न-स्तरीय भाषा में संकलक का कार्य है, आमतौर पर बिल्ड-टाइम पर, रन टाइम (कार्यक्रम जीवनचक्र चरण) पर किए जाने वाले आवश्यक कार्य की मात्रा को कम करें।

बहुधा, यह एक उच्च-स्तरीय प्रोग्रामिंग भाषा जैसे C (प्रोग्रामिंग भाषा) या C++, या एक मध्यवर्ती प्रतिनिधित्व जैसे जावा बाइटकोड या .NET फ्रेमवर्क सामान्य मध्यवर्ती भाषा (CIL) कोड को एक देशी में संकलक के कार्य से जुड़ा होता है। (सिस्टम-निर्भर) मशीन कोड ताकि परिणामी बाइनरी फ़ाइल 'मानक' देशी कंपाइलर की तरह मूल रूप से निष्पादित हो सके। इस विशिष्ट संदर्भ में उपयोग किए जाने पर, इसे अक्सर समय-समय पर संकलन|जस्ट-इन-टाइम (JIT) संकलन के विपरीत के रूप में देखा जाता है।

अधिक आम तौर पर बोलते हुए, एओटी संकलन की लक्ष्य भाषा मूल मशीन कोड के लिए जरूरी नहीं है बल्कि मनमाने ढंग से परिभाषित की जाती है। कुछ अकादमिक कागजात इस शब्द का उपयोग जावा बाइटकोड को सी में संकलित करने के कार्य के अर्थ के लिए करते हैं या वह समय जब अनुकूलन पाइपलाइन निष्पादित की जाती है। एक अकादमिक परियोजना इस शब्द का उपयोग V8 (जावास्क्रिप्ट इंजन) के लिए मशीन-निर्भर अनुकूलित इंटरमीडिएट प्रतिनिधित्व के लिए पूर्व-संकलित जावास्क्रिप्ट के कार्य के अर्थ के लिए करता है। और WebKit#JavaScriptCore के लिए एक मशीन से स्वतंत्र बायटेकोड। कुछ औद्योगिक भाषा कार्यान्वयन (जैसे क्लोजर और हेमीज़ जावास्क्रिप्ट इंजन ) इस शब्द का उपयोग स्रोत भाषा को वीएम विशिष्ट बायटेकोड में पूर्व-संकलित करने के कार्य के अर्थ में करें। कोणीय (वेब ​​फ्रेमवर्क) इस शब्द का उपयोग अपने HTML टेम्पलेट और टाइपप्रति को जावास्क्रिप्ट में परिवर्तित करने के लिए करता है। वास्तव में, चूंकि सभी स्थैतिक संकलन तकनीकी रूप से समय से पहले किए जाते हैं, इसलिए इस विशेष शब्द का प्रयोग अक्सर ऐसे पूर्व-संकलन के कार्य से कुछ प्रकार के प्रदर्शन लाभों पर जोर देने के लिए किया जाता है। जावा बाइटकोड में जावा (प्रोग्रामिंग भाषा) को संकलित करने का कार्य इसलिए शायद ही कभी एओटी के रूप में जाना जाता है क्योंकि यह आमतौर पर एक आवश्यकता है, अनुकूलन नहीं।

कम रनटाइम ओवरहेड
एक प्रबंधित कोड रनटाइम वाली कुछ प्रोग्रामिंग भाषाएं जिन्हें एक मध्यवर्ती प्रतिनिधित्व के लिए संकलित किया जा सकता है, जस्ट-इन-टाइम संकलन | जस्ट-इन-टाइम (JIT) संकलन का उपयोग करें। यह, संक्षेप में, इंटरमीडिएट कोड को मशीन कोड में देशी रन के लिए संकलित करता है, जबकि इंटरमीडिएट कोड निष्पादित हो रहा है, जो किसी एप्लिकेशन के प्रदर्शन को धीमा कर सकता है। अहेड-ऑफ़-टाइम संकलन निष्पादन के दौरान निष्पादन के बजाय निष्पादन से पहले होने से इस चरण की आवश्यकता को समाप्त करता है।

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

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

प्रदर्शन व्यापार-नापसंद
AOT कंपाइलर जटिल और उन्नत कोड अनुकूलन संकलक का प्रदर्शन कर सकते हैं, जो कि JITing के अधिकांश मामलों में बहुत अधिक महंगा माना जाएगा। इसके विपरीत, AOT आमतौर पर JIT में संभव कुछ अनुकूलन नहीं कर सकता है, जैसे रनटाइम प्रोफ़ाइल-निर्देशित अनुकूलन (PGO), छद्म-निरंतर प्रसार, या अप्रत्यक्ष-वर्चुअल फ़ंक्शन इनलाइनिंग। AOT को एक लक्षित आर्किटेक्चर के लिए संकलित करना चाहिए, जबकि एक JIT सॉफ्टवेयर जारी होने के वर्षों बाद भी चल रहे वास्तविक CPU का सर्वोत्तम उपयोग करने के लिए कोड को संकलित कर सकता है।

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

यह भी देखें

 * asm.js संकलक (जावास्क्रिप्ट)
 * बार्टोक (संकलक) (सामान्य मध्यवर्ती भाषा)
 * एक्सेलसियर जेट (जावा (प्रोग्रामिंग भाषा))
 * जावा के लिए जीएनयू कंपाइलर
 * IL2CPU (CIL)
 * देशी छवि जनरेटर (CIL)
 * रूबीमोशन (रूबी (प्रोग्रामिंग भाषा))

बाहरी संबंध

 * Speed: NGen Revs Up Your Performance with Powerful New Features – MSDN Magazine, April 2005
 * Mono AOT
 * Excelsior JET – Certified Java SE Implementation with AOT compiler
 * GNU Compiler for Java
 * AOT compilation of asm.js
 * Real-time Java, Part 2: Comparing compilation techniques – IBM developerWorks, April 2007
 * Improving Swing Performance: JIT vs AOT Compilation – LinuxWorld Magazine, November 2004
 * Manta