आपके प्रश्न का उत्तर देने के लिए सबसे अच्छी पुस्तक शायद होगी: कूपर और टॉरकोन, "इंजीनियरिंग एक कंपाइलर," 2003. यदि आपके पास एक विश्वविद्यालय पुस्तकालय तक पहुंच है, तो आपको एक प्रति उधार लेने में सक्षम होना चाहिए।
Llvm या gcc जैसे प्रोडक्शन कंपाइलर में डिज़ाइनर नीचे सभी एल्गोरिदम को रखने का हर संभव प्रयास करते हैं जहाँ इनपुट का आकार होता है। "अनुकूलन" के कुछ विश्लेषणों के लिए इसका मतलब यह है कि आपको वास्तव में इष्टतम कोड का निर्माण करने के बजाय उत्तराधिकार का उपयोग करने की आवश्यकता है।O(n2)n
लेक्सर एक परिमित अवस्था वाली मशीन है, इसलिए इनपुट के आकार में (वर्णों में) है और टोकन की एक धारा का निर्माण करती है जो पार्सर को पास की जाती है।O(n)O(n)
कई भाषाओं के लिए कई कंपाइलरों के लिए पार्सर LALR (1) है और इस प्रकार इनपुट टोकन की संख्या में समय में टोकन स्ट्रीम को संसाधित करता है । पार्सिंग के दौरान आपको आमतौर पर एक प्रतीक तालिका का ट्रैक रखना पड़ता है, लेकिन, कई भाषाओं के लिए, जिसे हैश टेबल ("शब्दकोशों") के ढेर के साथ संभाला जा सकता है। प्रत्येक शब्दकोश का उपयोग , लेकिन आपको कभी-कभी एक प्रतीक को देखने के लिए स्टैक पर चलना पड़ सकता है। ढेर की गहराई जहां scopes की घोंसले की गहराई है। (इसलिए सी जैसी भाषाओं में, आपके अंदर घुंघराले ब्रेसिज़ की कितनी परतें हैं।)O(n)O(1)O(s)s
तब तोता का पेड़ आम तौर पर एक नियंत्रण प्रवाह ग्राफ में "चपटा" होता है। नियंत्रण प्रवाह ग्राफ के नोड्स 3-पता निर्देश (RISC असेंबली भाषा के समान) हो सकते हैं, और नियंत्रण प्रवाह ग्राफ़ का आकार आमतौर पर पार्स ट्री के आकार में रैखिक होगा।
फिर अतिरेक उन्मूलन चरणों की एक श्रृंखला आम तौर पर लागू की जाती है (सामान्य सबप्रेसेशन उन्मूलन, लूप इनवेरिएंट कोड मोशन, निरंतर प्रसार, ...)। (इसे अक्सर "अनुकूलन" कहा जाता है, हालांकि परिणाम के बारे में शायद ही कुछ इष्टतम है, वास्तविक लक्ष्य कोड में सुधार करना है जितना संभव समय और अंतरिक्ष बाधाओं को हमने संकलक पर रखा है।) प्रत्येक अतिरेक उन्मूलन कदम। आमतौर पर नियंत्रण प्रवाह ग्राफ के बारे में कुछ तथ्यों के प्रमाण की आवश्यकता होती है। ये सबूत आमतौर पर डेटा प्रवाह विश्लेषण का उपयोग करके किए जाते हैं । अधिकांश डेटा-फ्लो विश्लेषणों को डिज़ाइन किया गया है ताकि वे में प्रवाह ग्राफ में परिवर्तित हो जाएँ जहाँ (मोटे तौर पर बोल रहा हो) लूप नेस्टिंग डेप्थ है और फ्लो ग्राफ़ के ऊपर से गुजरने में समय लगता हैO(d)dO(n)जहां 3-पता निर्देशों की संख्या है।n
अधिक परिष्कृत अनुकूलन के लिए आप अधिक परिष्कृत विश्लेषण करना चाह सकते हैं। इस बिंदु पर आप ट्रेडऑफ़ में दौड़ना शुरू करते हैं। आप अपने विश्लेषण एल्गोरिदम को से बहुत कम लेना चाहते हैंO(n2)पूरे कार्यक्रम के प्रवाह ग्राफ के आकार में समय, लेकिन इसका मतलब है कि आपको बिना जानकारी के (और प्रोग्राम में सुधार के लिए) बदलाव करने की आवश्यकता है जो साबित करने के लिए महंगा हो सकता है। इसका एक उत्कृष्ट उदाहरण उर्फ विश्लेषण है, जहां कुछ जोड़ी स्मृति के लिए लिखता है आप यह साबित करना चाहेंगे कि दो लिखता कभी भी एक ही स्मृति स्थान को लक्षित नहीं कर सकता है। (आप यह देखने के लिए एक अन्य विश्लेषण कर सकते हैं कि क्या आप एक निर्देश को दूसरे से ऊपर ले जा सकते हैं।) लेकिन उपनामों के बारे में सटीक जानकारी प्राप्त करने के लिए आपको कार्यक्रम के माध्यम से हर संभव नियंत्रण पथ का विश्लेषण करने की आवश्यकता हो सकती है, जो शाखाओं की संख्या में घातांक है। कार्यक्रम में (और इस प्रकार नियंत्रण प्रवाह ग्राफ में नोड्स की संख्या में घातांक है।)
इसके बाद आप रजिस्टर आवंटन में शामिल होंगे। रजिस्टर आबंटन को ग्राफ-रंग की समस्या के रूप में चित्रित किया जा सकता है , और न्यूनतम रंग के साथ एक ग्राफ को रंगना एनपी-हार्ड के रूप में जाना जाता है। इसलिए अधिकांश कंपाइलर उचित समय सीमा के भीतर यथासंभव सर्वोत्तम संभव रजिस्टर स्पिल्स को कम करने के लक्ष्य के साथ रजिस्टर स्पिलिंग के साथ संयुक्त लालची अनुमान के कुछ प्रकार का उपयोग करते हैं।
अंत में आप कोड जनरेशन में आते हैं। कोड पीढ़ी को आमतौर पर एक समय में एक अधिकतम बुनियादी ब्लॉक किया जाता है जहां एक बुनियादी ब्लॉक एक प्रविष्टि और एकल निकास के साथ रैखिक रूप से जुड़े नियंत्रण प्रवाह ग्राफ नोड्स का एक सेट होता है। यह एक ग्राफ कवरिंग समस्या के रूप में सुधार किया जा सकता है जहां आप जिस ग्राफ को कवर करने की कोशिश कर रहे हैं वह बुनियादी ब्लॉक में 3-पता निर्देशों के सेट की निर्भरता ग्राफ है, और आप उन ग्राफों के सेट के साथ कवर करने की कोशिश कर रहे हैं जो उपलब्ध मशीन का प्रतिनिधित्व करते हैं निर्देश। यह समस्या सबसे बड़े बुनियादी ब्लॉक के आकार में घातीय है (जो सिद्धांत रूप में, पूरे कार्यक्रम के आकार के समान आदेश हो सकता है), इसलिए यह फिर से आमतौर पर उन आंकड़ों के साथ किया जाता है जहां संभव कवरिंग का केवल एक छोटा सा उपसमूह होता है जांच की।