कंपाइलर डिज़ाइन क्या है? प्रकार, निर्माण उपकरण, उदाहरण

⚡ स्मार्ट सारांश

कंपाइलर के चरण उन छह चरणों का वर्णन करते हैं जो स्रोत कोड को मशीन कोड में परिवर्तित करते हैं: शाब्दिक विश्लेषण, वाक्यविन्यास विश्लेषण, अर्थ संबंधी विश्लेषण, मध्यवर्ती कोड निर्माण, कोड अनुकूलन और कोड निर्माण, जो प्रतीक तालिका प्रबंधन और त्रुटि प्रबंधन द्वारा समर्थित हैं।

  • 🔤 शाब्दिक विश्लेषण: स्कैनर अक्षरों को टोकन में समूहित करता है और उन्हें प्रतीक तालिका में रिकॉर्ड करता है।
  • 🌳 वाक्यविन्यास विश्लेषण: पार्सर व्याकरण की जाँच करता है और टोकन से एक पदानुक्रमित पार्स ट्री बनाता है।
  • ✔️ अर्थगत विश्लेषण: इस चरण में सिंटैक्स ट्री का उपयोग करके टाइप कम्पैटिबिलिटी और अर्थ की पुष्टि की जाती है।
  • ⚙️ Code जनरेशन: मध्यवर्ती कोड उत्पन्न किया जाता है, अनुकूलित किया जाता है, और अंत में लक्ष्य मशीन कोड में अनुवादित किया जाता है।
  • ???? सहायता दिनचर्या: एक सिंबल टेबल और एक एरर-हैंडलिंग रूटीन संकलन के प्रत्येक चरण के साथ परस्पर क्रिया करते हैं।

उदाहरण सहित कंपाइलर के चरण: संकलन प्रक्रिया और चरण

कंपाइलर डिजाइन के चरण क्या हैं?

A संकलक कंपाइलर कई चरणों में काम करता है, और प्रत्येक चरण सोर्स प्रोग्राम को एक रूप से दूसरे रूप में बदलता है। हर चरण अपने पिछले चरण से इनपुट लेता है और उसका आउटपुट अगले चरण को देता है। कंपाइलर में 6 चरण होते हैं। इनमें से प्रत्येक चरण हाई-लेवल लैंग्वेज को मशीन कोड में बदलने में मदद करता है। कंपाइलर के चरण इस प्रकार हैं:

  1. शाब्दिक विश्लेषण
  2. सिंटेक्स विश्लेषण
  3. शब्दार्थ विश्लेषण
  4. मध्यवर्ती कोड जनरेटर
  5. Code अनुकूलक
  6. Code जनक

कंपाइलर के चरण

कंपाइलर के चरण

इन सभी चरणों में सोर्स कोड को टोकन में विभाजित करके, पार्स ट्री बनाकर और विभिन्न चरणों के माध्यम से सोर्स कोड को अनुकूलित करके परिवर्तित किया जाता है।

चरण 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: मध्यवर्ती Code पीढ़ी

एक बार सिमेंटिक विश्लेषण चरण पूरा हो जाने के बाद, कंपाइलर लक्ष्य मशीन के लिए मध्यवर्ती कोड उत्पन्न करता है। यह किसी निरपेक्ष प्रोग्राम का प्रतिनिधित्व करता है।tracटी मशीन।

इंटरमीडिएट कोड उच्च-स्तरीय और मशीन-स्तरीय भाषा के बीच का कोड होता है। इस इंटरमीडिएट कोड को इस प्रकार उत्पन्न किया जाना चाहिए जिससे इसे लक्ष्य मशीन कोड में आसानी से अनुवादित किया जा सके।

मध्यवर्ती के कार्य Code पीढ़ी:

  • इसे स्रोत प्रोग्राम के सिमेंटिक प्रतिनिधित्व से उत्पन्न किया जाना चाहिए।
  • इसमें अनुवाद की प्रक्रिया के दौरान गणना किए गए मान संग्रहित होते हैं।
  • यह आपको मध्यवर्ती कोड को लक्ष्य भाषा में अनुवाद करने में मदद करता है।
  • यह आपको स्रोत भाषा के वरीयता क्रम को बनाए रखने की अनुमति देता है।
  • इसमें निर्देश के ऑपरेंड की सही संख्या होती है।

उदाहरण

उदाहरण के लिए:

total = count + rate * 5

एड्रेस कोड विधि की सहायता से मध्यवर्ती कोड इस प्रकार है:

t1 := int_to_float(5)
t2 := rate * t1
t3 := count + t2
total := t3

चरण 5: Code इष्टतमीकरण

अगला चरण मध्यवर्ती कोड का अनुकूलन है। इस चरण में अनावश्यक कोड पंक्तियों को हटाया जाता है और संसाधनों की बर्बादी किए बिना प्रोग्राम के निष्पादन को गति देने के लिए कथनों के क्रम को व्यवस्थित किया जाता है। इस चरण का मुख्य लक्ष्य मध्यवर्ती कोड में सुधार करके एक ऐसा कोड तैयार करना है जो तेजी से चले और कम स्थान घेरे।

इस चरण के प्राथमिक कार्य हैं:

  • यह आपको निष्पादन और संकलन गति के बीच संतुलन स्थापित करने में मदद करता है।
  • लक्ष्य प्रोग्राम के चलने के समय में सुधार करता है।
  • यह अभी भी मध्यवर्ती प्रस्तुति में सुव्यवस्थित कोड उत्पन्न करता है।
  • अप्राप्य कोड को हटाना और अप्रयुक्त चरों से छुटकारा पाना।
  • लूप से उन कथनों को हटाना जिनमें कोई बदलाव नहीं हुआ है।

उदाहरण: निम्नलिखित कोड पर विचार करें:

a = intofloat(10)
b = c * a
d = e + b
f = d

बन सकता है:

b = c * 10.0
f = e + b

चरण 6: Code पीढ़ी

Code जनरेशन कंपाइलर का अंतिम चरण है। यह कोड ऑप्टिमाइज़ेशन चरण से इनपुट प्राप्त करता है और परिणामस्वरूप पेज कोड या ऑब्जेक्ट कोड उत्पन्न करता है। इस चरण का उद्देश्य स्टोरेज आवंटित करना और रिलोकेटेबल मशीन कोड उत्पन्न करना है।

यह वेरिएबल्स के लिए मेमोरी लोकेशन भी आवंटित करता है। इंटरमीडिएट कोड में दिए गए निर्देशों को मशीन निर्देशों में परिवर्तित किया जाता है। इस चरण में ऑप्टिमाइज़्ड या इंटरमीडिएट कोड को लक्ष्य भाषा में परिवर्तित किया जाता है।

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

उदाहरण

a = b + 60.0 को संभवतः रजिस्टरों में इस प्रकार अनुवादित किया जा सकता है:

MOVF a, R1
MULF #60.0, R2
ADDF R1, R2

प्रतीक तालिका प्रबंधन

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

त्रुटि प्रबंधन रूटीन

कंपाइलर डिजाइन प्रक्रिया में, नीचे दिए गए सभी चरणों में त्रुटियां हो सकती हैं:

  • शब्द विश्लेषक: गलत वर्तनी वाले टोकन।
  • सिंटैक्स विश्लेषक: कोष्ठक छूट गया है।
  • मध्यवर्ती कोड जनरेटर: किसी ऑपरेटर के लिए मेल न खाने वाले ऑपरेंड।
  • Code अनुकूलक: जब स्टेटमेंट तक पहुंचा न जा सके।
  • Code Generator: जब मेमोरी भर जाती है या उचित रजिस्टर आवंटित नहीं किए जाते हैं।
  • प्रतीक सारणी: एकाधिक घोषित पहचानकर्ताओं की त्रुटि।

स्कैनिंग में सबसे आम त्रुटियां अमान्य वर्ण अनुक्रम, टाइपिंग में अमान्य टोकन अनुक्रम, स्कोप त्रुटि और सिमेंटिक विश्लेषण में पार्सिंग संबंधी त्रुटियां हैं।

यह त्रुटि उपरोक्त किसी भी चरण में आ सकती है। त्रुटियाँ मिलने के बाद, संकलन प्रक्रिया को जारी रखने के लिए चरण को त्रुटियों को दूर करना आवश्यक होता है। इन त्रुटियों की सूचना त्रुटि हैंडलर को दी जानी चाहिए, जो संकलन प्रक्रिया को पूरा करने के लिए त्रुटि को संभालता है। सामान्यतः, त्रुटियों की सूचना संदेश के रूप में दी जाती है।

अक्सर पूछे जाने वाले प्रश्न

जी हां। एआई सहायक प्रत्येक चरण की व्याख्या कर सकते हैं। tracउदाहरण के लिए, सैंपल कोड को टोकन और पार्स ट्री में परिवर्तित होते हुए दिखाएं और सिंटैक्स या सिमेंटिक त्रुटि कहाँ उत्पन्न होती है, यह इंगित करें। ये अध्ययन में सहायक होते हैं, लेकिन स्पष्टीकरणों को पाठ्यक्रम सामग्री से सत्यापित करें।

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

फ्रंट एंड शाब्दिक, वाक्यविन्यास और अर्थ संबंधी विश्लेषण के साथ-साथ मध्यवर्ती कोड को संभालता है और स्रोत भाषा पर निर्भर करता है। बैक एंड अनुकूलन और कोड जनरेशन को संभालता है और लक्ष्य मशीन पर निर्भर करता है। यह विभाजन रीटारगेटिंग को सरल बनाता है।

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

इस पोस्ट को संक्षेप में इस प्रकार लिखें: