एक कोड संकलक क्या है और यह क्या करता है?

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

जब आप कोड संकलित करते हैं तो क्या होता है?

एक कंपाइलर की जटिलता भाषा के सिंटैक्स और कितने अमूर्त पर निर्भर करती है वह प्रोग्रामिंग भाषा प्रदान करता है। C ++ या C # के लिए संकलक की तुलना में C संकलक बहुत सरल है।

लेक्सिकल विश्लेषण

संकलन करते समय, संकलक पहले स्रोत कोड फ़ाइल से वर्णों की एक धारा पढ़ता है और शाब्दिक टोकन की एक धारा उत्पन्न करता है। उदाहरण के लिए, C ++ कोड:

int C = (A * B) +10;

इन टोकन के रूप में विश्लेषण किया जा सकता है:

  • "int" टाइप करें
  • चर "C"
  • बराबरी
  • leftbracket
  • चर "ए"
  • बार
  • चर "बी"
  • rightbracket
  • प्लस
  • शाब्दिक "10"

सिंथेटिक विश्लेषण

लेक्सिकल आउटपुट संकलक के सिंटैक्टिकल एनालाइज़र भाग में जाता है, जो यह तय करने के लिए व्याकरण के नियमों का उपयोग करता है कि इनपुट मान्य है या नहीं। जब तक

instagram viewer
चर ए और बी पहले घोषित थे और दायरे में थे, संकलक कह सकते हैं:

  • 'ए': अघोषित पहचानकर्ता।

यदि उन्हें घोषित किया गया था, लेकिन शुरू में नहीं। संकलक एक चेतावनी जारी करता है:

  • स्थानीय वैरिएबल 'ए' का उपयोग बिना आरंभ किए किया जाता है।

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

एक पास या दो?

कुछ प्रोग्रामिंग भाषाएं लिखी जाती हैं इसलिए एक कंपाइलर केवल एक बार स्रोत कोड पढ़ सकता है और मशीन कोड उत्पन्न कर सकता है। पास्कल ऐसी ही एक भाषा है। अनेक compilers कम से कम दो पास की आवश्यकता है। कभी-कभी, यह आगे की घोषणाओं के कारण होता है कार्यों या कक्षाएं।

सी ++ में, एक वर्ग घोषित किया जा सकता है लेकिन बाद तक परिभाषित नहीं किया जाता है। कंपाइलर यह पता लगाने में असमर्थ है कि कक्षा के शरीर को संकलित करने तक कक्षा को कितनी मेमोरी की आवश्यकता है। यह सही मशीन कोड बनाने से पहले स्रोत कोड को फिर से पढ़ना चाहिए।

मशीन कोड बनाना

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

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

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

कोड जनरेशन चुनौतीपूर्ण है

कंपाइलर लेखक एक कोड जनरेटर लिखते समय चुनौतियों का सामना करता है। कई प्रोसेसर उपयोग करके प्रसंस्करण को गति देते हैं

  • निर्देश पाइपलाइनिंग
  • अंदर का कैश.

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

कैश और कतार

अधिकांश सीपीयू में एक पूर्व-भ्रूण कतार होती है जहां सीपीयू उन्हें निष्पादित करने से पहले कैश में निर्देश पढ़ता है। यदि एक सशर्त शाखा होती है, तो सीपीयू को कतार को फिर से लोड करना पड़ता है। इसे कम करने के लिए कोड जनरेट किया जाना चाहिए।

कई सीपीयू के अलग-अलग भाग होते हैं:

  • पूर्णांक अंकगणित (पूरी संख्या)
  • फ्लोटिंग पॉइंट अंकगणित (आंशिक संख्या)

ये ऑपरेशन अक्सर गति बढ़ाने के समानांतर चल सकते हैं।

कंपाइलर आमतौर पर ऑब्जेक्ट फ़ाइलों में मशीन कोड उत्पन्न करते हैं जो तब होते हैं जुड़े हुए एक साथ एक लिंकर कार्यक्रम द्वारा।