उदाहरण के साथ कंपाइलर के चरण: संकलन प्रक्रिया और चरण
कंपाइलर डिजाइन के चरण क्या हैं?
संकलक विभिन्न चरणों में संचालित होता है प्रत्येक चरण स्रोत प्रोग्राम को एक प्रस्तुति से दूसरे में परिवर्तित करता है। प्रत्येक चरण अपने पिछले चरण से इनपुट लेता है और अपने आउटपुट को कंपाइलर के अगले चरण में फीड करता है।
एक कंपाइलर में 6 चरण होते हैं। इनमें से प्रत्येक चरण उच्च-स्तरीय भाषा को मशीन कोड में बदलने में मदद करता है। एक कंपाइलर के चरण इस प्रकार हैं:
- शाब्दिक विश्लेषण
- सिंटेक्स विश्लेषण
- शब्दार्थ विश्लेषण
- मध्यवर्ती कोड जनरेटर
- कोड अनुकूलक
- कोड जनरेटर
ये सभी चरण स्रोत कोड को टोकनों में विभाजित करके, पार्स वृक्ष बनाकर, तथा विभिन्न चरणों द्वारा स्रोत कोड को अनुकूलित करके परिवर्तित करते हैं।
चरण 1: शाब्दिक विश्लेषण
लेक्सिकल एनालिसिस पहला चरण है जब कंपाइलर सोर्स कोड को स्कैन करता है। यह प्रक्रिया बाएं से दाएं, अक्षर दर अक्षर हो सकती है, और इन अक्षरों को टोकन में समूहित किया जा सकता है।
यहाँ, स्रोत प्रोग्राम से वर्ण स्ट्रीम को टोकन की पहचान करके सार्थक अनुक्रमों में समूहीकृत किया जाता है। यह संबंधित टिकटों की प्रविष्टि सिंबल टेबल में करता है और उस टोकन को अगले चरण में भेजता है।
इस चरण के प्राथमिक कार्य हैं:
- स्रोत कोड में शाब्दिक इकाइयों की पहचान करें
- शाब्दिक इकाइयों को स्थिरांक, आरक्षित शब्दों जैसे वर्गों में वर्गीकृत करें, और उन्हें विभिन्न तालिकाओं में दर्ज करें। यह स्रोत प्रोग्राम में टिप्पणियों को अनदेखा कर देगा
- उस टोकन की पहचान करें जो भाषा का हिस्सा नहीं है
उदाहरण:
एक्स = वाई + 10
टोकन
X | पहचानकर्ता |
= | असाइनमेंट ऑपरेटर |
Y | पहचानकर्ता |
+ | अतिरिक्त ऑपरेटर |
10 | नंबर |
चरण 2: वाक्यविन्यास विश्लेषण
वाक्यविन्यास विश्लेषण कोड में संरचना की खोज के बारे में है। यह निर्धारित करता है कि कोई पाठ अपेक्षित प्रारूप का पालन करता है या नहीं। इस चरण का मुख्य उद्देश्य यह सुनिश्चित करना है कि प्रोग्रामर द्वारा लिखा गया स्रोत कोड सही है या नहीं।
वाक्यविन्यास विश्लेषण टोकन की सहायता से पार्स ट्री का निर्माण करके विशिष्ट प्रोग्रामिंग भाषा पर आधारित नियमों पर आधारित होता है। यह स्रोत भाषा की संरचना और भाषा के व्याकरण या वाक्यविन्यास को भी निर्धारित करता है।
इस चरण में किये जाने वाले कार्यों की सूची इस प्रकार है:
- लेक्सिकल विश्लेषक से टोकन प्राप्त करें
- जाँचता है कि अभिव्यक्ति वाक्यविन्यास की दृष्टि से सही है या नहीं
- सभी वाक्यविन्यास त्रुटियों की रिपोर्ट करें
- एक पदानुक्रमित संरचना का निर्माण करें जिसे पार्स ट्री के रूप में जाना जाता है
उदाहरण
कोई भी पहचानकर्ता/संख्या एक अभिव्यक्ति है
यदि x एक पहचानकर्ता है और y+10 एक व्यंजक है, तो x= y+10 एक कथन है।
निम्नलिखित उदाहरण के लिए पार्स ट्री पर विचार करें
(a+b)*c
पार्स ट्री में
- आंतरिक नोड: एक ऑपरेटर फ़ाइल और बच्चों के लिए दो फ़ाइलों के साथ रिकॉर्ड करें
- लीफ: 2/अधिक फ़ील्ड वाले रिकॉर्ड; एक टोकन और टोकन के बारे में अन्य जानकारी के लिए
- सुनिश्चित करें कि कार्यक्रम के घटक सार्थक रूप से एक साथ फिट हों
- प्रकार की जानकारी एकत्रित करता है और प्रकार की अनुकूलता की जांच करता है
- स्रोत भाषा द्वारा ऑपरेंड की अनुमति की जाँच करता है
चरण 3: अर्थ विश्लेषण
अर्थगत विश्लेषण कोड की अर्थगत संगति की जाँच करता है। यह पिछले चरण के सिंबल टेबल के साथ-साथ सिंबल टेबल का उपयोग करके यह सत्यापित करता है कि दिया गया स्रोत कोड अर्थगत रूप से संगत है। यह यह भी जाँचता है कि कोड उचित अर्थ व्यक्त कर रहा है या नहीं।
सिमेंटिक एनालाइज़र प्रकार बेमेल, असंगत ऑपरेंड, अनुचित तर्कों के साथ बुलाए गए फ़ंक्शन, अघोषित चर आदि की जांच करेगा।
सिमेंटिक विश्लेषण चरण के कार्य हैं:
- एकत्रित प्रकार की जानकारी को संग्रहीत करने और उसे प्रतीक तालिका या वाक्यविन्यास वृक्ष में सहेजने में आपकी सहायता करता है
- आपको प्रकार जाँच करने की अनुमति देता है
- प्रकार बेमेल के मामले में, जहां कोई सटीक प्रकार सुधार नियम नहीं हैं जो वांछित ऑपरेशन को संतुष्ट करते हैं, एक अर्थगत त्रुटि दिखाई जाती है
- प्रकार की जानकारी एकत्रित करता है और प्रकार की अनुकूलता की जांच करता है
- जाँचता है कि स्रोत भाषा ऑपरेंड की अनुमति देती है या नहीं
उदाहरण
float x = 20.2; float y = x*30;
उपरोक्त कोड में, सिमेंटिक विश्लेषक गुणन से पहले पूर्णांक 30 को फ्लोट 30.0 में टाइपकास्ट करेगा
चरण 4: मध्यवर्ती कोड जनरेशन
एक बार सिमेंटिक विश्लेषण चरण समाप्त हो जाने के बाद, कंपाइलर लक्ष्य मशीन के लिए मध्यवर्ती कोड उत्पन्न करता है। यह किसी अमूर्त मशीन के लिए एक प्रोग्राम का प्रतिनिधित्व करता है।
इंटरमीडिएट कोड उच्च स्तरीय और मशीन स्तरीय भाषा के बीच होता है। इस इंटरमीडिएट कोड को इस तरह से तैयार किया जाना चाहिए कि इसे लक्ष्य मशीन कोड में अनुवाद करना आसान हो।
मध्यवर्ती कोड निर्माण पर कार्य:
- इसे स्रोत प्रोग्राम के अर्थपूर्ण प्रतिनिधित्व से उत्पन्न किया जाना चाहिए
- अनुवाद की प्रक्रिया के दौरान गणना किए गए मानों को रखता है
- मध्यवर्ती कोड को लक्ष्य भाषा में अनुवाद करने में आपकी सहायता करता है
- आपको स्रोत भाषा की वरीयता क्रम को बनाए रखने की अनुमति देता है
- यह निर्देश के ऑपरेंड की सही संख्या रखता है
उदाहरण
उदाहरण के लिए,
total = count + rate * 5
पता कोड विधि की सहायता से मध्यवर्ती कोड है:
t1 := int_to_float(5) t2 := rate * t1 t3 := count + t2 total := t3
चरण 5: कोड अनुकूलन
अगला चरण कोड अनुकूलन या इंटरमीडिएट कोड है। यह चरण अनावश्यक कोड लाइन को हटाता है और संसाधनों को बर्बाद किए बिना प्रोग्राम के निष्पादन को गति देने के लिए कथनों के अनुक्रम को व्यवस्थित करता है। इस चरण का मुख्य लक्ष्य इंटरमीडिएट कोड में सुधार करना है ताकि ऐसा कोड तैयार किया जा सके जो तेजी से चले और कम जगह घेरे।
इस चरण के प्राथमिक कार्य हैं:
- यह आपको निष्पादन और संकलन गति के बीच संतुलन स्थापित करने में मदद करता है
- लक्ष्य कार्यक्रम के चलने के समय में सुधार करता है
- मध्यवर्ती प्रतिनिधित्व में अभी भी सुव्यवस्थित कोड उत्पन्न करता है
- अप्राप्य कोड को हटाना और अप्रयुक्त चरों से छुटकारा पाना
- लूप से उन कथनों को हटाना जिन्हें बदला नहीं गया है
उदाहरण:
निम्नलिखित कोड पर विचार करें
a = intofloat(10) b = c * a d = e + b f = d
बन सकता है
b =c * 10.0 f = e+b
चरण 6: कोड जनरेशन
कोड जनरेशन एक कंपाइलर का अंतिम और अंतिम चरण है। यह कोड ऑप्टिमाइज़ेशन चरणों से इनपुट प्राप्त करता है और परिणामस्वरूप पेज कोड या ऑब्जेक्ट कोड तैयार करता है। इस चरण का उद्देश्य स्टोरेज आवंटित करना और रिलोकेबल मशीन कोड तैयार करना है।
यह चर के लिए मेमोरी स्थान भी आवंटित करता है। मध्यवर्ती कोड में दिए गए निर्देशों को मशीन निर्देशों में परिवर्तित किया जाता है। यह चरण अनुकूलित या मध्यवर्ती कोड को लक्ष्य भाषा में परिवर्तित करता है।
लक्ष्य भाषा मशीन कोड है। इसलिए, इस चरण के दौरान सभी मेमोरी स्थानों और रजिस्टरों का भी चयन और आवंटन किया जाता है। इस चरण द्वारा उत्पन्न कोड को इनपुट लेने और अपेक्षित आउटपुट उत्पन्न करने के लिए निष्पादित किया जाता है।
उदाहरण
ए = बी + 60.0
संभवतः रजिस्टरों में अनुवाद किया जाएगा।
MOVF a, R1 MULF #60.0, R2 ADDF R1, R2
प्रतीक तालिका प्रबंधन
एक प्रतीक तालिका में प्रत्येक पहचानकर्ता के लिए एक रिकॉर्ड होता है जिसमें पहचानकर्ता की विशेषताओं के लिए फ़ील्ड होते हैं। यह घटक संकलक के लिए पहचानकर्ता रिकॉर्ड को खोजना और उसे जल्दी से प्राप्त करना आसान बनाता है। प्रतीक तालिका आपको स्कोप प्रबंधन के लिए भी मदद करती है। प्रतीक तालिका और त्रुटि हैंडलर सभी चरणों के साथ बातचीत करते हैं और प्रतीक तालिका तदनुसार अपडेट करते हैं।
त्रुटि प्रबंधन रूटीन
कंपाइलर डिज़ाइन प्रक्रिया में नीचे दिए गए सभी चरणों में त्रुटि हो सकती है:
- लेक्सिकल विश्लेषक: गलत वर्तनी वाले टोकन
- वाक्यविन्यास विश्लेषक: कोष्ठक गायब है
- मध्यवर्ती कोड जनरेटर: ऑपरेटर के लिए बेमेल ऑपरेंड
- कोड ऑप्टिमाइज़र: जब कथन पहुँच योग्य न हो
- कोड Generator: जब मेमोरी भर जाती है या उचित रजिस्टर आवंटित नहीं होते हैं
- प्रतीक सारणी: एकाधिक घोषित पहचानकर्ताओं की त्रुटि
सबसे आम त्रुटियाँ हैं स्कैनिंग में अमान्य वर्ण अनुक्रम, प्रकार में अमान्य टोकन अनुक्रम, स्कोप त्रुटि, और अर्थ विश्लेषण में पार्सिंग।
त्रुटि उपरोक्त किसी भी चरण में आ सकती है। त्रुटियाँ मिलने के बाद, चरण को संकलन प्रक्रिया जारी रखने के लिए त्रुटियों से निपटना होगा। इन त्रुटियों को त्रुटि हैंडलर को रिपोर्ट करने की आवश्यकता होती है जो संकलन प्रक्रिया को निष्पादित करने के लिए त्रुटि को संभालता है। आम तौर पर, त्रुटियों को संदेश के रूप में रिपोर्ट किया जाता है।
सारांश
- कंपाइलर विभिन्न चरणों में कार्य करता है, प्रत्येक चरण स्रोत प्रोग्राम को एक प्रस्तुति से दूसरे में रूपांतरित करता है
- छह चरण कंपाइलर डिज़ाइन हैं १) लेक्सिकल विश्लेषण २) वाक्यविन्यास विश्लेषण ३) अर्थ विश्लेषण ४) इंटरमीडिएट कोड जनरेटर ५) कोड अनुकूलक ६) कोड Generator
- लेक्सिकल विश्लेषण वह पहला चरण है जब कंपाइलर स्रोत कोड को स्कैन करता है
- वाक्यविन्यास विश्लेषण का तात्पर्य पाठ में संरचना की खोज करना है
- अर्थगत विश्लेषण कोड की अर्थगत संगति की जांच करता है
- एक बार जब अर्थगत विश्लेषण चरण पूरा हो जाता है, तो कंपाइलर लक्ष्य मशीन के लिए मध्यवर्ती कोड उत्पन्न करता है
- कोड अनुकूलन चरण अनावश्यक कोड लाइन को हटाता है और कथनों के अनुक्रम को व्यवस्थित करता है
- कोड जनरेशन चरण, कोड अनुकूलन चरण से इनपुट प्राप्त करता है और परिणामस्वरूप पेज कोड या ऑब्जेक्ट कोड तैयार करता है
- प्रतीक तालिका में प्रत्येक पहचानकर्ता के लिए एक रिकॉर्ड होता है जिसमें पहचानकर्ता की विशेषताओं के लिए फ़ील्ड होते हैं
- त्रुटि प्रबंधन रूटीन कई चरणों के दौरान त्रुटि और रिपोर्ट को संभालता है