निम्न-स्तरीय भाषाएँ: मशीन कोड और असेंबली
मशीन कोड ही वह भाषा है जिसे CPU चला सकता है। हर निर्देश एक बाइनरी पैटर्न है, जैसे 10110001। इसका एक भाग बताता है क्या करना है (ऑपकोड), दूसरा भाग किस पर (ऑपरेंड)।
असेंबली भाषा बाइनरी की जगह छोटे याद रखने वाले शब्द, न्यूमॉनिक (mnemonics), इस्तेमाल करती है: LOAD, ADD, STORE। हर असेंबली निर्देश एक मशीन निर्देश के बराबर है (1 : 1)।
निम्न-स्तरीय कोड क्यों?
- हार्डवेयर, मेमोरी और रजिस्टर पर सीधा नियंत्रण।
- छोटे, तेज़ प्रोग्राम: डिवाइस ड्राइवर, एम्बेडेड सिस्टम (वॉशिंग मशीन, कार के पुर्ज़े) और समय-संवेदी कोड के लिए।
कमियाँ
- पढ़ना, लिखना और ग़लती ढूँढना कठिन।
- एक तरह के प्रोसेसर से बँधा: एक CPU परिवार का कोड दूसरे पर नहीं चलता।
उच्च-स्तरीय भाषाएँ
उच्च-स्तरीय भाषाएँ (Python, Java, C#, C, JavaScript) अंग्रेज़ी जैसे शब्द और गणित के चिह्न इस्तेमाल करती हैं। total = price * 3 जैसी एक पंक्ति कई मशीन निर्देश बन सकती है।
| उच्च-स्तरीय | निम्न-स्तरीय | |
|---|---|---|
| लोगों के लिए आसान? | हाँ | नहीं |
| अलग CPU पर चले? | हाँ, अनुवाद के बाद (पोर्टेबल) | नहीं, एक CPU परिवार |
| हार्डवेयर पर नियंत्रण | कम | सीधा |
| अनुवाद चाहिए? | हाँ (कंपाइलर या इंटरप्रेटर) | असेंबली: हाँ (असेंबलर); मशीन कोड: नहीं |
आज ज़्यादातर सॉफ़्टवेयर उच्च-स्तरीय भाषाओं में लिखा जाता है, क्योंकि प्रोग्रामर तेज़ी से और कम ग़लतियों के साथ काम करते हैं।
अनुवादक: असेंबलर, कंपाइलर और इंटरप्रेटर
असेंबलर
असेंबली भाषा को मशीन कोड में बदलता है, एक निर्देश के बदले एक।
कंपाइलर
- पूरे उच्च-स्तरीय प्रोग्राम को एक साथ मशीन कोड में बदलता है (एक्ज़ीक्यूटेबल फ़ाइल, जैसे .exe या ऐप)।
- सारी ग़लतियाँ आख़िर में एक साथ बताता है; ठीक होने तक कुछ नहीं चलता।
- एक्ज़ीक्यूटेबल तेज़ चलती है और सोर्स कोड दिए बिना बाँटी जा सकती है।
- पर हर बदलाव के बाद फिर कंपाइल करना पड़ता है, और फ़ाइल उसी तरह की मशीन पर चलती है जिसके लिए बनी।
इंटरप्रेटर
- एक बार में एक पंक्ति अनुवाद करके तुरंत चलाता है।
- पहली ग़लती पर रुककर पंक्ति दिखाता है: लिखते और जाँचते समय काम का।
- कोई एक्ज़ीक्यूटेबल नहीं बनती, इसलिए प्रोग्राम धीमा चलता है और उपयोगकर्ता को इंटरप्रेटर और सोर्स कोड दोनों चाहिए।
बाइटकोड और वर्चुअल मशीन
कुछ भाषाएँ दोनों तरीके मिलाती हैं। Java (और अंदर से Python भी) पहले सोर्स कोड को बाइटकोड में बदलती हैं: बीच का सरल कोड जो किसी एक CPU से बँधा नहीं। फिर हर डिवाइस पर एक वर्चुअल मशीन (जैसे Java Virtual Machine) बाइटकोड चलाती है। इससे पोर्टेबिलिटी मिलती है: वही बाइटकोड Windows, Android या Linux पर चलता है, बस वहाँ वर्चुअल मशीन होनी चाहिए।
खुद आज़माइए: इंटरप्रेटर बनिए
दोस्त के लिए 5 पंक्तियों का "प्रोग्राम" लिखिए (1. खड़े हो। 2. दो ताली। 3. कूदोो। 4. बैठो। 5. मुस्कुराओ)। पहले इंटरप्रेटर बनिए: एक-एक पंक्ति पढ़कर कीजिए और वर्तनी की ग़लती पर रुकिए। फिर कंपाइलर बनिए: पहले पाँचों पंक्तियाँ पढ़िए, सारी ग़लतियों की सूची बनाइए और ठीक होने के बाद ही कीजिए। किस तरीके से ग़लती जल्दी मिली? ठीक होने के बाद कौन तेज़ चला?
मुख्य सूत्र और परिभाषाएँ
- मशीन कोड = बाइनरी निर्देश जिन्हें CPU सीधे चलाता है
- असेंबली → असेंबलर → मशीन कोड (1 : 1)
- उच्च-स्तरीय → कंपाइलर → एक्ज़ीक्यूटेबल (पूरा प्रोग्राम, फिर चलाना)
- उच्च-स्तरीय → इंटरप्रेटर → पंक्ति-दर-पंक्ति चलाना
- सोर्स → बाइटकोड → वर्चुअल मशीन (पोर्टेबल)
हल किए गए उदाहरण
1. एक कंपनी गेम बेचती है पर ग्राहकों को सोर्स कोड नहीं दिखाना चाहती। कौन-सा अनुवादक लें?
कंपाइलर। यह एक्ज़ीक्यूटेबल फ़ाइल बनाता है जो सोर्स कोड के बिना बाँटी जा सकती है और तेज़ चलती है।
2. एक विद्यार्थी प्रोग्रामिंग सीख रहा है और ग़लतियाँ जल्दी ढूँढना चाहता है। कौन-सा अनुवादक बेहतर है?
इंटरप्रेटर। यह एक-एक पंक्ति चलाता है और पहली ग़लती पर रुककर जगह दिखाता है, तो तुरंत सुधारकर फिर चला सकते हैं।
3. डिवाइस ड्राइवर असेंबली में लिखने का एक कारण बताइए।
असेंबली से हार्डवेयर और रजिस्टर पर सीधा नियंत्रण मिलता है और कोड छोटा व तेज़ बनता है, जो ड्राइवर को चाहिए।
4. एक ही Java बाइटकोड अलग CPU वाले फ़ोन और लैपटॉप पर कैसे चलता है?
बाइटकोड किसी एक CPU का मशीन कोड नहीं है। हर डिवाइस की अपनी Java Virtual Machine उसे अपने मशीन कोड में बदलती है।
आम गलतियाँ
- कहना कि कंपाइलर प्रोग्राम पंक्ति-दर-पंक्ति चलाता है। वह इंटरप्रेटर करता है; कंपाइलर पहले पूरा प्रोग्राम अनुवाद करता है।
- सोचना कि उच्च-स्तरीय कोड बिना अनुवाद CPU पर चल सकता है। सीधे सिर्फ़ मशीन कोड चलता है।
- असेंबलर और कंपाइलर को मिलाना: असेंबलर असेंबली का अनुवाद करता है, उच्च-स्तरीय कोड का नहीं।
- कहना कि निम्न-स्तरीय कोड पोर्टेबल है। वह एक प्रोसेसर परिवार से बँधा है; पोर्टेबल उच्च-स्तरीय कोड है।