सारांश
यह पाठ समझाता है कि प्रोग्राम क्या है और कंपाइलर क्या करता है: मशीन मेमोरी में रखी संख्याओं पर केवल प्राथमिक संक्रियाएँ करती है, और स्रोत कोड को चलाने से पहले मशीन कोड में अनूदित करना पड़ता है। दो फ़ाइलों वाले एक प्रोग्राम के सहारे यह पाठ C++ में इस अनुवाद के तीन चरणों (प्रीप्रोसेसिंग, कंपाइलेशन और लिंकिंग) से होकर गुज़रता है, और हर तरह की एक त्रुटि के साथ यह अलग करता है कि कंपाइल करते समय क्या होता है और चलाते समय क्या। यह कंपाइल्ड भाषाओं की तुलना इंटरप्रेटेड भाषाओं से करता है, C++23 और C++26 मानकों तक C++ के इतिहास का सार देता है, और स्पष्ट करता है कि यह पाठ्यक्रम कौन-सी C++ सिखाता है।
अधिगम उद्देश्य
- एक आरेख की सहायता से स्रोत फ़ाइल से एक्ज़ीक्यूटेबल फ़ाइल तक का मार्ग समझाना: प्रीप्रोसेसिंग, कंपाइलेशन और लिंकिंग, इस सहित कि हर चरण में क्या जाता है और उससे क्या निकलता है।
- किसी घटना को कंपाइलेशन, लिंकिंग या निष्पादन से संबंधित के रूप में वर्गीकृत करना, जैसे वाक्य-रचना की त्रुटि, किसी फ़ंक्शन का अभाव या शून्य से भाग।
- कंपाइल्ड भाषा की तुलना इंटरप्रेटेड भाषा से इस दृष्टि से करना कि त्रुटियाँ किस क्षण पकड़ी जाती हैं और प्रोग्राम लिखने वाला मशीन का कितना हिस्सा देखता है।
- भाषा के मानकों को समय में स्थापित करना और समझाना कि पाठ्यक्रम C++23 का उपयोग क्यों करता है।
प्रोग्राम क्या है
प्रोग्राम निर्देशों का एक अनुक्रम है जिसे कोई मशीन कुछ आँकड़ों को कुछ परिणामों में बदलने के लिए चला सकती है। पूर्ववर्ती पाठ, समस्या से एल्गोरिदम तक, में देखा गया कि प्रोग्राम से पहले एल्गोरिदम होता है, यानी समस्या को हल करने वाली विधि, जो इस तरह लिखी जाती है कि कोई व्यक्ति उसका पालन कर सके। प्रोग्राम वही विधि है जो एक मशीन के लिए लिखी गई है, और मशीन न वाक्य समझती है न इरादे, बल्कि केवल प्राथमिक आदेश: किसी संख्या को मेमोरी के एक स्थान से दूसरे स्थान पर कॉपी करना, दो संख्याएँ जोड़ना, उनकी तुलना करना, परिणाम के अनुसार किसी दूसरे निर्देश पर कूद जाना।
कंप्यूटर की मेमोरी क्रमांकित खानों की एक लंबी पंक्ति है, जिसके हर खाने में 0 से 255 तक की एक संख्या होती है (एक बाइट)। मशीन जो कुछ भी सँभालती है, वह सब वहाँ संख्याओं के रूप में कूटबद्ध होता है: आँकड़े भी और स्वयं निर्देश भी। यदि ऐसा है, तो एक्ज़ीक्यूटेबल प्रोग्राम संख्याओं का एक अनुक्रम है जिसे प्रोसेसर आदेशों के रूप में पढ़ता है, यानी मशीन कोड, और यह प्रोसेसर पर निर्भर करता है: डेस्कटॉप कंप्यूटरों में आम x86-64 परिवार के प्रोसेसर और फ़ोनों तथा हाल के Mac में आम ARM प्रोसेसर एक जैसी संख्याएँ नहीं समझते।
आज कोई भी मशीन कोड में नहीं लिखता। लिखा जाता है किसी उच्च-स्तरीय भाषा में, जैसे C++, जिसके निर्देश गणितीय संकेतन जैसे दिखते हैं, और वह भी एक टेक्स्ट फ़ाइल में जिसे स्रोत कोड (या केवल स्रोत) कहते हैं। इससे यह निष्कर्ष निकलता है कि एक अनुवादक चाहिए जो स्रोत से उसके तुल्य मशीन कोड बनाए: C++ में यह कंपाइलर है।
यह C++ का एक पूरा प्रोग्राम है। इसे अभी समझने की ज़रूरत नहीं: इसकी हर पंक्ति पाठ 1.5 में समझाई जाएगी। इतना देखना काफ़ी है कि यह टेक्स्ट है, इसे पढ़ा जा सकता है, और इसके नीचे वह दिखता है जो इसने चलते समय लिखा।
// पाठ 1.5 में पंक्ति-दर-पंक्ति समझाया जाएगा।#include <print>int main(){ std::println("नमस्ते, दुनिया"); std::println("2 + 3 = {}", 2 + 3);}नमस्ते, दुनिया2 + 3 = 5अनुवाद का दूसरा छोर देखने के लिए, एक ऐसे फ़ंक्शन पर विचार करें जो केवल दो पूर्णांक जोड़ता है (फ़ंक्शनों का अध्ययन इकाई 5 में होगा)। यह पूरा प्रोग्राम नहीं है, क्योंकि इसमें main नहीं है, वह बिंदु जहाँ से निष्पादन शुरू होता है, फिर भी कंपाइलर इसे अकेले अनूदित कर सकता है।
int add(int a, int b){ return a + b;}प्रोग्राम objdump वह मशीन कोड दिखाता है जो GCC 15 ने Linux वाले एक x86-64 कंप्यूटर पर इस फ़ंक्शन के लिए बनाया: हर पंक्ति में निर्देश का स्थान, हेक्साडेसिमल में उसके बाइट और उसका पठनीय नाम।
$ g++ -std=c++23 -O1 -c add.cpp$ objdump -d add.o0000000000000000 <_Z3addii>: 0: f3 0f 1e fa endbr64 4: 8d 04 37 lea (%rdi,%rsi,1),%eax 7: c3 retपूर्णांकों का जोड़ आठ बाइट तक सिमट गया। पहला निर्देश, endbr64, सुरक्षा का एक चिह्न है जो कुछ भी परिकलित नहीं करता; दूसरा, lea, उन दो संख्याओं को जोड़ता है जो फ़ंक्शन को प्रोसेसर के दो रजिस्टरों (%rdi और %rsi) में मिलीं, और परिणाम एक तीसरे रजिस्टर (%eax) में रखता है; तीसरा, ret, उस बिंदु पर लौटता है जहाँ से फ़ंक्शन को कॉल किया गया था। नाम _Z3addii वह रूप है जिसमें कंपाइलर “दो int पैरामीटर वाला फ़ंक्शन add” को कूटबद्ध करता है।
उदाहरण से दो बातें निकलती हैं। पहली: मशीन कोड में न नाम a और b बचते हैं, न इंडेंटेशन, न टिप्पणियाँ; ये सब स्रोत पढ़ने वाले के लिए थे, और कंपाइलर ने इनका उपयोग यह तय करने में किया कि कौन-से निर्देश लिखे जाएँ। दूसरी: C++ में प्रोग्राम लिखने वाला जो लिखता है, वह बिना किसी मध्यस्थ के गिने-चुने निर्देशों में अनूदित होता है; मशीन से यही निकटता C++ की दक्षता का कारण है और, जैसा पाठ्यक्रम में दिखेगा, इसके कुछ खतरों का भी।
सामग्री लोड हो रही है…