**Compiler क्या है?**
---------------------

किसी बहु-भाषी एवं बहु-लक्ष्यी (multi-target) कम्पाइलर की रचना का ब्लाक-आरेख
कंपाइलर एक कंप्यूटर प्रोग्राम या सॉफ्टवेयर प्रोग्राम है जो source program को machine program में अनुवादित करता है।

इस प्रोग्राम का उपयोग मशीन कोड या कंप्यूटर भाषा को जेनरेट करने के लिए किया जाता है यानि high-level programming langue को low-level programming langue मे कन्वर्ट करता है। जो कंप्यूटर सिस्टम को पीछे से निष्पादित या चलाता है।

इसका उपयोग source code को परिवर्तित करने के लिए किया जाता है जो कई अलग-अलग प्रोग्रामिंग भाषाओं, जैसे सी, सी++ और जावा स्क्रिप्ट में लिखा जाता है।

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

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

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

कंपाइलर्स का उपयोग
------------------

एक computer खुदसे कोई काम नही कर सकता जब तक न उसे कोई instructions न मिले। Programming ही है जो एक कंप्यूटर को निर्देश देता है कि उसे क्या करना है।

कंप्यूटर Human langue को नही समझता, उसे समझाने के लिए उसीकि भाषा मे निर्देश देना होता है जिसे हम Machine language के तौरपर जानते है।

जैसेकि Java, C++, Python आदि और ये सभी high-level machine language होते है जिन्है programmer द्बारा डेवलप किया जाता है। लेकिन कंप्यूटर इन जटिल भाषाओ को समझने मे नकाम हो जाते है क्योकि एक कंप्यूटर केवल bytecode को ही आसानी से समझ पाता है और वही से Compiler का भुमिका शुरु होता।

Compiler दरसल एक interpreter कि तरह काम करता है जो प्रोग्रामिंग भाषा को मशीनि भाषा में परिवर्तित करता है ताकि कंप्यूटर उन निर्देशो को ठिक से समझ सके कि उसे करना क्या है।

कंपाइलर के विभिन्न प्रकार
-------------------------

कंपाइलर्स को मुख्य रूप से तीन प्रकारों में वर्गीकृत किया गया है, लेकिन डिज़ाइन और कार्यक्षमताओ के आधार पर वे विभिन्न प्रकार के होते है:

* Single Pass Compilers
* Two Pass Compilers
* Multi pass Compilers

इसे बेहतर ढंग से समझने के लिए यहां इसकी कुछ सामान्य प्रकार के बारे मे दिया गया हैं:

**1. Single Pass Compiler:** ये एक ही बार में पुरी source code को मशीन कोड में translate करने का काम करता हैं। ये वाक्यविन्यास से लेकर, सिमेंटिक विश्लेषण, कोड जनरेशन जैसे काम तेज़ी से करते है।

लेकिन इसमे त्रुटियो के जाँच करने कि क्षमता तुलनात्वक कम होता हैं क्योकि इसमे source code का गहराई से analyze नही किया जाता।

**2. Two Pass Compiler:** इसमे analyze की प्रक्रिया दो चरणों में विभाजित होता है और हर एक चरण एक pass होता है। पहले पास में, यह source code का केवल प्राथमिक विश्लेषण किया जाता है, और डेटा संरचनाओं और प्रतीक तालिकाओं का निर्माण किया जाता है।

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

**3. Multi-pass compiler:** प्रोग्राम को कार्यात्मक बनाने के लिए source code को कई अलग अलग अनुक्रमों में व्याख्या किया जाता है। प्रत्येक व्याख्याओ का एक विशिष्ट कार्य होता है और आउटपुट रेजल्टस को अगली प्रक्रिया के लिए इनपुट डेटा के रूप में उपयोग करता है।

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

**4. Cross Compiler:** एक क्रॉस-कंपाइलर एक प्लेटफ़ॉर्म या आर्किटेक्चर पर चलता है लेकिन एक अलग प्लेटफ़ॉर्म या आर्किटेक्चर के लिए कोड जेनरट करता है।

इसका उपयोग आमतौर पर एम्बेडेड सिस्टम के लिए सॉफ़्टवेयर विकसित करने या किसी हार्डवेयर प्लेटफ़ॉर्म को टारगेट करने के लिए किया जाता है।

क्रॉस कंपाइलर डेवलपर्स को एक मशीन पर कोड लिखने और इसे दूसरे के लिए संकलित करने में उपियोगी बनाता है, जिससे उन्है पोर्टेबिलिटी और अनुकूलता की सुविधा मिलती है।

**5. Just-In-Time Compilers(JIT):** यह निष्पादित होने से ठीक पहले, यानि रन टाइम (Runtime) पर कोड का अनुवाद करता है। यह प्रोग्राम निष्पादन के दौरान आवश्यकतानुसार मशीन कोड उत्पन्न करता है।

इसका उपयोग आमतौर पर वर्चुअल मशीनों (जैसे, जावा वर्चुअल मशीन, .NET कॉमन लैंग्वेज रनटाइम) में किया जाता है और अनुकूलन के माध्यम से प्रदर्शन में सुधार लाता है।

**6. Ahead-of-Time (AOT) Compilers:** एओटी कंपाइलर, प्रोग्राम निष्पादित होने से पहले कोड का अनुवाद करता हैं और पूरे प्रोग्राम को समय से पहले मशीन कोड में संकलित किया जाता है,

जिसके परिणामस्वरूप एक स्टैंडअलोन निष्पादन होता है। यह खासकर C और C++ जैसी भाषाओं के साथ होता है, और संकलित कोड का एक अलग प्लेटफ़ॉर्म होता है।

**7. Source-to-Source Compilers:** इसे ट्रांसपिलर कंपाइलर के रूप में भी जाना जाता है।ये एक प्रोग्रामिंग भाषा में लिखे गए स्रोत कोड को लेते हैं और दूसरी समकक्ष भाषा बाले कोड में अनुवाद करते हैं।

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

**8. Optimizing Compilers:** ये जेनरेट किए गए मशीन कोड की दक्षता में सुधार लाने का काम करता हैं। वे कोड के प्रदर्शन को वहतर करने के लिए विभिन्न अनुकूलन तकनीकों का का उपयोग करता हैं, जैसेकि लूप अनरोलिंग, इनलाइनिंग आदि ।

कंपाइलर कैसे काम करता है?
-------------------------

कंपाइलर एक प्रोग्राम है जो प्रोग्रामिंग भाषा में लिखे जाने बाले source code को मशीनी कोड में बदल देता है जिसे एक कंप्यूटर आसानी से पढ़ या समझ सकता है और उस हिसाब से वे आगे आपना काम कर सकता है।

संकलन कि यह प्रक्रिया कई अलग-अलग चरणो मे होता हैं, और इसमे अलग-अलग तरीके से source code का विश्लेषण किया जाता है और उन्है कंप्यूटर द्बारा समझे जाने बाले भाषाओ मे परिवर्तन किया जाता है। निचे इनके काम करने के प्रक्रिया के बारे में संक्षेप में बताया गया है:

**1. Lexical Analysis:**

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

2. Syntax Analysis:

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

**3. Semantic Analysis:**

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

**4. Intermediate Code Generation:**

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

**5. Optimization:**

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

**6. Code Generation:**

कोड जनरेशन संकलन का सबसे अंतिम चरण है और इस चरण में, **कंपाइलर** intermediate code को मशीन कोड में परिवर्तित करता है। मशीन कोड एक निम्न-स्तरीय भाषा होता है जिसे कंप्यूटर का प्रोसेसर आसानी से समझ सकता है और निष्पादित कर सकता है।

**अनुभाषक** या **कम्पाइलर** (compiler) एक या अधिक संगणक क्रमादेशों का समुच्चय होता है जो किसी उच्च स्तरीय कम्प्यूटर भाषा में लिखे क्रमादेश( प्रोग्राम) को किसी दूसरी कम्प्यूटर भाषा में बदल देता है। अनुभाषक शब्द प्रयोग प्राय ऐसे क्रमादेशों (प्रोग्रामों ) के लिए होता है जो उच्च स्तरीय भाषा के क्रमादेश को निम्न स्तरीय भाषा के क्रमादेश में बदलते है। जिस कम्प्यूटर भाषा में मूल प्रोग्राम है उसे *स्रोत भाषा* कहते हैं तथा इस प्रोग्राम को *स्रोत कोड* कहते हैं। इसी प्रकार जिस भाषा में स्रोत कोड को बदला जाता है उसे लक्ष्य-भाषा (target language) कहते हैं एवं इस प्रकार प्राप्त कोड को *ऑब्जेक्ट कोड* कहते हैं। ऑब्जेक्ट कोड प्रायः बाइनरी भाषा में होता है जिसे लेकर लिंकर किसी मशीन विशेष पर चलने लायक (executable) मशीन कोड पैदा करता है।

ऐसे कम्प्यूटर-प्रोग्राम जो किसी निम्न-स्तरीय कम्प्यूटर भाषा के प्रोग्राम कोलेकर किसी उच्च-स्तरीय भाषा का प्रोग्राम उत्पन्न करते हैं उन्हें **अग्रभाषक** या **डिकम्पाइलर** (decompiler) कहा जाता है। 

ऐसा प्रोग्राम जो एक उच्च-स्तरीय कम्प्यूटर भाषा को दूसरी उच्च-स्तरीय कम्प्यूटर भाषा में बदलता है उसे *कम्प्यूटर-भाषा अनुवादक* (language translator) कहते हैं।

कम्पाइलर के प्रमुख कार्यकारी भाग
--------------------------------

कम्पाइलर निम्नलिखित कार्य करता है। कुछ कम्पाइलरों में इसमें से कुछ भाग अनुपस्थित भी हो सकते हैं-

* लेक्सिकल विश्लेषण (lexical analysis)
* पार्जिंग (parsing)
* सिमैंटिक विश्लेषण (semantic analysis)
* कोड निर्माण (code generation)
* कोड का इष्टतमीकरण (code optimization)

कम्पाइलर कई चरणों में काम करता है, किन्तु सामान्यतः सभी कम्पाइलरों को तीन मुख्य चरणों से निर्मित माना जा सकता है।

इतिहास
------

* **1952** – आटॉकोड कम्पाइल का विकास, मार्क १ कम्प्यूटर के लिए।

* **1952** – ग्रास हॉपर (Grace Hopper) A-0 प्रोग्रामन भाषा के लिये कम्पाइलर बनाया।

* **1954-1957** – IBM में FORTRAN भाषा का विकास, इसे प्रथम उच्च स्तरीय प्रोग्रामन भाषा माना जाता है। 1957 में इसके लिये कम्पाइलर भी निर्मित कर लिया गया।

* **1959** – COBOL का विकास शुरू किया गया। इसकी डिजाइन पर A-0 और FLOW-MATIC का प्रभाव था। 1960 के दशक के आरम्भिक दिनों में COBOL का कम्पाइलर भी बन गया।

* **1958-1962** – एम आई टी में LISP की डिजाइन हुई।

इन्हें भी देखें
---------------

* कम्पाइलर सूची
* लिंकर (Linker)
* जीसीसी
* असेम्बलर

बाहरी कड़ियाँ
-------------

* The 25 Best Linux Compilers for Modern Developers
* Compiler Research: The Next 50 Years